Linux系统运行级与启动机制剖析
一 系統(tǒng)運(yùn)行級(jí)
windows系統(tǒng)有安全運(yùn)行模式和正常運(yùn)行模式,這是兩個(gè)不同的運(yùn)行級(jí),同樣,linux也有系統(tǒng)運(yùn)行級(jí)別,并且linux系統(tǒng)的運(yùn)行級(jí)別更加靈活,更加多樣化。
在講述運(yùn)行級(jí)別前,先講述下linux下的init程序,因?yàn)閕nit程序直接和系統(tǒng)運(yùn)行級(jí)別相關(guān)聯(lián), init程序是linux操作系統(tǒng)最主要的程序之一,是一個(gè)由系統(tǒng)內(nèi)核啟動(dòng)的用戶級(jí)進(jìn)程,同時(shí)init進(jìn)程也是所有其它系統(tǒng)進(jìn)程的鼻祖,也就是說(shuō)init進(jìn)程是系統(tǒng)運(yùn)行的第一個(gè)進(jìn)程,它的進(jìn)程號(hào)始終為1。
linux系統(tǒng)有7個(gè)運(yùn)行級(jí)別,這些運(yùn)行級(jí)別均在/etc/inittab文件中指定,下面講述/etc/inittab文件的具體實(shí)現(xiàn)。
以redhat linux為例,下面是/etc/inittab的某段信息。
# 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)
上面這段信息列出了linux系統(tǒng)的7個(gè)運(yùn)行等級(jí):
0-關(guān)機(jī)模式,
1-單用戶模式,單用戶只有系統(tǒng)管理員可以登錄。
2-多用戶模式,但是不支持文件共享,例如不支持NFS服務(wù).這種模式不常用。
3-完全的多用戶模式,支持NFS服務(wù).最常用的用戶模式,默認(rèn)登錄到系統(tǒng)的字符界面。
4-基本不用的用戶模式,可以實(shí)現(xiàn)某些特定的登錄請(qǐng)求。
5-完全多用戶模式,默認(rèn)登錄到X-window系統(tǒng),也就是登錄到linux圖形界面。
6-重啟模式,也就是執(zhí)行關(guān)閉所有運(yùn)行的進(jìn)程,然后重新啟動(dòng)系統(tǒng)。
這些運(yùn)行級(jí)別和linux中的init程序相互對(duì)應(yīng),例如執(zhí)行init 1系統(tǒng)就進(jìn)入單用戶模式,執(zhí)行init 6系統(tǒng)將重新啟動(dòng)。
在inittab文件中以#開頭的所有行都是注釋行。注釋行有助于用戶理解inittab文件每項(xiàng)的具體含義,inittab文件中的值都有如下格式組成:
??? label:runlevel:action:process
1.label字段
label是有1~4個(gè)字符組成的標(biāo)簽,用來(lái)標(biāo)示輸入的值。一些系統(tǒng)只支持2個(gè)字符的標(biāo)簽。鑒于此原因,多數(shù)人都將標(biāo)簽字符的個(gè)數(shù)限制在2個(gè)以內(nèi)。該標(biāo)簽可以是任意字符構(gòu)成的字符串,在Red Hat Linux中使用的標(biāo)簽有:
2.runlevel字段
runlevel字段指定系統(tǒng)的運(yùn)行級(jí)別。可以指定多個(gè)運(yùn)行級(jí)別,也可以不為runlevel字段指定特定的值。
3. process字段
process字段包含了init執(zhí)行的進(jìn)程,也就是init程序具體要執(zhí)行的命令,該進(jìn)程采用的格式與在命令行下運(yùn)行該進(jìn)程的格式一樣,因此process字段都以該進(jìn)程的名字開頭,后面是運(yùn)行時(shí)要傳遞給該進(jìn)程的參數(shù)。比如/sbin/shutdown -t3 -r now。
4.action字段
??? action字段定義了:當(dāng)系統(tǒng)進(jìn)入相應(yīng)的運(yùn)行級(jí)別后,init程序應(yīng)該以何種方式運(yùn)行process字段對(duì)應(yīng)的命令,action字段常用的值如下表所示:
明白了inittab文件的格式以后,我們就知道每項(xiàng)的含義了, 接著看/etc/inittab下面的內(nèi)容:
id:5:initdefault:
表示系統(tǒng)將默認(rèn)啟動(dòng)到X-window界面下,如果我們想讓系統(tǒng)默認(rèn)開機(jī)啟動(dòng)到字符界面下,只需修改id:5:initdefault:為id:3:initdefault:即可。
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
該段告訴init程序,運(yùn)行/etc/rc.d/rc.sysinit來(lái)進(jìn)行系統(tǒng)初始化工作。
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
上面這段信息標(biāo)明/etc/rc.d/rc可以運(yùn)行在0~6各個(gè)運(yùn)行級(jí)別,同時(shí)init程序等待/etc/rc.d/rc執(zhí)行完畢才進(jìn)入下一步操作。
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
上面這段指定了當(dāng)Ctrl+Alt+Del三個(gè)鍵同時(shí)按下時(shí),init程序?qū)?zhí)行/sbin/shutdown -t3 -r now,即重啟系統(tǒng)。
# When our UPS tells us power has failed, assume we have a few minutes
# of power left.? Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.??
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
上面這段信息說(shuō)明了:系統(tǒng)電源被切斷時(shí),UPS通知init程序,init程序發(fā)出"Power Failure;System Shutting Down"信號(hào),然后執(zhí)行關(guān)機(jī)操作。
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
這段說(shuō)明了:UPS接到電源恢復(fù)信號(hào)后,通知init進(jìn)程,然后init程序發(fā)出"Power Restored; Shutdown Cancelled"信號(hào),取消關(guān)機(jī)操作,這個(gè)過(guò)程在1~5運(yùn)行級(jí)別上有效。
# Run gettys in standard runlevels
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
這段信息說(shuō)明了:在2~5運(yùn)行級(jí)別上,始終打開6個(gè)終端控制臺(tái),即使某個(gè)控制臺(tái)被關(guān)閉,系統(tǒng)也會(huì)自動(dòng)啟動(dòng)。
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm –nodaemon
最后這段信息表明,在X-window桌面下始終運(yùn)行的進(jìn)程是/etc/X11/prefdm。
二 ?系統(tǒng)啟動(dòng)過(guò)程
1.內(nèi)核引導(dǎo)
?打開系統(tǒng)電源,開始BIOS自檢,系統(tǒng)按照BIOS里的設(shè)置啟動(dòng)設(shè)備(一般是硬盤啟動(dòng)), 接著進(jìn)入linux引導(dǎo)程序,一般Linux系統(tǒng)提供兩種引導(dǎo)方式: GRUB和LOLO,其中GRUB是大多數(shù)Linux系統(tǒng)的默認(rèn)引導(dǎo)方式,而LILO則是根據(jù)一些特殊需求或個(gè)人喜好而準(zhǔn)備的,一旦linux引導(dǎo)程序載入內(nèi)存,它顯示一個(gè)圖形界面給用戶,這個(gè)界面里包含了不同的內(nèi)核選項(xiàng),用戶可以通過(guò)上下鍵去選擇不同的內(nèi)核引導(dǎo),當(dāng)引導(dǎo)程序成功完成引導(dǎo)后,linux接管了對(duì)CPU的控制權(quán),接著CPU開始執(zhí)行l(wèi)inux內(nèi)核映像程序,加載內(nèi)核, 在預(yù)定的地方找到initrd鏡像的壓縮包,對(duì)它進(jìn)行解壓和掛載,并載入所有必須的驅(qū)動(dòng), 然后,Kernel會(huì)創(chuàng)建root設(shè)備,以只讀方式掛載root分區(qū),并釋放所有沒有被使用的內(nèi)存,此時(shí),Kernel已經(jīng)被裝載到內(nèi)存里運(yùn)行起來(lái)了。但是,因?yàn)闆]有用戶應(yīng)用程序允許輸入有意義的指令給系統(tǒng),所以此時(shí)的系統(tǒng)不能做任何事情。
2.運(yùn)行init
init進(jìn)程是系統(tǒng)所有進(jìn)程的起點(diǎn), 緊接上面,Linux在完成核內(nèi)引導(dǎo)以后,就開始運(yùn)行init程序,init程序需要讀取配置文件/etc/inittab,而inittab是一個(gè)不可執(zhí)行的文本文件,關(guān)于這個(gè)文件,我們將在”系統(tǒng)運(yùn)行級(jí)”一節(jié)詳細(xì)講述。
3.系統(tǒng)初始化
init程序啟動(dòng)后首先調(diào)用rc.sysinit和rc程序, rc.sysinit主要完成一些系統(tǒng)初始化的工作,它是系統(tǒng)每一個(gè)運(yùn)行級(jí)別都要首先運(yùn)行的重要腳本。它主要完成的工作有:檢查磁盤,加載硬件模塊, 激活交換分區(qū),以及其它一些需要優(yōu)先執(zhí)行任務(wù),當(dāng)rc.sysinit程序執(zhí)行完畢,引導(dǎo)返回到init程序。
4.啟動(dòng)運(yùn)行級(jí)的守護(hù)進(jìn)程
rc.sysinit程序執(zhí)行完畢,接下來(lái),rc程序啟動(dòng), rc程序主要啟動(dòng)系統(tǒng)對(duì)應(yīng)運(yùn)行級(jí)別的守護(hù)進(jìn)程, rc程序執(zhí)行完畢,又將返回init程序繼續(xù)下一步。
5.建立終端
此時(shí)系統(tǒng)基本環(huán)境已經(jīng)設(shè)置好了,init程序接著會(huì)打開6個(gè)終端,以便用戶登錄。
6.登錄系統(tǒng)
當(dāng)我們看到mingetty的登錄界面時(shí),我們就可以輸入用戶名和密碼登錄系統(tǒng)了。Linux的賬號(hào)驗(yàn)證程序是login,當(dāng)login程序執(zhí)行成功后,最后就進(jìn)入了shell終端。
這樣linux系統(tǒng)就完成了從開機(jī)到啟動(dòng)的整個(gè)過(guò)程。
?
三 ?系統(tǒng)關(guān)機(jī)過(guò)程
在了解linux關(guān)機(jī)過(guò)程之前,我們先學(xué)習(xí)一下linux關(guān)機(jī)的一些常用命令,最常用的linux關(guān)機(jī)命令有如下幾個(gè):init ,shutdown, halt,reboot等,這些命令都可以達(dá)到關(guān)機(jī)重啟的目的,但是每個(gè)命令的內(nèi)部工作過(guò)程是不同的。我們通過(guò)對(duì)關(guān)機(jī)命令的講述,詳細(xì)了解linux安全關(guān)機(jī)的過(guò)程。
1.shutdown命令
使用shutdown命令可以安全的關(guān)閉linux系統(tǒng),有些linux初學(xué)者會(huì)使用直接關(guān)閉電源的方法來(lái)關(guān)閉linux,這是十分危險(xiǎn)的,因?yàn)閘inux與windows不同,在linux后臺(tái)運(yùn)行著很多進(jìn)程,這些進(jìn)程控制著linux對(duì)系統(tǒng)的各種操作,如果強(qiáng)制關(guān)機(jī),可能會(huì)造成進(jìn)程的混亂以至丟失數(shù)據(jù),如果在系統(tǒng)工作負(fù)荷很高的情況下,突然斷電,不但會(huì)丟失數(shù)據(jù),甚至?xí)p壞硬件設(shè)備。
shutdown命令是用shell編寫的程序,必須由超級(jí)用戶才能執(zhí)行,shutdown命令執(zhí)行后,會(huì)以廣播的形式通知正在系統(tǒng)中工作的所有用戶,系統(tǒng)將在指定的時(shí)間內(nèi)關(guān)閉,請(qǐng)保存文件,停止作業(yè),注銷用戶;此時(shí)login指令被凍結(jié),新的用戶不能登錄;當(dāng)所有的用戶從系統(tǒng)中注銷或者指定時(shí)間已到時(shí),shutdown就發(fā)送信號(hào)給init程序,要求init程序改變系統(tǒng)運(yùn)行級(jí)別,接著,init程序根據(jù)shutdown指令傳遞過(guò)來(lái)的參數(shù),相應(yīng)的改變運(yùn)行級(jí),例如,shutdown指定的參數(shù)是關(guān)機(jī)命令的話,init程序就執(zhí)行init 0進(jìn)行關(guān)機(jī),如果shutdown指定的參數(shù)是要重啟系統(tǒng),那么init程序就執(zhí)行init 6進(jìn)行系統(tǒng)重啟。
??shutdown命令的詳細(xì)語(yǔ)法:
shutdown [-fFhknrc(參數(shù)名稱)] [-t 秒數(shù)] 時(shí)間 [警告信息]
具體各參數(shù)功能:
-f 重新啟動(dòng)時(shí)不執(zhí)行fsck(注:fsck是Linux下的一個(gè)檢查和修復(fù)文件系統(tǒng)的程序,我們會(huì)在以后章節(jié)詳細(xì)講述)。
-F 重新啟動(dòng)時(shí)執(zhí)行fsck。
-h 將系統(tǒng)關(guān)機(jī),在某種程度上功能與halt命令相當(dāng)。
-k 只是送出信息給所有用戶,但并不會(huì)真正關(guān)機(jī)。
-n 不調(diào)用init程序關(guān)機(jī),而是由shutdown自己進(jìn)行(一般關(guān)機(jī)程序是由shutdown調(diào)用init來(lái)實(shí)現(xiàn)關(guān)機(jī)動(dòng)作),使用此參數(shù)將加快關(guān)機(jī)速度,但是不建議用戶使用此種關(guān)機(jī)方式。
-r shutdown之后重新啟動(dòng)系統(tǒng)。
-c 取消前一個(gè)shutdown命令。例如,當(dāng)執(zhí)行一個(gè)如“shutdown -h 15:30”的命令時(shí),只要按“Ctrl+C”鍵就可以中斷關(guān)機(jī)的命令。而執(zhí)行如“shutdown -h 15:30 & ” 的 命 令 就將 shutdown轉(zhuǎn)到后臺(tái)運(yùn)行了,此時(shí),就需要使用shutdown -c將前一個(gè)shutdown命令取消。
-t<秒數(shù)> 送出警告信息和關(guān)機(jī)信號(hào)之間要延遲多少秒。警告信息將提醒用戶保存當(dāng)前進(jìn)行的工作。
[時(shí)間] 設(shè)置多久時(shí)間后執(zhí)行shutdown命令。時(shí)間參數(shù)有hh:mm或+m兩種模式。
hh:mm格式表示在幾點(diǎn)幾分執(zhí)行shutdown命令。例如 “shutdown 16:50”表示將在16:50執(zhí)行shutdown, +m表示m分鐘后執(zhí)行shutdown, 比較特別的用法是以now表示立即執(zhí)行shutdown, 值得注意的是這部分參數(shù)不能省略。
[警告信息] 要傳送給所有登入用戶的信息。
??應(yīng)用舉例:
立即關(guān)機(jī)重啟:shutdown –r now
立即關(guān)機(jī):shutdown –h now
設(shè)定5分鐘后關(guān)機(jī),同時(shí)發(fā)出警告信息給登錄的linux用戶:
shutdown +5? “System will shutdown after 5 minutes”
2.halt命令
halt是最簡(jiǎn)單的關(guān)機(jī)命令,相當(dāng)于shutdown –h組合,halt執(zhí)行時(shí),kill掉多有應(yīng)用程序,然后調(diào)用系統(tǒng)指令sync,sync將所有內(nèi)存信息通過(guò)文件系統(tǒng)寫入硬盤,然后停止內(nèi)核。
halt命令的部分參數(shù)如下:?
[-f] 沒有調(diào)用shutdown而強(qiáng)制關(guān)機(jī)或重啟。
[-i] 關(guān)機(jī)或重新啟動(dòng)之前,關(guān)掉所有的網(wǎng)絡(luò)接口。?
[-p] 關(guān)機(jī)時(shí)調(diào)用poweroff,此選項(xiàng)為缺省選項(xiàng)。
3.reboot命令
reboot命令的執(zhí)行過(guò)程與halt基本類似,不同的是halt是用于關(guān)機(jī),而reboot是關(guān)機(jī)后引發(fā)系統(tǒng)重啟。
4.init命令
init進(jìn)程是所有進(jìn)程的鼻祖,其進(jìn)程號(hào)始終為1,init程序主要用于系統(tǒng)不同運(yùn)行級(jí)之間的切換,切換的工作是立即完成的,例如init 0就是將系統(tǒng)運(yùn)行級(jí)切換到0,也就是關(guān)機(jī),init 6命令用于將系統(tǒng)運(yùn)行級(jí)別切換到6,也就是重啟系統(tǒng)。
本文轉(zhuǎn)自南非螞蟻51CTO博客,原文鏈接:http://blog.51cto.com/ixdba/533740?,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的Linux系统运行级与启动机制剖析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: VC中显示ICON和BMP图片
- 下一篇: linux 下实现ssh免密钥登录