'init'에 해당되는 글 1건

  1. 2014.06.06 #1 리눅스 시스템 부팅의 이해 : /sbin/init 프로그램





1. 서론

ㄱ. 리눅스 시스템 부팅 중 데몬 관리용 스크립트들과 배포본별로 제공하는 런레벨 관리자를(/sbin/init, /etc/init.d, /etc/rc*.d) 사용하지 않는 systemd 방식의 기본 init 시스템을 알아보자


2. 본론

ㄱ. 커널의 로딩과정을 살펴보면

1. 커널이 로드되고 나면, 메모리, 프로세서, I/O 등 여러 하드웨어를 초기화하고 설정한다.


2. 압축된 initramfs 이미지를 메모리의 미리 정해진 위치(SD카드 eMMC 등)로부터 읽어서, /sysroot/에 직접 풀고, 모든 필요한 드라이버를 로드함.

- 이는 LVM이나 소프트웨어 RAID와 같은 파일 시스템과 관련된 가상 장치를 초기화함.


3. 그 후, initramfs 프로세스를 마무리하고, 디스크 이미지가 차지했던 메모리를 모두 해제함.

그 뒤 커널은 루트 장치를 생성하여 읽기 전용으로 루트 파티션을 마운트하고 사용되지 않는 메모리를 해제함.

 - 이 시점에서, 커널은 메모리에 로드되어 작동가능하게 되지만, 시스템에 입력을 허용하는 사용자 응용 프로그램이 존재하지 않아 이러한 시스템을 사용하여 할 수 있는 작업은 많지 않음.

 사용자 환경을 설정하기 위해, 커널은 /sbin/init 프로그램을 실행함.


ㄴ. /sbin/init 프로그램

1. /sbin/init 프로그램(init 라고도 부름)은 나머지 부트 프로세스를 주관하며 사용자를 위한 환경을 설정합니다.


2. init 명령어를 시작할 때, 이는 시스템에서 자동으로 시작하는 모든 프로세스의 부모(0번 프로세스) 또는 조부모가 됩니다.

a. 먼저 /etc/rc.d/rc.sysinit 스크립트를 실행하여 환경 경로, 스왑 시작, 파일 시스템 확인, 시스템 초기화에 필요한 다른 단계를 실행합니다.

 예를 들어, 대부분의 시스템에서는 클럭을 사용하므로, rc.sysinit은 하드웨어 클럭을 초기화하기 위해 /etc/sysconfig/clock 설정 파일을 읽습니다.

 다른 예로, 초기화되어야 하는 특정 직렬 포트 프로세스가 있을 경우, rc.sysinit/etc/rc.serial 파일을 싱행합니다.


3. init 명령은 그 후 /etc/event.d 디렉토리에 있는 작업을 실행합니다. 이 디렉토리는 시스템이 각각의 SysV init 런레벨에 따라 어떻게 설정될지를 지정합니다.

- 런레벨은 SysV /etc/rc.d/rc<x>.d/ (여기서 <x>은 런레벨 숫자) 디렉토리에 나열된 서비스들로 정의되는 시스템의 상태 또는 모드를 말합니다.




4. 다음으로, init 명령은 시스템에 대한 소스 기능 라이브러리 /etc/rc.d/init.d/functions를 설정하여, 프로그램의 시작, 종료, PID 결정 방법을 설정합니다. 

 init 프로그램은 /etc/inittab에서 기본값으로 지정된 런레벨에 대한 올바른 rc 디렉토리에 따라 모든 백그라운드 프로세스를 시작합니다. rc 디렉토리는 제시된 런레벨에 상응하는 숫자로 번호가 매겨집니다. 예를 들어, /etc/rc.d/rc5.d/는 런레벨 5에 대한 디렉토리입니다.

 런레벨 5로 부팅할 때, init 프로그램은 /etc/rc.d/rc5.d/ 디렉토리를 보고 시작 및 중지할 프로세스를 결정합니다.

다음은 /etc/rc.d/rc5.d/ 디렉토리의 예시 목록입니다.

 

K05innd -> ../init.d/innd
K05saslauthd -> ../init.d/saslauthd
K10dc_server -> ../init.d/dc_server
K10psacct -> ../init.d/psacct
K10radiusd -> ../init.d/radiusd
K12dc_client -> ../init.d/dc_client
K12FreeWnn -> ../init.d/FreeWnn
K12mailman -> ../init.d/mailman
K12mysqld -> ../init.d/mysqld
K15httpd -> ../init.d/httpd
K20netdump-server -> ../init.d/netdump-server
K20rstatd -> ../init.d/rstatd
K20rusersd -> ../init.d/rusersd
K20rwhod -> ../init.d/rwhod
K24irda -> ../init.d/irda
K25squid -> ../init.d/squid
K28amd -> ../init.d/amd
K30spamassassin -> ../init.d/spamassassin
K34dhcrelay -> ../init.d/dhcrelay
K34yppasswdd -> ../init.d/yppasswdd
K35dhcpd -> ../init.d/dhcpd
K35smb -> ../init.d/smb
K35vncserver -> ../init.d/vncserver
K36lisa -> ../init.d/lisa
K45arpwatch -> ../init.d/arpwatch
K45named -> ../init.d/named
K46radvd -> ../init.d/radvd
K50netdump -> ../init.d/netdump
K50snmpd -> ../init.d/snmpd
K50snmptrapd -> ../init.d/snmptrapd
K50tux -> ../init.d/tux
K50vsftpd -> ../init.d/vsftpd
K54dovecot -> ../init.d/dovecot
K61ldap -> ../init.d/ldap
K65kadmin -> ../init.d/kadmin
K65kprop -> ../init.d/kprop
K65krb524 -> ../init.d/krb524
K65krb5kdc -> ../init.d/krb5kdc
K70aep1000 -> ../init.d/aep1000
K70bcm5820 -> ../init.d/bcm5820
K74ypserv -> ../init.d/ypserv
K74ypxfrd -> ../init.d/ypxfrd
K85mdmpd -> ../init.d/mdmpd
K89netplugd -> ../init.d/netplugd
K99microcode_ctl -> ../init.d/microcode_ctl
S04readahead_early -> ../init.d/readahead_early
S05kudzu -> ../init.d/kudzu
S06cpuspeed -> ../init.d/cpuspeed
S08ip6tables -> ../init.d/ip6tables
S08iptables -> ../init.d/iptables
S09isdn -> ../init.d/isdn
S10network -> ../init.d/network
S12syslog -> ../init.d/syslog
S13irqbalance -> ../init.d/irqbalance
S13portmap -> ../init.d/portmap
S15mdmonitor -> ../init.d/mdmonitor
S15zebra -> ../init.d/zebra
S16bgpd -> ../init.d/bgpd
S16ospf6d -> ../init.d/ospf6d
S16ospfd -> ../init.d/ospfd
S16ripd -> ../init.d/ripd
S16ripngd -> ../init.d/ripngd
S20random -> ../init.d/random
S24pcmcia -> ../init.d/pcmcia
S25netfs -> ../init.d/netfs
S26apmd -> ../init.d/apmd
S27ypbind -> ../init.d/ypbind
S28autofs -> ../init.d/autofs
S40smartd -> ../init.d/smartd
S44acpid -> ../init.d/acpid
S54hpoj -> ../init.d/hpoj
S55cups -> ../init.d/cups
S55sshd -> ../init.d/sshd
S56rawdevices -> ../init.d/rawdevices
S56xinetd -> ../init.d/xinetd
S58ntpd -> ../init.d/ntpd
S75postgresql -> ../init.d/postgresql
S80sendmail -> ../init.d/sendmail
S85gpm -> ../init.d/gpm
S87iiim -> ../init.d/iiim
S90canna -> ../init.d/canna
S90crond -> ../init.d/crond
S90xfs -> ../init.d/xfs
S95atd -> ../init.d/atd
S96readahead -> ../init.d/readahead
S97messagebus -> ../init.d/messagebus
S97rhnsd -> ../init.d/rhnsd
S99local -> ../rc.local


 위 목록처럼, 실제 서비스를 시작하고 중지하는 어떤 스크립트도 /etc/rc.d/rc5.d/ 디렉토리에 위치하고 있지 않습니다. 대신, /etc/rc.d/rc5.d/에 있는 모든 파일은 /etc/rc.d/init.d/ 디렌토리에 위치한 스크립트에 대한 심볼릭 링크합니다. 심볼릭 링크는 각각의 rc 디렉토리에 사용되며, 원래의 스크립트에는 영향을 미치지 않고 심볼릭 링크를 생성, 수정, 삭제하는 것으로 런레벨을 재설정할 수 있습니다.


여기서 각 심볼릭 링크 앞에는 SK가 붙게 되는데 K는 런레벨에서 종료시켜야 할 프로세스, S는 런레벨에서 시작되는 프로세스 입니다.


 init 명령은 디렉토리에 있는 모든 K 심볼릭 링크를 /etc/rc.d/init.d/<comment> stop 명령을 내려서 중단합니다. 여기서 <command>는 중단될 프로세스를 말합니다. 그 후, 모든 S 심볼릭 링크를 /etc/rc.d/init.d/<command> start 명령을 내려서 시작합니다.


각 심볼릭 링크에는 시작순서 지정을 위한 번호가 매겨집니다. 서비스의 시작 또는 중지의 순서는 이러한 번호를 바꾸어 변경될 수 있습니다. 낮은 번호가 우선으로 시작되며 같은 번호의 링크는 알파벳 순으로 시작됩니다.


init 명령이 런레벨에 따라 적절한 rc 디렉토리를 처리한 후, Upstart/sbin/mingetty 프로세스를 /etc/event.d 디렉토리의 작업 정의에 따라 런레벨에 할당된 각각의 가상 콘솔(로그인 프롬프트)에 대해 실행합니다. 런레벨 2부터 5까지는 모두 6개의 가상 콘솔을 가지며, 런레벨 1(단일 사용자 모드)은 하나만을 가지며, 런 레벨 0과 6은 가상 콘솔이 없습니다. /sbin/migetty 프로세스는 tty 장치에 대한 통신 경로를 열고, 그 장치의 모드를 설정, 로그인 프롬프트를 표시한 후, 사용자의 사용자명과 암호를 입력받아 로그인 과정을 진행합니다.

 

 런레벨 5에서 Upstart/etc/X11/prefdm라는 스크립트를 실행합니다. prefdm 스크립트는 지정된 X 디스플레이 관리자 - 이는  /etc/sysconfig/desktop의 내용에 따라 dfm, kdm, xdm 등이 될 수 있습니다.


 실행이 완료되면, 시스템은 런레벨 5에서 작동하고 로그인 화면이 나타나게 됩니다.





Posted by 시크한공돌이
,