天天看點

基于 LFS-6.3 研究 sysvinit 系統

  • 前言
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:
           
  • sysvinit 啟動流程 - 從 過程 的角度
讀/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
           
  • lable
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級别,也可以不為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。
  

           
  • action
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
表示執行的程序

process字段都以該程序的名字開頭,緊跟着是運作時要傳遞給該程序的參數。

比如/sbin/shutdown -t3 -r now,該程序在按下Ctrl+Alt+Del時執行,在指令行下也可以直接輸入來重新啟動系統。
           

疑問

  • busybox中的inittab和 sysvinit 中的inittab 文法一樣嗎?
文法類似但不一樣
           
  • sysvinit 要執行rcS檔案中的腳本嗎
取決于
	1./etc/inittab 中有沒有一行 執行 執行了 rcS 檔案
	2./etc/inittab 中執行的程式 有沒有執行  rcS 檔案 
           
  • busybox中的init程式和 sysvinit 中的init程式啟動流程 一樣嗎?
不一樣
           
lfs