sysvinit 是 第一代 init 系統, 與 busybox 中的 init 不同
代碼取自于 sysvinit-2.86.tar.gz
下一代還有 upstart 和 systemd
- sysvinit 啟動流程 - 從 log 的角度
Freeing unused kernel memory:296k freed
INIT: version 2.86 booting ----- sysvinit 列印的第一條資訊
...
mylinux login:
讀/etc/inittab,逐行解析并執行/etc/inittab中的指令(以目前的/etc/inittab為例)
執行 /etc/rc.d/init.d/rc sysinit // 做/etc/rc.d/rcsysinit.d/下的腳本
目前run level 為 3 , 執行 /etc/rc.d/init.d/rc 3 // /etc/rc.d/rc3.d/下的腳本
目前 tty 為 tty1 , 目前run level 為 3 ,執行 /sbin/agetty tty1 9600 // 列印 mylinux login:
/etc/inittab 檔案内容
-----------------------------------------------------
# Begin /etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/init.d/rc sysinit
l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc 6
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
su:S016:once:/sbin/sulogin
1:2345:respawn:/sbin/agetty tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600
# End /etc/inittab
sysvinit 中的 inittab 解析
label:runlevel:action:process
id 用來定義預設的init運作的級别
si 是系統初始化的程序
ln 其中的n從1~6,指明該程序可以使用的runlevel的級别
ud 是更新程序
ca 指明當按下Ctrl+Alt+Del時運作的程序
pf 指當UPS表明斷電時運作的程序
pr 是在系統真正關閉之前,UPS發出電源恢複的信号時需要運作的程序
[1-6] 是将系統轉入ttyx(例如tty1)終端時需要運作的程序
x 比對 [1-6] 任意一個,表示任意一個tty
su 表示 是 單使用者模式
指定runlevel的級别。可以指定多個runlevel級别,也可以不為runlevel字段指定特定的值
0、1、6運作級别被系統保留:
0作為shutdown動作
1作為重新開機至單使用者模式
6作為重新開機
0 是讓init關閉所有程序并終止系統。
1 是用來将系統轉到單使用者模式,單使用者模式隻能有系統管理者進入,在該模式下處理那些在有登入使用者的情況下不能進行更改的檔案,改runlevel的編号1也可以用S代替。
2 是允許系統進入多使用者的模式,但并不支援檔案共享,這種模式很少應用。
3 是最常用的運作模式,主要用來提供真正的多使用者模式,也是多數伺服器的預設模式。
4 一般不被系統使用,使用者可以設計自己的系統狀态并将其應用到runlevel 4階段,盡管很少使用,但使用該系統可以實作一些特定的登入請求。
5 是将系統初始化為專用的X Window終端。對功能強大的Linux系統來說,這并不是好的選擇,但使用者如果需要這樣,也可以通過在runlevel啟動來實作該方案。
6 是關閉所有運作的程序并重新啟動系統。
空 表示比對所有 runlevel
S S和s意義相同,表示單使用者模式,且無需inittab檔案,是以也不在inittab中出現,實際上,進入單使用者模式時,init直接在控制台(/dev/console)上運作/sbin/sulogin。
boot 在系統啟動時運作,忽略runlevel
bootwait 在系統啟動時運作,等待init程序完成。忽略runlevel
ctrlaltdel 當Ctrl+Alt+Del三個鍵同時按下時運作,把SIGINT信号發送給init。忽略runlevel
initdefault 不要執行這個程序,它用于設定預設runlevel
kbrequest 當init從鍵盤中收到信号時運作。這裡要求鍵盤組合符合KeyBoardSigral(參見/usr/share/doc/kbd-*關于鍵盤組合的文檔)
off 禁止進入,是以該程序不運作
once 每一個runlevel級别運作一次
ondemand 當系統指定特定的運作級别A、B、C時運作
powerfail 當init收到SIGPWR信号時運作
powerokwait 當收到SIGPWD信号且/etc/檔案中的電源狀态包含OK時運作
powerwait 當收到SIGPWD信号,并且init等待程序結束時運作
respawn 不管何時終止都重新啟動程序
sysinit 在運作boot或bootwait程序之前運作
wait 運作程序等待輸入運作模式
表示執行的程序
process字段都以該程序的名字開頭,緊跟着是運作時要傳遞給該程序的參數。
比如/sbin/shutdown -t3 -r now,該程序在按下Ctrl+Alt+Del時執行,在指令行下也可以直接輸入來重新啟動系統。
疑問
- busybox中的inittab和 sysvinit 中的inittab 文法一樣嗎?
文法類似但不一樣
取決于
1./etc/inittab 中有沒有一行 執行 執行了 rcS 檔案
2./etc/inittab 中執行的程式 有沒有執行 rcS 檔案
- busybox中的init程式和 sysvinit 中的init程式啟動流程 一樣嗎?
不一樣