ubuntu從6.10開始逐步用upstart代替原來的sysinit,進行服務進程的管理。也正是從6.10開始,ubuntu的啓動過程開始變得有點「變幻莫測」。也沒辦法,這是正在開發中的upstart不可避免的。爲了對原有的init實現向後兼容,upstart能夠說是在表象上保留了大部分原來init的特性,於是目前linux初始化進程名仍然叫init,而改變的核心,乃是Event機制。理解並講清楚這個改變的重要意義和內在機理可不是件容易的事,因此我只打算研究一下目前upstart(0.3.9, ubuntu 8.04)在系統啓動中的表象行爲。[注:據Scott James Remnant在其博客上所說,upstart 0.5.0版本將在將來幾周發佈。linux
關於系統啓動,熟悉Linux的人大多應該知道,init進程(PID=1)乃是全部進程的父進程,全部進程由它控制。init進程的運行時間是內核完成文件系統的加載後。那麼init進程是如何開啓系統中的其它進程的呢?在闡述這個問題以前,大體地說明一下目前ubuntu中與init相關的幾個目錄和應用程序,能夠方便後面的論述。這些目錄和程序包括:
{{{
init
telinit
runlevel
/etc/event.d/
/etc/init.d/
/etc/rcX.d/
}}}
前三個是應用程序(注意哦,它們都不是shell腳本),能夠理解爲是由內核調用的。關於它們的功能,從manpage查看就能夠了。咱們的重點是後面給出的三個目錄。shell
首先是/etc/event.d/目錄,這是upstart的核心,upstart不一樣於原有的init的地方就在於它引入了event機制。Event 機制通俗的講就是將全部進程的觸發、中止等等都看做event(事件)。/etc/event.d/中就存放了目前upstart須要識別的event。這其中主要有三種rc-default, rcX(x=0,1,...6,S)以及ttyX。這rc-default就相似於那大名鼎鼎的inittab文件,它就是設置默認運行級別的 [注:upstart中實際並無運行級別的概念,這麼稱呼是爲了init向後的兼容性]。如今你應該知道了ubuntu裏沒有了inittab文件後該到哪裏設置默認運行級別的了吧!cat rc-default一下吧!rcX文件是發生相應運行級別事件(能夠注意到event這個詞在upstart裏真是無處不見啊)時,須要運行程序的腳本,而ttyX則是設置僞終端數目的,也就是你Ctrl Alt F(1~6)調出的那個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文件是定義在發生運行級別2的時候所要執行的東西,核心就是這句:exec /etc/init.d/rc 2。這樣,咱們就能夠天然地過渡到下一個重要的目錄,/etc/init.d/了。ubuntu
你能夠ls /etc/init.d/看一下里面的內容,對它有個大體的瞭解。/etc/init.d/中存放的是服務(services)或者任務(tasks)的執行腳本。能夠這麼說,只要你安裝了一個程序(特別是服務程序daemon),它能夠在系統啓動的時候運行,那麼它一定會在/etc/init.d/中有一個腳本文件。咱們還回到上面的rc2文件,它執行了一個exec /etc/init.d/rc 2的命令。也就是說,給/etc/init.d/rc腳本傳遞了一個參數"2",讓它執行。咱們仔細查看一下rc腳本(很長,耐心點),能看到這樣的一段:
{{{
# 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*
.......
}}}
這說明,當給rc腳本傳遞一個數字參數"X"的時候,它在通過一系列的設置後,將會開始執行/etc/rcX.d/下S開頭的腳本。這就過渡到下一個目錄/etc/rcX.d/了。服務器
進入/etc/rcX.d/,ls -l /etc/rcX.d/看看有些什麼內容?哈哈,沒錯,都是一些到/etc/init.d/中腳本的符號連接。不一樣的是它們的開頭加上了S和一個數字。熟悉本來init的人應該知道,S表示在啓動時運行,數字則表示執行的前後順序。this
這樣一來,upstart管理的ubuntu啓動過程應該就清楚了。梳理一下:
1,內核啓動init
2,init找到/etc/event.d/rc-default文件,肯定默認的運行級別(X)
3,觸發相應的runlevel事件,開始運行/etc/event.d/rcX
4,rcX運行/etc/init.d/rc,傳入參數X
5,/etc/init.d/rc腳本進行一系列設置,最後運行相應的/etc/rcX.d/中的腳本
6,/etc/rcX.d/中的腳本按事先設定的優先級依次啓動,直至最後給出登陸畫面(啓動X服務器和GDM)spa
理解了這些,手動配置開機服務的啓動與否就很簡單了。Ubutnu默認的啓動級別是2,不想啓動的程序,只要把相應的符號連接從/etc/rc2.d/中刪去便可進程