運行級的概念來自System V,運行級別將啟動過程分成不同的集合,每個集合包含一組腳本,
當init程序“切換運行級”到對應的級別時,相應的腳本就被觸發,切換運行級可以通過執行init [級別號]完成。
(比如,在Linux中,run level 6代表reboot,所以執行init 6就會引起系統重新啟動)運行級別的定義每種
System V都不完全一樣,只能通過直接讀/etc/inittab來確定,下面是一個標准的Linux的/etc/inittab,
注意這裡解釋的內容來自redhat,但是其他的版本也大同小異。我們將它分成若干段來解釋,如同一般情況那樣,
用#開始的行是注釋,而非注釋行的語法是:標號:運行級別:操作方式:命令 標號是這一行的標簽,
運行級別用於定義這一行應該用於那些級別,如果為空就定義為所有級別,操作方式可以是一些確定的字符串,
代表如何執行後面的命令,而命令則給處在進入這一級別時執行的程序。
下面是它的內容:# Default runlevel. The runlevels used by RHS are:# 0 - halt (Do NOT set initdefault to this)# 1 - Single user mode# 2 - Multiuser, without NFS (The same as 3, if you do not have.networking)# 3 - Full multiuser mode# 4 - unused# 5 - X11# 6 - reboot (Do NOT set initdefault to this)#
上面的幾行解釋了缺省的運行級別定義:停機,系統進入這一級別後關機;單用戶模式,
在這個模式中只能從控制台操作計算機,網絡和終端不啟動,許多文件系統也沒有連結;
多用戶模式,但關閉了網絡服務支持完全的多用戶模式,就是我們一般使用的模式無定義圖形界面模式,
系統切入這一運行級後自動啟動X Window系統重新啟動這些級別的定義是任意的,然而你最好不要修改它,
尤其是level 0,1和6,因為許多程序都使用init 0之類的方式實現對系統的控制,
其他的Linux發行版本可能會更改2-5的定義,你需要參考/etc/inittab才能判斷到底那個級別是什麼意思,
不過一般來說0,1和6總是上面的定義。下面開始才是真正的內容,
首先系統必須定義缺省的運行級別:id:3:initdefault:initdefault關鍵字決定了缺省的運行級別,
在這裡是3,也就是在執行了公共的系統啟動腳本之後,
系統將會執行與級別3對應的那些行# System initialization.si::sysinit:/etc/rc.d/rc.sysinit
這裡的sysinit關鍵字定義了公共的“系統初始化”腳本,在相應於運行級的地方是空,表示適用於所有運行級別
。注意它將在系統進入任何運行級別以前完成,一會我們再研究這個腳本的內容。l0:0:wait:/etc/rc.d/rc 0l1:1:wait:/etc/rc.d/rc 1l2:2:wait:/etc/rc.d/rc 2l3:3:wait:/etc/rc.d/rc 3l4:4:wait:/etc/rc.d/rc 4l5:5:wait:/etc/rc.d/rc 5l6:6:wait:/etc/rc.d/rc 6這裡開出了六個運行級別的定義,運行級0就去執行命令/etc/rc.d/rc 0,運行級1是/etc/rc.d/rc 1,.....
諸如此類。wait關鍵字表示系統必須等待此命令執行完才能開始下一步工作。# Things to run in every runlevel.ud::once:/sbin/update這又是一個適用於所有級別的命令。update命令實際是去啟動updated守護進程,以便定期刷新內存中的超級塊表。Once關鍵字說明這個項只被執行一次。# Trap CTRL-ALT-DELETEca::ctrlaltdel:/sbin/shutdown -t3 -r nowctrlaltdel定義當熱啟動組合鍵被觸發時系統的行為,這裡定義所有的運行級別對它的響應都是重新啟動(shutdown –r)pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"這兩行定義如何響應ups信息,如果系統掉電(powerfail),執行兩分鐘後關機的指令;如果關機之前電源恢復,取消關機操作。# Run gettys in standard runlevels1:2345:respawn:/sbin/mingetty tty12:2345:respawn:/sbin/mingetty tty23:2345:respawn:/sbin/mingetty tty34:2345:respawn:/sbin/mingetty tty45:2345:respawn:/sbin/mingetty tty56:2345:respawn:/sbin/mingetty tty6 2,3,4,5都是多用戶級別,為系統開出6個虛擬屏幕(就是用Alt+Fn即獲得虛擬屏幕),respawn關鍵字表示這個動作在每次進入相應運行級別時都會執行。# Run xdm in runlevel 5# xdm is now a separate servicex:5:respawn:/etc/X11/prefdm -nodaemon對於級別5,啟動圖形界面。歸納一下,系統在讀入inittab以後要做什麼?設置Ctrl+Alt+Del響應,設置好對UPS的支持,然後應該執行/etc/rc.d/rc.sysinit,然後是/etc/rc.d/rc 3,最後是update和啟動虛擬屏幕。顯然,系統的主要初始化命令應該在/etc/rc.d/rc.sysinit和/etc/rc.d/rc 3中完成。rc.d下的基本腳本下面我們來研究啟動腳本,這裡的腳本來自redhat 6.1,因為這是個最為廣泛使用的版本,其他的版本的特有問題將在下一節討論。首先,系統將執行/etc/rc.d/rc.sysinit,這是個shell腳本,你可以用普通的文本編輯工具對它進行處理,為了簡便,我們只研究其中較為重要的部分或者較為典型的段落:#!/bin/sh## /etc/rc.d/rc.sysinit - run once at boot time## Take