2.5. /etc/inittab 의 분석

아마 앞절의 내용만 보셔도 자신의 inittab 파일의 대부분은 이해하실 수 있을 겁니다. 이제, 쓸데없을지도 모르지만, 제 inittab 파일을 한줄씩 분석해 보겠습니다.

id:3:initdefault:

이 줄은 디폴트 런레벨을 3으로 지정하는 줄입니다. initdefault 키워드 뒤에는 process 필드가 무시된다고 윗부분에서 설명되어 있지요? ^^; 이 줄에 의해서 부팅한 후에 런레벨 3 으로 커널의 런레벨이 조정됩니다. 만약, 처음에 리눅스를 부팅하면, 바로 X 로 들어가시는 분이라면 이부분이 다음과 같이 되어 있을 겁니다.

id:5:initdefault:[1]

런레벨 5에 대한 설명을 inittab 파일에서 보십시오. X11 이라고 되어 있지요?

그러면, 그 다음줄입니다.

si::sysinit:/etc/rc.d/rc.sysinit[2]

이 라인에는 sysinit 라는 키워드가 action 필드에 지정되었습니다. action 필드에 지정할 수 있는 키워드 중 sysinit 를 찾아보면, 프로세스가 시스템 부팅시에 실행되며, 런레벨은 무시한다는 내용과, 다른 boot 나 bootwait 가 action 필드에 지정된 프로세스들보다 먼저 실행된다는 내용이 있습니다. 즉, 제일 처음 init 프로세스가 실행시키는 명령입니다. 정확히 말하면, start-up 스크립트라고 할 수 있습니다. process 필드에 /etc/rc.d/rc.sysinit 라고 명시되어 있습니다. 다시한번 단순화시켜서 이야기하면, 위에 예시한 inittab 파일을 사용하는 제 리눅스 박스는 전원을 올리면, /etc/rc.d/rc.sysinit [3] 가 실행된다는 것입니다. rc.sysinit 의 내용은 나중에 살펴보기로 하고, 다음줄로 진행하겠습니다.

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

보시고, 짐작하신 바와 같이 각 런레벨별로 지정된 시작 스크립트들입니다. /etc/rc.d/rc 스크립트에 해당 런레벨을 인수로 넘겨주는군요. /etc/rc.d/rc 스크립트의 내용은 나중에 하나씩 분석해 보겠습니다. 각 런레벨 별로 지정된 스크립트는 그 실행이 종료될 때까지 init 프로세스가 진행하지 않고, 기다리라는 의미의 wait 키워드를 action 필드에 지정해 두었군요.

ud::once:/sbin/update

그 다음줄에는 action 필드에 once 키워드가 쓰였습니다. 그래서 각 런레벨별로 한번씩만 실행되는 프로세스입니다. /sbin/update 를 실행하는군요. /sbin/update 는 bdflush 라는 커널 데몬(커널 스레드)을 실행시킵니다. 이 데몬은 버퍼를 갱신한다든지 하는 일을 합니다. 자세한 내용은 man update 를 해 보시면 알 수 있습니다.

ca::ctrlaltdel:/sbin/shutdown -t3 -r now

그 다음으로 나오는 것은 사용자가 콘솔에서 CTRL-ALT-DEL 키의 조합을 눌려서 싱글 유저모드로 들어가거나 혹은 시스템을 셧다운 하려고 할 때 불려지는 프로세스를 정의합니다. /sbin/shutdown -t3 -r now 로 정의했군요. 3초 후에 재부팅하게 됩니다. shutdown 이 재부팅을 수행하기 위해서는 init 프로세스에게 런레벨을 바꾸도록 하라는 시그널을 보내게 됩니다. 런레벨 0은 시스템 halt 에 사용되고, 런레벨 6은 재시작, 1은 싱글유저 모드에 사용됩니다.

재미있는 것으로, 사용자가 (root 사용자일 경우) init 프로세스에게 구체적으로 어떤 런레벨에서 init 를 수행시킬지 커맨드라인에서 명시해 줄 수 있습니다.

/sbin/init N

이라고 명령을 내리면, N 에 명시된 실행레벨로 init 가 진입하게 됩니다.

/sbin/init 6

이라고 하면, init 는 런레벨 6 으로 진입하게 되면서 시스템은 재부팅 되게 됩니다. 다른 System V 계열의 운영체제에서는 이러한 경우를 위해서 특별히 telinit 라는 명령어도 준비해 놓고 있습니다. (리눅스도 마찬가지입니다.)

pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

다음 두줄은 전원에 관계된 것으로, UPS 를 사용하는 분들에게만 해당되는거 같군요.

        1:2345:respawn:/sbin/mingetty tty1
        2:2345:respawn:/sbin/mingetty tty2
        3:2345:respawn:/sbin/mingetty tty3
        4:2345:respawn:/sbin/mingetty tty4
        5:2345:respawn:/sbin/mingetty tty5
        6:2345:respawn:/sbin/mingetty tty6

그리고, 거의 마지막 부분에 붙어 있는 여섯줄, 이 줄은 각 런레벨 2,3,4,5 일 때 실행되는 것으로써, 콘솔을 열고, 응답을 기다리는 부분입니다. 앞서의 모든 초기화 과정이 끝나고 마지막으로 실행되는 부분이죠. 컴을 켰을 때 바로 X 가 시작되는 분들은

x:5:respawn:/etc/X11/prefdm -nodaemon

등과 같이 런레벨 5에만 해당되는 로그온 프로세스가 명시되어 있을 겁니다.

주석

[1]

이렇게 되어 있지 않을 경우는 xdm 혹은 gdm 을 사용하는 경우입니다.

[2]

데비안의 경우는 si::sysinit:/etc/init.d/rcS 로 되어 있습니다.

[3]

당연히 데비안은 /etc/init.d/rcS 이겠죠.