Ubuntu init启动流程分析浅析
? ? ? ? ? ? ?Ubuntu init啟動(dòng)流程
Linux distros主流的有兩種init方式:
一種是System V initialization,它來(lái)源于Unix并至今仍被各種Linux distros所采用;
一種是近幾年提出的Upstart方式,基于事件機(jī)制,系統(tǒng)的所有服務(wù),任務(wù)都是由事件驅(qū)動(dòng)的。
采用后一種方式的目前有Ubuntu,Fedora,Debian。
Ubuntu由于采用 Upstart方式,它上面是沒有inittab這個(gè)文件的。在舊式的System V initialization中,/etc/inittab可是個(gè)相當(dāng)重要文件。Init進(jìn)程啟動(dòng)后第一時(shí)間找的就是它! Upstart job是事件驅(qū)動(dòng)的,系統(tǒng)服務(wù)的啟動(dòng)、停止等等均是由事件決定的,反過(guò)來(lái),系統(tǒng)服務(wù)的啟動(dòng)、停止也可以作為事件源觸發(fā)其他服務(wù)。并且事件并不一定得由系統(tǒng)內(nèi)部產(chǎn)生,用戶可以手工的鍵入start/stop [Service]產(chǎn)生事件來(lái)啟動(dòng)/終止服務(wù)。run level也被當(dāng)作事件來(lái)對(duì)待(因runlevel的改變而產(chǎn)生的事件)。那么系統(tǒng)服務(wù)又是如何知道自己應(yīng)該什么時(shí)候啟動(dòng),什么時(shí)候終止的呢?答案就在于/etc /init中,它里面均是系統(tǒng)服務(wù)的配置文件,是job definition files。
實(shí)際上并不僅僅在系統(tǒng)啟動(dòng)初期,在系統(tǒng)運(yùn)轉(zhuǎn)的任何時(shí)期都可以通過(guò)發(fā)送事件來(lái)啟動(dòng)或終止服務(wù)。這便是Upstart job的優(yōu)點(diǎn)之一,除了用于系統(tǒng)初始化,還可以在系統(tǒng)運(yùn)行階段發(fā)揮作用。相比之下System V initialization方式下的配置文件一般只用于系統(tǒng)初始化階段,當(dāng)然系統(tǒng)運(yùn)行階段我們可以通過(guò)/etc/init.d/Service start/stop/otherCommand來(lái)操作服務(wù),但很明顯不如Upstart方式簡(jiǎn)潔明白。
Ubuntu使用的是Upstart方式的initialization,Ubuntu采用的是兼容模式,即:系統(tǒng)中既有System V-style啟動(dòng)的服務(wù),也有Upstart啟動(dòng)的服務(wù)。以Ubuntu11.04,你可以看到系統(tǒng)中有這么幾個(gè)目錄:
/etc/init
/etc/init.d
/etc/rc${runlevel}.d
進(jìn)入/etc/init目錄(Upstart init會(huì)到該目錄下讀取配置文件),有幾個(gè)和rc有關(guān)的配置文件:
rc.conf
rc-sysinit.conf
rcS.conf
rc-sysinit在startup事件發(fā)生時(shí)被啟動(dòng),rc在系統(tǒng)runlevel變化時(shí)被啟動(dòng),rcS在系統(tǒng)runlevel為S時(shí)啟動(dòng)。
rc-sysinit在startup事件發(fā)生時(shí)被啟動(dòng),Upstart init會(huì)首先讀取rc-sysinit.conf并執(zhí)行相關(guān)配置和腳本。rc-sysinit.conf的主要工作是設(shè)置系統(tǒng)默認(rèn)runlevel,檢測(cè)是否存在/etc/inittab或內(nèi)核命令行,若存在,則按內(nèi)核命令行>/etc/inittab>默認(rèn)runlevel的順序設(shè)置系統(tǒng) runlevel。最后,調(diào)用telinit進(jìn)入設(shè)置的runlevel。
由于系統(tǒng)的默認(rèn)runlevel發(fā)生了變化, 由于調(diào)用了telinit進(jìn)入了設(shè)定的runlevel,runlevel改變的事件發(fā)生,此時(shí)rc服務(wù)啟動(dòng)(當(dāng)然其他服務(wù)也會(huì))。打開rc.conf文件,查看最后一行:
exec /etc/init.d/rc $RUNLEVEL
很明顯,/etc/init.d/rc被調(diào)用了,并且傳入了早前設(shè)置好的系統(tǒng)runlevel作為參數(shù)。而/etc/init.d/rc會(huì)根據(jù)傳入 的runlevel參數(shù)調(diào)用/etc/rc${runlevel}.d/下的腳本(以S開頭)以啟動(dòng)服務(wù)。在/etc/rc${runlevel}.d/下,發(fā)現(xiàn)里面的文件都是到/etc /init.d/下對(duì)應(yīng)的腳本/程序的軟鏈接。以S開頭的為啟動(dòng)的意思,以K開頭的為停止。并且S/K后面的兩位數(shù)數(shù)字代表了服務(wù)的啟動(dòng)順序(由服務(wù)依賴關(guān)系決定)。凡是以S開頭的就是本次要啟動(dòng)服務(wù),凡是以k開頭的,就是要在本次runlevel啟動(dòng)的時(shí)候要終止掉的服務(wù)。
整體 Init啟動(dòng)總結(jié):
1.內(nèi)核啟動(dòng)init進(jìn)程。
2.init找到/etc/init/rc-sysinit.conf文件,確定默認(rèn)的運(yùn)行級(jí)別(假設(shè)為X)。
3.觸發(fā)相應(yīng)的runlevel事件,開始運(yùn)行/etc/rc.conf
4.傳遞參數(shù),運(yùn)行/etc/init.d/rc,傳入?yún)?shù)X,并且最后調(diào)用/etc/rc${runlevel}.d
5./etc/rc${runlevel}.d中根據(jù)k和s來(lái)進(jìn)行執(zhí)行或者終止軟鏈接所對(duì)應(yīng)的/etc/init.d/服務(wù)
6. 最后按照事先設(shè)定的優(yōu)先級(jí)依次啟動(dòng),直至最后給出登錄畫面
常規(guī)中,默認(rèn)安裝Linux會(huì)直接到圖形界面。Ubuntu安裝后默認(rèn)的run level為2,這個(gè)可以用runlevel命令查看。因?yàn)?/font>runlevel=2,所以在啟動(dòng)過(guò)程中自動(dòng)執(zhí)行/etc/rc2.d/目錄下的以S開頭的腳 本。Ubuntu之所以能直接啟動(dòng)到圖形界面,是由于運(yùn)行gdm所致。所以,只要把gdm的啟動(dòng)腳本禁用就可以了,方法就是把文件名的第一個(gè)字母S改成 K:
一般的linux分8個(gè)級(jí)別:0-6和一個(gè)'S'級(jí)別。
# 對(duì)各個(gè)運(yùn)行級(jí)的詳細(xì)解釋:
0 為停機(jī),機(jī)器關(guān)閉。
1 為單用戶模式,就像Win9x下的安全模式類似。
2 為多用戶模式,但是沒有NFS支持。
3 為完整的多用戶模式,是標(biāo)準(zhǔn)的運(yùn)行級(jí)。
4 一般不用,在一些特殊情況下可以用它來(lái)做一些事情。例如在筆記本電腦的電池用盡時(shí),可以切換到這個(gè)模式來(lái)做一些設(shè)置。
5 就是X11,進(jìn)到X Window系統(tǒng)了。
6 為重啟,運(yùn)行init 6機(jī)器就會(huì)重啟。
'S'級(jí)別是一個(gè)比較特殊的級(jí)別,他應(yīng)該是先于其他級(jí)別運(yùn)行的級(jí)別。
在userlinux(包括ubuntu)中2-5級(jí)別是毫無(wú)差別的。
這里說(shuō)明一下,0-6級(jí)別的運(yùn)行是互斥的,而不是疊加運(yùn)行,
所有的運(yùn)行服務(wù)的腳本存儲(chǔ)在/etc/init.d/里面。而在/etc/中有rc'X'.d的文件夾,'X'代表0-6和X,也就對(duì)應(yīng)了這8個(gè)啟動(dòng)級(jí)別,里面就都是指向/etc/init.d/里面運(yùn)行服務(wù)的腳本的軟連接(symbol link),軟連接的數(shù)目少于運(yùn)行腳本數(shù),這就是說(shuō)不是所有服務(wù)都要在一個(gè)級(jí)別中運(yùn)行的。軟連接的命名是有規(guī)則的:[K|S][0-90-9][name],K代表kill,S代表start,后面是個(gè)二位數(shù),最后是對(duì)應(yīng)的運(yùn)行服務(wù)的腳本文件名。這個(gè)名字是在運(yùn)行相應(yīng)的腳本的時(shí)候傳遞的參數(shù),K是傳遞stop(就是關(guān)閉服務(wù)),S是傳遞start(就是啟動(dòng)服務(wù))。
運(yùn)行順序:K小數(shù)->K大數(shù)->S小數(shù)->S大數(shù)。這里注意文件夾里的所有軟連接都會(huì)被執(zhí)行,不論K或者S。
?
轉(zhuǎn)載于:https://blog.51cto.com/computerdragon/1119244
總結(jié)
以上是生活随笔為你收集整理的Ubuntu init启动流程分析浅析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【转】软件工程师的年终总结2
- 下一篇: 管理“我的右上角” : 介绍菜单栏图标软