개요
init란?
- init은 root 권한을 가진 첫번째로 실행되는 프로세스로 PID 1번을 갖는다.
- init은 사용자 공간 앱의 부트 순서를 제어하고 이를 실행시키는 역할을 한다.
- init 프로세스를 통해 실행된 유저 앱은 데몬(Daemon)이라고 부른다.
- init 프로세스는 부팅시점부터 종료때까지 시스템의 모든 데몬에 대한 라이프사이클을 제어한다.
- 이러한 Linux의 init 프로그램에는 아래와 같이 3가지 종류가 존재한다.
init 프로그램 종류
- BusyBox
- 매우 낮은 복잡도를 가진 시스템에서 사용하기에 적절하다.
- 실행된 데몬의 로그를 정리하는 기능이 부족하다.
- 1KB 이하의 크기로 동작시킬 수 있는 init 프로그램이다.
- SysVinit와 유사한 형태로 데몬을 관리한다.
- SysVinit
- 중간 정도의 복잡도를 가진 시스템에서 사용하기 적절하다.
- 실행된 데몬의 로그를 정리하는 기능이 부족하다.
- 1KB 가량의 크기로 동작시킬 수 있는 init 프로그램이다.
- BusyBox와 유사한 형태로 데몬을 관리한다.
- Systemd
- 높은 복잡도를 가진 시스템에서 사용하기 적절하다.
- 실행된 데몬의 로그를 정리하는 기능이 매우 풍부하다. (systemd-journald)
- 30MB 이상의 크기로 동작시킬 수 있는 init 프로그램이다. (Desktop Linux에 주로 활용)
- 메모리와 디스크 용량이 충분한 Embedded Linux에서도 많이 사용된다.
- BusyBox와 SysVinit과는 다른 형태로 데몬을 관리한다.
본 페이지에서는 앞서 설명한 세가지 init 프로그램 중 SysVinit에 대해서만 설명한다. 또한, 이 페이지는 임베디드 리눅스를 학습하면서 정리하는 것이므로 Yocto(4.0 LTS)를 기준으로 설명한다.
SysVinit
Yocto 시스템을 통해 빌드된 리눅스 배포판이 init 프로그램으로 SysVinit을 사용하기 위해서는 루트 설정 파일인 build/conf/local.conf의 가장 마지막 줄에 다음과 같이 작성주어야 한다.
INIT_MANAGER = “sysvinit”
# init 프로그램을 BusyBox나 Systemd로 변경할 때에는 아래와 같이 작성한다.
# INIT_MANAGER = “busybox”
# INIT_MANAGER = “Systemd”
SysVinit은 총 8가지의 런레벨을 갖고있다.
필자가 실무를 접할 때에는 0, 5, 6 레벨만 주로 활용했었다.
- S: 일반 런레벨(0~6)과는 다른 부팅 전용 특수 런레벨
- 0: 시스템 종료 시 실행되는 런레벨
- 1~5: 시스템 부팅이 완료된 후 사용자 앱을 실행시키기 위한 런레벨
- 6: 시스템 재시작 시 실행되는 런레벨
사용자 앱을 실행시키기 위한 5가지 런레벨은 Upstream Linux의 경우에는 주로 다음과 같이 할당하여 사용한다.
- 1: 단일 사용자
- 2: 네트워크 구성 요소를 사용하지 않는 다중 사용자
- 3: 네트워크 구성 요소를 사용하는 다중 사용자
- 4: 사용하지 않음
- 5: 그래픽 로그인을 사용하는 다중 사용자 (가장 많이 사용하는 런레벨)
SysVinit에서는 이러한 여러 런레벨을 자유자재로 변경할 수 있으며, 이를 위해 아래와 같은 명령을 활용해 런레벨을 자유자재로 변경가능하다.
# Runlevel 0
$ halt
$ /etc/init.d/rc 0
# Runlevel 1~5
$ /etc/init.d/rc <1~5>
# Runlevel 6
$ reboot
$ /etc/init.d/rc 6
위 명령 예시를 활용하여 리눅스 시스템을 특정 런레벨로 변경하게 되면, init 프로그램(SysVinit)은 해당 런레벨에 해당하는 모든 데몬을 재실행(kill → start)시킨다. 각 런레벨에 해당하는 데몬은 /etc/rc<1~5>.d 디렉터리 하위에 쉘 스크립트 형태로 관리된다.

위 캡쳐는 런레벨 5에 해당하는 데몬들을 관리하기 위한 스크립트 파일들이다. 파일의 형태를 보면 알 수 있듯이, 실제로는 /etc/init.d 하위에 데몬을 종료/실행시키기 위한 스크립트 파일들이 작성되고, 이 파일들을 각 런레벨에 맞춰 링크하는 형식으로 존재한다.
그리고 링크된 파일 이름의 앞에는 S00(K00도 존재함)를 붙이는 것을 알 수 있다. 이는 다음을 의미한다.
- S00
- S는 Start를 의미하며, init 프로세스가 이를 보고 데몬 실행(start) 명령을 내린다.
- 00은 실행 순서를 의미하며, S00이 가장 먼저 실행되고 S99이 가장 늦게 실행된다.
- K00
- K는 Kill을 의미하며, init 프로세스가 이를 보고 데몬 종료(stop) 명령을 내린다.
- 00은 종료 순서를 의미하며, K00이 가장 먼저 종료되고 K99이 가장 늦게 종료된다.
또한, 데몬을 실행시키기 위한 스크립트는 일반적으로 다음과 같은 뼈대를 갖는다.
export와 같은 환경변수도 주로 스크립트에 작성하며, 고객사별로 다르게 환경변수를 관리하기 위해서 configs/ 디렉터리를 추가로 생성하는 경우도 존재한다.
#! /bin/sh
case “$1” in
start)
echo “Start user daemon”
start-stop-daemon -S -n <app-name> -x <app-start-command>
stop)
echo “Kill user daemon”
start-stop-daemon -K -n <app-name>
*)
echo “Usage: $0 {start|stop}”
exit 1
csac
exit 0
스크립트 파일 내용과 같이 특정 런레벨을 실행(halt, reboot, /etc/init.d/rc 등)할 시, 해당하는 런레벨의 데몬 관리 스크립트(/etc/rc<0~6>.d/*)로 접근하여 start 혹은 stop 명령을 내리게 된다.
쉘 스크립트에서 $0은 파일명을 나타내고 $1은 첫번째 인자를 나타낸다.
정리하자면, SysVinit은 특정 유저 앱을 데몬 형태로 실행시키기 위해 다음과 같은 순서를 따른다.
- init 프로그램 실행
- 현재 시스템의 런레벨 확인 (/etc/inittab에서 initdefault가 작성된 줄의 런레벨을 통해서)
- 현재 런레벨에 해당하는 디렉터리로 이동 (/etc/rc<0~6>.d/)
- 디렉터리에 존재하는 모든 스크립트를 실행 (S00 부터 S99까지 순서대로)
- 유저 앱이 백그라운드로 실행되어 데몬 형태로 동작
필자도 Busybox나 SysVinit을 직접적으로 사용을 해본적은 있지만 단순히 데몬을 실행시키기 위한 용도로만 활용했었다. 그러나 이번 계기로 init 프로그램이 무엇인지 다시 한번 알 수 있게 되었고, 리눅스의 init 프로그램에는 어떤 것들이 있는지, 그리고 각 init 프로그램가 어떠한 환경에서 사용하면 되는지, 또한 init 프로그램 중 SysVinit가 어떠한 순서에 따라서 유저 앱을 실행하는지 익힐 수 있게 되었다.
References
임베디드 리눅스 프로그래밍 완전정복 3/e, 13장 시스템구동: init 프로그램
'Linux > Embedded' 카테고리의 다른 글
| 임베디드 리눅스 장치에서의 GDB 디버깅 (0) | 2026.06.16 |
|---|




