init
프로세스를 시작한다. 여기서 사용자 공간이 시작된다. <------ 여기init
프로세스는 시스템 프로세스의 나머지들을 시작 시킨다.init
은 로그인 프로세스를 시작한다./sbin/init
PID 1
인 첫 번째 스레드를 만들고, kernel_init()
의 코드를 실행한다./init
을 찾는데 실패하면, init/do_mounts.c
안의 함수 prepare_namespace()
를 불러, 파일 시스템을 마운트하려 할 것이다./sbin/init
, /etc/init
, /bin/init
, /bin/sh
를 성공할 때까지 차례로 실행하려고 시도한다.ramfs
에서 실행rdinit=<위치>
로 지정할 수 있고, default로 rdinit=/init
이다.init/main.c
에 있고, 함수 rest_init()
에서 시작한다.init=<위치>
로 지정할 수 있고, default로 /sbin/init
, /etc/init
, /bin/init
, /bin/sh
를 성공할 때 까지 차례로 실행root=/dev/<디스크이름><파티션번호>
, root=/dev/<디스크이름>p<파티션번호>
가 필요하다.root=(hd0,gpt2) -> root=UUID=<UUID>
root=/dev/mmcblk0p1
root=/dev/nfs rootfstype=nfs nfsroot=<serverip>:/nfs/client1/root,v3,tcp
fork
를 사용하지 않고 생성되는 프로세스, 스레드 생성[ process name ]
으로 표기되어 있다./sbin/init splash
/sbin/launchd
rootfs
를 마운트하고 init
프로세스를 시작한다.init
프로세스를 시작한다. 여기서 사용자 공간이 시작된다.init
udeved
(https://velog.io/@markyang92/devicefile#udevd), syslogd
같은 필수적인 저수준 serviceinit
init
은 사용자 공간 프로그램이다./sbin/
종류
man init을 쳐보면 확실히 무슨 init을 사용하는지 확인할 수 있다.
본인 컴퓨터(Ubuntu 20.04 LTS
)에서는 systemd
를 사용한다.
crond
, udeved
)같은 기본 프로세스 세트가 동작하게된다.런 레벨의 용도: 시스템이 시동, 정지, 단일-사용자모드, 콘솔 모드 상태 인지 등을 구분할 수 있게한다.
시스템 구동 시 최초로 실행되는 사용자 레벨 프로세스
시스템 구동에 필요한 각종 스크립트 실행
fsck
로 디스크 상태확인/tmp
디렉토리의 오래된 파일 삭제single user
: 파일시스템 마운트, 네트워크 비활성화, 시스템 관리용 쉘 접근multi-user
: 일반적인 사용자 접근SysV Runlevel | systemd Target | Info |
---|---|---|
0 | runlevel0.target / poweroff.target | Shutdown / Halt system |
1, single | runlevel1.target / rescue.target | Single User Mode |
2,4 | runlevel2.target / runlevel4.target / multi-user.target | User defined runlevels /Defaults to mimic 3 |
3 | runlevel3.target / multi-user.target | Multi-user, non-graphical |
5 | runlevel5.target / graphical.target | Multi-user, graphical |
6 | runlevel6.target / reboot.target | Reboot system |
Emergency | emergency.target | Emergency Shell Access |
Unit Type | Description |
---|---|
Service units | UNIX System의 전통적인 서비스 대몬 제어 |
Mount units | 시스템으로의 파일 시스템 연결을 제어한다. |
Target units | 다른 유닛을 제어하는 '유닛', 즉 유닛을 그룹으로 나누어 컨트롤할 수 있다. |
$ who -r
$ who -r
/etc/init.d/
여기 있는 스크립트들은 시작 서비스
rc5 -> /etc/rc5.d/
init
스크립트 실행/etc/init.d
의 스크립트 파일들/etc/inittab
파일에서 다음의 라인을 찾아본다.id:5:initdefault:
:
으로 구분된다.5
; 적용되는 런레벨이 5)init
이 취해야하는 동작 (위 예제: initdefault
; 디폴트 런레벨을 5로 하라)wait
: 언제 어떻게 Sys V init이 명령을 실행할 것인지 결정한다.l5:5:wait:/etc/rc.d/rc 5
5:wait
는 '런레벨 5'로 들어갈 때, /etc/rc.d/rc 5
를 한번 실행한다. 그리고 다른 어떤 동작을 취하기 전에 이 명령이 완료될 때까지 '대기'한다.rc 5
명령은 /etc/rc5.d
에서 번호와 함께 시작하는 어떤 것이든 이를 실행한다. (번호 순)respawn
: 뒤에 나오는 명령을 실행하도록 init
에 지시하고, 명령이 실행을 마친 상태라면 '다시 실행하도록' 한다.1:2345:respawn:/sbin/mingetty tty1
getty
는 '로그인 프롬프트'를 제공한ㄸ다.tty1
(첫 번째 가상 콘솔)을 위해 사용 된다.respawn
동작을 함으로써, 로그아웃한 후에 다시 로그인 프롬프트로 되돌아 가게 한다.ctrlaltdel
ctrlaltdel
: 가상 콘솔에서 Ctrl + Alt + Del
을 눌렀을 때 시스템이 하는 일을 통제한다.shutdown
명령을 사용하는 리부팅 명령이다.sysinit
sysinit
: 런레벨에 들어가기 전 시동이 될 때, init
이 먼저 실행해야하는 동작l5:5:wait:/etc/rc.d/rc 5
/etc/inittab
내)이 여러 다른 프로그램의 트리거 역할을 한다.rc 5
명령은 다음 명령들을 순서대로 실행함으로써 rc5.d
디렉토리에서 프로그램들을 시작한다.S10sysklogd start
S12kerneld start
S15netstd_init start
S18netbase start
...중략
S99sshd start
start
모드에서 실행되어야한다는 것이다.rc
가 그 명령을 시작해야 하는 곳이 어딘지를 나타낸다.rc*.d
명령은 보통 /sbin
, /usr/sbin
에서 프로그램을 시작하는 셸 스크립트다.start
대신 stop
을 인수로 명령을 실행한다.rc*.d
디렉토리의 내용은 사실상 또 다른 디렉토리의 파일들로 이어지는 심볼릭 링크들이다.httpd
제어httpd
: 웹 서버 프로그램$ init.d/httpd start
$ httpd stop
init.d
디렉토리의 명령들 중 하나가 특정한 런레벨에서 실행이 되지 않도록하는 것이다._
)을 넣는 방법을 많이 사용한다.$ sudo mv S99httpd _S99httpd
S
또는 K
로 시작하는 것이 아니기 때문에, rc
가 pass한다.init.d
디렉토리에 스크립트를 생성한다.rc*.d
디렉토리에 심볼릭 링크를 만든다.init.d
에 이미 있는 스크립트 중 잘 돌고 있는 것을 복사해 수정하는 것이다.run-parts
run-parts
라는 유틸리티를 통해 Sys V init 스크립트를 실행할 수 있다./etc/init.d runlevel
디렉토리의 모든 "start
" 를 실행 하며 regex S[0-9]{2}
식을 사용한다.telinit
사용한다.$ sudo telinit 3
init
에 그 변경에 대해 전달해야 한다. 그리고 리로딩한다.$ sudo telinit q
$ sudo telinit s
$ sudo shutdown -h now
$ sudo shutdown -h +10 (10분 후)
$ sudo shutdown -r now
$ sudo shutdown -r +10 (10분 후)
now
인수 말고 다른 것을 명시하면 shutdown
명령은 /etc/nologin
이라는 파일을 생성해 시스템은 슈퍼 사용자를 제외하고 로그인을 금지시킨다.shutdown
은 정지 시간이 되면 init
에게 shutdown
process를 실행하게 한다.shutdown
유닛을 활성화한다는 의미이다.init
은 모든 프로세스가 잘 정지되도록 요청한다.init
은 TERM
시그널을 사용한다.TERM
시그널이 동작하지 않는다면, init
은 정지하지 않고 남아있는 것들에 KILL
시그널을 사용한다.ro
로 재마운트한다.sync
프로그램으로 모든 버퍼 데이터를 파일 시스템에 기록한다.reboot(2)
시스템 콜로 정지 시키도록 커널에 지시한다. init.d
스크립트를 다운로드한다./etc/init.d/mongodb
$ curl https://raw.githubusercontent.com/mongodb/mongo/master/debian/init.d | sudo tee /etc/init.d/mongodb >/dev/null
$ sudo chmod +x /etc/init.d/mongodb
$ sudo service mongodb status
$ sudo service mongodb start
$ sudo service mongodb stop