Published Book on Amazon
All of IOT
Starting with the Latest Raspberry Pi from Beginner to Advanced – Volume 1 |
|
All of IOT
Starting with the Latest Raspberry Pi from Beginner to Advanced – Volume 2 |
출판된 한글판 도서
최신 라즈베리파이(Raspberry Pi)로 시작하는 사
물인터넷(IOT)의 모든 것 – 초보에서 고급까지 (상) |
|
최신 라즈베리파이(Raspberry Pi)로 시작하는 사
물인터넷(IOT)의 모든 것 – 초보에서 고급까지 (하) |
Original Book Contents
20.3.2 booting sequence
시스템이 처음 시작할 때는 일정한 순서에 따라 정해진 작업을 실행하게 되는데, 이런 순서를 "booting sequence"라고 한다. 다음에는 booting sequence에 대한 기본 체계와 이를 이용하여 booting할 때 필요한 작업을 자동으로 실행하는 방법에 대해서 설명하도록 하겠다.
20.3.2.1 booting 체계
시스템을 처음 시작하면, 디스크에서 시스템 프로그램 정보를 읽고, 여러 가지 점검과 준비작업을 한다. 그런 다음 다음과 같은 순서로 booting을 위한 초기화 작업을 하게 된다.
● "/sbin/init" 프로그램 실행
시스템이 처음 시작되면 "/sbin/init" 프로그램을 실행한다. 이 프로그램은 kernel이 처음 실행하는 프로그램으로 Process ID "1"번이 부여된다. 이 프로그램은 "/etc/inittab" 파일을 읽어서 default run level을 점검하고, "init" 실행을 위한 각종 설정 값을 확인하고, 다음 프로세스를 시작한다.
● "/etc/init.d/rcS" 프로그램 실행
시스템은 "/etc/init.d/rcS" 프로그램을 실행한다. 이를 "Sysinit" 프로세스라고 하는데, 실제로 시스템 설정을 조정하거나 초기화 작업을 하는 script 프로그램이다. 여기서 시스템의 상태를 점검하고, Kernel 프로그램을 loading하는 작업을 한다.
● "/etc/init.d/rc" 프로그램 실행
시스템은 지정된 run level에 대해서 "/etc/inittab" 파일에서 정해진 방식으로 "/etc/init.d/rc" 프로세스를 실행하면서 run level을 전달한다.
다음은 "/etc/inittab"에 등록되어 있는 것으로 run level에 따른 실행 방식을 지정한 부분이다. 각각의 run level에 따라서 "/etc/init.d/rc"를 실행하고 있다.
l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 |
"/etc/" directory 밑에는 "rc0.d" ~ "rc6.d" directory가 있으며, 각각의 directory 밑에는 해당 run level에서 start/stop될 init script가 link의 형태로 등록되어 있다.
그림 20‑1 run level에 지정된 start/stop을 위한 init script
앞에서 실행된 "/etc/init.d/rc" 프로그램은 run level에 따라 각각 "/etc/rc0.d" ~ "/etc/rc6.d" directory 밑에 등록되어 있는 모든 init script를 실행하게 된다. booting sequence에서 run level에 따라 script가 자동 실행되는 기본 체계는 다음과 같다.
■ /etc/init.d/rc N à/etc/init.d/rc à/etc/rcN.d/script-link à/etc/init.d/script
● /etc/rc.local 파일에 등록되어 있는 script 실행
앞 단계에서 run level에 따라 지정된 init script가 모두 처리된 다음에는 "/etc/rc.local" 파일에 등록된 작업이 실행된다. 이 작업은 run level "2", "3", "4", "5"인 경우에만 실행된다. 사실 이것도 위의 init script 와 동일한 방식으로 작성된 "rc.local"이라는 init script에 의해서 처리가 되는 것이다. 기본적인 체계는 다음과 같다.
■ /etc/rcN.d/rc.local-link à/etc/init.d/rc.local à/etc/rc.local
● login 허용
위의 모든 작업이 완료되면, 특정 사용자 계정으로 logon할 수 있도록 해준다.
20.3.2.2 "pstree" 명령 - booting process tree
시스템이 booting하면서 실제로 실행되는 여러 가지 process daemon들이 누구에 의해서, 어떤 순서로 실행되었는지에 대한 상관 관계를 확인할 수 있다. 이런 용도로 사용하는 것이 pstree 명령이다.
[명령 형식]
pstree [option] |
[명령 개요]
■ 시스템이 booting하면서 실행되는 여러 process daemon들이 누구에 의해서, 어떤 순서로 실행되었는지에 대한 상관 관계를 보여준다.
■ user 권한 -- 일반 user.
[상세 설명]
■ None
[사용 예제]
다음은 booting을 완료한 이후에 "pstree" 명령을 실행해 본 것이다.
pi@raspberrypi ~ $ pstree |
init─┬─console-kit-dae───64*[{console-kit-dae}] ├─cron ├─3*[dbus-daemon] ├─2*[dbus-launch] ├─dhclient ├─7*[getty] ├─2*[gvfs-afc-volume───{gvfs-afc-volume}] ├─2*[gvfs-gdu-volume───{gvfs-gdu-volume}] ├─2*[gvfs-gphoto2-vo] ├─2*[gvfsd] ├─2*[gvfsd-trash───{gvfsd-trash}] ├─3*[ifplugd] ├─5*[leafpad] ├─lightdm─┬─Xorg │ ├─lightdm─┬─lxsession─┬─lxpanel───{lxpanel} │ │ │ ├─openbox │ │ │ ├─pcmanfm───{pcmanfm} │ │ │ ├─ssh-agent │ │ │ └─{lxsession} │ │ └─{lightdm} │ └─2*[{lightdm}] ├─2*[lxpolkit───{lxpolkit}] ├─2*[menu-cached───{menu-cached}] ├─nmbd ├─ntpd ├─polkitd───2*[{polkitd}] ├─rsyslogd───3*[{rsyslogd}] ├─smbd───smbd ├─sshd───sshd───sshd───bash───pstree ├─thd ├─udevd───2*[udevd] ├─udisks-daemon─┬─udisks-daemon │ └─2*[{udisks-daemon}] ├─wpa_cli ├─wpa_supplicant ├─xrdp───{xrdp} └─xrdp-sesman───xrdp-sessvc─┬─Xvnc ├─ck-launch-sessi─┬─lxsession─┬─lxpanel───{lxpanel} │ │ ├─openbox │ │ ├─pcmanfm───{pcmanfm} │ │ └─{lxsession} │ └─ssh-agent └─xrdp-chansrv───{xrdp-chansrv} |
위 결과 자료에는 여러 개의 process들이 서로 계층적인 관계를 가지고 있는 것을 확인할 수 있다. 상위 계층에 있는 process가 하위계층에 있는 process를 실행한 것을 의미한다. 계층도에서 "init"가 최상위에 있는데, 이것은 "init"가 booting할 때 처음 실행되는 process이며, "init"가 그 하부에 있는 모든 process를 시작시켰다는 것을 의미한다.