|
19樓

樓主 |
發(fā)表于 2009-11-13 15:22:36
|
只看該作者
ubuntu 啟動(dòng)調用的不是inittab,而是/ectc/event.d/rc-default !
可能是修改了init文件吧。沒(méi)看源碼。
花了不少功夫才發(fā)現的。
upstart和ubuntu啟動(dòng)過(guò)程原理介紹
作者:貝殼漢姆 出處:IT實(shí)驗室系統管理 2009年10月30日 00:00 進(jìn)入論壇
相關(guān)主題:
* ubuntu 啟動(dòng)
* ubuntu 啟動(dòng)項
* ubuntu 啟動(dòng)順序
* ubuntu 啟動(dòng)菜單
* ubuntu 啟動(dòng)界面
* ubuntu 開(kāi)機啟動(dòng)
* ubuntu u盤(pán)啟動(dòng)
* ubuntu 啟動(dòng)程序
* ubuntu mysql啟動(dòng)
* ubuntu 啟動(dòng)ssh
ubuntu從6.10開(kāi)始逐步用upstart代替原來(lái)的sysinit,進(jìn)行服務(wù)進(jìn)程的管理。也正是從6.10開(kāi)始,ubuntu的啟動(dòng)過(guò)程開(kāi)始變得有點(diǎn)“變幻莫測”。也沒(méi)辦法,這是正在開(kāi)發(fā)中的upstart不可避免的。為了對原有的 init實(shí)現向后兼容,upstart可以說(shuō)是在表象上保留了大部分原來(lái)init的特性,因而目前l(fā)inux初始化進(jìn)程名仍然叫init,而改變的核心,乃是Event機制。理解并講清楚這個(gè)改變的重要意義和內在機理可不是件容易的事,所以我只打算研究一下目前 upstart(0.3.9, ubuntu 8.04)在系統啟動(dòng)中的表象行為。[注:據Scott James Remnant在其博客上所說(shuō),upstart 0.5.0版本將在未來(lái)幾周發(fā)布。]
關(guān)于系統啟動(dòng),熟悉Linux的人大多應該知道,init進(jìn)程(PID=1)乃是所有進(jìn)程的父進(jìn)程,所有進(jìn)程由它控制。init進(jìn)程的運行時(shí)間是內核完成文件系統的加載后。那么init進(jìn)程是如何開(kāi)啟系統中的其它進(jìn)程的呢?在闡述這個(gè)問(wèn)題之前,大致地說(shuō)明一下目前ubuntu中與init相關(guān)的幾個(gè)目錄和應用程序,可以方便后面的論述。這些目錄和程序包括:
init
telinit
runlevel
/etc/event.d/ /etc/init.d/ /etc/rcX.d/
前三個(gè)是應用程序(注意哦,它們都不是shell腳本),可以理解為是由內核調用的。關(guān)于它們的功能,從manpage查看就可以了。我們的重點(diǎn)是后面給出的三個(gè)目錄。
首先是/etc/event.d/目錄,這是upstart的核心,upstart不同于原有的init的地方就在于它引入了event機制。Event 機制通俗的講就是將所有進(jìn)程的觸發(fā)、停止等等都看作event(事件)。/etc/event.d/中就存放了目前upstart需要識別的event。這其中主要有三種rc-default, rcX(x=0,1,...6,S。sysv-rc-conf這個(gè)工具里就顯示了0,1,...6,S這幾個(gè)級別)以及ttyX。這rc-default 就類(lèi)似于那大名鼎鼎的inittab文件,它就是設置默認運行級別的 [注:upstart中實(shí)際并沒(méi)有運行級別的概念,這么稱(chēng)呼是為了init向后的兼容性],F在你應該知道了ubuntu里沒(méi)有了inittab文件后該到哪里設置默認運行級別的了吧!cat rc-default一下吧!rcX文件是發(fā)生相應運行級別事件(可以注意到event這個(gè)詞在upstart里真是無(wú)處不見(jiàn)啊)時(shí),需要運行程序的腳本,而ttyX則是設置偽終端數目的,也就是你Ctrl+Alt+F(1~6)調出的那個(gè)Console。我們以rc2為例,cat rc2:
start on runlevel 2
stop on runlevel [!2]
console output
script
set $(runlevel --set 2 || true)
if [ "$1" != "unknown" ]; then
PREVLEVEL=$1
RUNLEVEL=$2
export PREVLEVEL RUNLEVEL
fi
exec /etc/init.d/rc 2
end script
..
不去考慮細節,只要注意到前兩行和倒數第二行就可以了?梢钥吹,rc2文件是定義在發(fā)生運行級別2的時(shí)候所要執行的東西,核心就是這句:exec /etc/init.d/rc 2。這樣,我們就可以自然地過(guò)渡到下一個(gè)重要的目錄,/etc/init.d/了。
你可以ls /etc/init.d/看一下里面的內容,對它有個(gè)大致的了解。/etc/init.d/中存放的是服務(wù)(services)或者任務(wù)(tasks)的執行腳本?梢赃@么說(shuō),只要你安裝了一個(gè)程序(特別是服務(wù)程序daemon),它可以在系統啟動(dòng)的時(shí)候運行,那么它必定會(huì )在/etc/init.d/中有一個(gè)腳本文件。我們還回到上面的rc2文件,它執行了一個(gè)exec /etc/init.d/rc 2的命令。也就是說(shuō),給/etc/init.d/rc腳本傳遞了一個(gè)參數"2",讓它執行。我們仔細查看一下rc腳本(很長(cháng),耐心點(diǎn)),能看到這樣的一段:
# Now run the START scripts for this runlevel.
# Run all scripts with the same level in parallel
....... for s in /etc/rc$runlevel.d/S* .......
這說(shuō)明,當給rc腳本傳遞一個(gè)數字參數"X"的時(shí)候,它在經(jīng)過(guò)一系列的設置后,將會(huì )開(kāi)始執行/etc/rcX.d/下S開(kāi)頭的腳本。這就過(guò)渡到下一個(gè)目錄/etc/rcX.d/了。
進(jìn)入/etc/rcX.d/,ls -l /etc/rcX.d/看看有些什么內容?哈哈,沒(méi)錯,都是一些到/etc/init.d/中腳本的符號鏈接。不同的是它們的開(kāi)頭加上了S和一個(gè)數字。熟悉原本init的人應該知道,S表示在啟動(dòng)時(shí)運行,數字則表示執行的先后順序。
這樣一來(lái),upstart管理的ubuntu啟動(dòng)過(guò)程應該就清楚了。梳理一下:1,內核啟動(dòng)init 2,init找到/etc/event.d/rc-default文件,確定默認的運行級別(X) 3,觸發(fā)相應的runlevel事件,開(kāi)始運行/etc/event.d/rcX 4,rcX運行/etc/init.d/rc,傳入參數X 5,/etc/init.d/rc腳本進(jìn)行一系列設置,最后運行相應的/etc/rcX.d/中的腳本6,/etc/rcX.d/中的腳本按事先設定的優(yōu)先級依次啟動(dòng),直至最后給出登錄畫(huà)面(啟動(dòng)X(jué)服務(wù)器和GDM)
理解了這些,手動(dòng)配置開(kāi)機服務(wù)的啟動(dòng)與否就很簡(jiǎn)單了。Ubutnu默認的啟動(dòng)級別是2,不想啟動(dòng)的程序,只要把相應的符號鏈接從/etc/rc2.d/中刪去即可! |
|