대부분의 최신 리눅스 배포판은 Systemd로 init system이 변경되었지만, 나는 아직 데비안 wheezy를 사용하며, 이 시스템은 SysVinit 이라 불리우는 init system을 사용한다.
대표적인 초기 nix계열 simple application들이 그렇듯, SysVinit도 단순한 개념으로 여러 기능을들 껴넣으려고 노력한 흔적이 역역하며, 파일이름으로 실행순서 정하기 / 처다보기도 싫어지는 script 설정들 / 병렬적으로 실행되기 힘들고 파일이 전역변수처럼 관리되기 등등의 단점이 있다.
그럼에도 단순한 개념과, 여러 run-level 필요성등을 잘 충족하여 꽤 장수한 시스템이 되었던것 같다.
1. start_kenel
은 kernel의 main.c에 있는 내용으로, kernel 마지막에 init_process
를 실행함으로써 kernel space에서 user space로 실행 영역이 전환된다.
어떤 프로그램을 최초 실행할지는 kernel parameter에 영향을 받고 여러가지 proc 이름을 가지고 시도를 해보는데, SysVinit 계열의 init process인 /sbin/init도 물론 포함되어 있다.
/sbin/init
은 init.c에 main 함수가 존재하는데, main은 초기설정 후 init_main
을 호출하고 init_main
에서 read_inittab
- start_if_needed
를 호출하여 read_inittab
를 통해 /etc/inittab에 있는 내용을 CHILD 구조체로 로딩한후 spawn하여 실행을 한다.
runlevel script들은 /etc/inittab 에 기록되어있는 /etc/init.d/rc를 0~5번의 argument와 함께 호출하는 구문에서 실행되며, script 형태로 되어있는 /etc/init.d/rc는 /etc/rc[run-level].d/[SK]* 스크립트들을 읽어 실행함으로써 초기 부팅 스크립트들이 수행된다.
/etc/rc[run-level].d/[SK]*
은 /etc/init.d 디렉토리 하위에 있는 스크립트들에 대한 심볼릭 링크인데, /etc/init.d/cron의 소스 일부는 다음과 같다.
#!/bin/bash
# Start/stop the cron daemon.
#
### BEGIN INIT INFO
# Provides: cron
# Required-Start: $remote_fs $syslog $time
# Required-Stop: $remote_fs $syslog $time
# Should-Start: $named slapd autofs ypbind nscd nslcd
# Should-Stop: $named slapd autofs ypbind nscd nslcd
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: Regular background program processing daemon
# Description: cron is a standard UNIX program that runs user-specified
# programs at periodic scheduled times. vixie cron adds a
# number of features to the basic UNIX cron, including better
# security and more powerful configuration options.
### END INIT INFO
test -f /usr/sbin/cron || exit 0
PIDFILE=/var/run/crond.pid
comment에 있는 Default-start 혹은 Default-stop은 약속된 comment이며, update-rc의 default 설정
때 해당 comment의 내용으로 default가 설정된다.
update-rc
혹은 rcconf
는 /etc/init.d에 있는 스크립트들을 /etc/rc[run-level].d/[SK]* 로 심볼릭 링크를 걸어주는 어플리케이션이며 이러한 여러 프로그램들의 수고로 드디어 부팅 스크립트가 수행된다.