http://blog.chinaunix.net/uid-17188120-id-4073497.html
1,啟動inittab
第一步:啟動內核
第二步:執行init (配置文件/etc/inittab)
第三步:啟動相應的腳本,執行inittab腳本,并且執行其他腳本/etc/init.d rc.sysinit rc.d rc.local。。。
2,inittab
init的進程號為1,是所有進程的父進程,內核初始化完畢之后,init程序開始運行。其他軟件也同時開始運行。init程序通過/etc/inittab文件進行配置。
/etc/inittab文件每一行包括四個字段:label:runlevel:action:process。詳細解釋如下。
1)label
登記項標志符,是一個任意指定的、4個字符以內的序列標號,在本文件內必須唯一。
label是1到4個字符的標簽,用來標示輸入的值。一些系統只支持2個字符的標簽。鑒于此原因,多數人都將標簽字符的個數限制在2個以內。該標簽可以是任意字符構成的字符串,但實際上,某些特定的標簽是常用的,在Red Hat Linux中使用的標簽是:
id 用來定義缺省的init運行的級別
si 是系統初始化的進程
ln 其中的n從1~6,指明該進程可以使用的runlevel的級別
ud 是升級進程
ca 指明當按下Ctrl+Alt+Del是運行的進程
pf 指當UPS表明斷電時運行的進程
pr 是在系統真正關閉之前,UPS發出電源恢復的信號時需要運行的進程
x 是將系統轉入X終端時需要運行的進程
2)runlevels
系統運行級,即執行登記項的init級別。用于指定相應的登記項適用于哪一個運行級,即在哪一個運行級中被處理。如果該字段為空,那么相應的登記項將適用于所有的運行級。在該字段中,可以同時指定一個或多個運行級,其中各運行級分別以數字0, 1, 2, 3, 4, 5, 6或字母a, b, c表示,且無須對其進行分隔。
0-->Halt,關閉系統.
1-->單用戶,在grub啟動時加上為kernel加上參數single即可進入此運行等級
2-->無網絡多用戶模式.
3-->有網絡多用戶模式.
4-->有網絡多用戶模式.
5-->X模式
6-->reboot重啟系統
S/s-->同運行等級1
a,b,c-->自定義等級,通常不使用.
3)action
表示進入對應的runlevel時,init應該運行process字段的命令的方式,有效的action值如下。
boot:只有在引導過程中,才執行該進程,但不等待該進程的結束。當該進程死亡時,也不重新啟動該進程。
bootwait:只有在引導過程中,才執行該進程,并等待進程的結束。當該進程死亡時,也不重新啟動該進程。實際上,只有在系統被引導后,并從單用戶模式進入多用戶模式時,這些登記項才被處理;如果系統的默認運行級設置為2(即多用戶模式),那么這些登記項在系統引導后將馬上被處理。
initdefault:指定系統的默認運行級。系統啟動時,init將首先查找該登記項,如果存在,init將依據此決定系統最初要進入的運行級。具體來說,init將指定登記項"run_level"字段中的最大數字(即最高運行級)為當前系統的默認運行級;如果該字段為空,那么將其解釋為"0123456",并以"6"作為默認運行級。如果不存在該登記項,那么init將要求用戶在系統啟動時指定一個最初的運行級。
off:如果相應的進程正在運行,那么就發出一個告警信號,等待20秒后,再通過關閉信號強行終止該進程。如果相應的進程并不存在,那么就忽略該登記項。
once:啟動相應的進程,但不等待該進程結束便繼續處理/etc/inittab文件中的下一個登記項;當該進程終止時,init也不重新啟動該進程。在從一個運行級進入另一個運行級時,如果相應的進程仍然在運行,那么init就不重新啟動該進程。
ondemand:與"respawn"的功能完全相同,但只用于運行級為a、b或c的登記項。
powerfail:只在init接收到電源失敗信號時,才執行該進程,但不等待該進程結束。
powerwait:只在init接收到電源失敗信號時,才執行該進程,并在繼續對/etc/inittab文件進行任何處理前等待該進程結束。
respawn:如果相應的進程還不存在,那么init就啟動該進程,同時不等待該進程的結束就繼續掃描/etc/inittab文件;當該進程終止時,init將重新啟動該進程。如果相應的進程已經存在,那么init將忽略該登記項并繼續掃描/etc/inittab文件。
sysinit:只有在啟動或重新啟動系統并首先進入單用戶模式時,init才執行這些登記項。而在系統從運行級1~6進入單用戶模式時,init并不執行這些登記項。"action"字段為"sysinit"的登記項在"run_level"字段不指定任何運行級。
wait:啟動進程并等待其結束,然后再處理/etc/inittab文件中的下一個登記項。
ctrlaltdel:用戶在控制臺鍵盤上按下Ctrl+Alt+Del組合鍵時,允許init重新啟動系統。注意,如果該系統放在一個公共場所,系統管理員可將Ctrl+Alt+Del組合鍵配置為其他行為,比如忽略等。
4)process
具體應該執行的命令。并負責在退出運行級時將其終止(當然在進入的runlevel中仍要運行的程序除外)。當運行級別改變,并且正在運行的程序并沒有在新的運行級別中指定需要運行時,那么init會先發送一個SIGTERM 信號終止,然后是SIGKILL。
3,inittab舉例
id:3:initdefault:
第一個字段為標識符,下面我們就不說了。這個登記項表示我們默認的運行級別是3,也就是說我們默認開機啟動會進入命令行模式。
si::sysinit:/etc/rc.d/rc.sysinit
所所有的運行級別下,init依賴/etc/rc.d/rc.sysinit這個腳本對系統進行初始化。而/etc/rc.d/rc.sysinit的作用主要是:
1,激活udev和selinux
2,根據/etc/sysctl.conf文件設定內核參數
3,設定系統時鐘
4,鍵盤的鍵映射,即識別鍵盤
5,啟用swap分區
6,設定主機名
7,根文件系統檢測及重新以讀寫方式掛載
8,激活RAID和LVM設備
9,啟用磁盤配額
10,檢測及掛載其他文件系統(掛載/etc/fstab中定義的設備)
11,清除過期的鎖和PID文件
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
當進入n運行級(n就是上面所定義的運行級別),會把/etc/rc.d/rc*.d(*表示對應登記項process字段rc后的數字)這個目錄中所有以S開頭的文件啟用,把以K開頭的文件給禁用,并且這些文件只在進入相應的運行級別時執行一次,退出此運行級別失效。所以每個運行級別的服務是獨立的,而/etc/rc.d/rc*.d這個目錄中存放的是在對應級別下所要開啟和禁用的服務的文件。
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
在所有運行級別下,按下ctrl+alt+del時等待3秒鐘后重新啟動系統。這就是為什么我們按下這三鍵后重新啟動系統
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
在所有的運行級別下,如果電源故障,會給出提示信息,并且在2min后關機。
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
在12345運行級別下,如果電源故障的時候,電源又恢復正常,則給出提示信息,并且立即終止關機。
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
在2345運行級別下,會啟用6個命令行界面的終端,并且一旦終端終止,就會在創建一個新的。這就是為什么我們的系統下會有6個命令行界面的終端。
x:5:respawn:/etc/X11/prefdm -nodaemon
只有我們進入5運行級別,會打開圖形用戶終端,并且一旦終端終止,就會再創建一個新的。你如果把這一行刪了,你的圖形界面還能用嗎?你懂的
?