原文:
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的人大多應該知道,init程序(pid=1)乃是所有程序的父程序,所有程序由它控制。init程序的執行時間是核心完成檔案系統的載入後。那麼init程序是如何開啟系統中的其它程序的呢?在闡述這個問題之前,大致地說明一下目前ubuntu中與init相關的幾個目錄和應用程式,可以方便後面的論述。這些目錄和程式包括:
init
telinit
runlevel
/etc/event.d/
/etc/init.d/
/etc/rcx.d/
前三個是應用程式(注意哦,它們都不是shell指令碼),可以理解為是由核心呼叫的。關於它們的功能,從manpage檢視就可以了。我們的重點是後面給出的三個目錄。
首先是/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
fiexec /etc/init.d/rc 2
end script
.. 不去考慮細節,只要注意到前兩行和倒數第二行就可以了。可以看到,rc2檔案是定義在發生執行級別2的時候所要執行的東西,核心就是這句:exec /etc/init.d/rc 2。這樣,我們就可以自然地過渡到下乙個重要的目錄,/etc/init.d/了。
你可以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表示在啟動時執行,數字則表示執行的先後順序。
這樣一來,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)
理解了這些,手動配置開機服務的啟動與否就很簡單了。ubutnu預設的啟動級別是2,不想啟動的程式,只要把相應的符號鏈結從/etc/rc2.d/中刪去即可!
Upstart與ubuntu啟動過程,簡單原理
ubuntu從6.10開始逐步用upstart代替原來的sysinit,進行服務程序的管理。也正是從6.10開始,ubuntu的啟動過程開始變得有點 變幻莫測 也沒辦法,這是正在開發中的upstart不可避免的。為了對原有的init實現向後相容,upstart可以說是在表象上保留了大部分原來init...
windows 和 Ubuntu雙系統修改啟動順序
前段時間裝了win8.1和ubuntu14.04雙系統,不過開機預設啟動的是ubuntu,如果有同學覺得不習慣,或者預設不想啟動ubuntu,我們可以通過以下方式修改,該修改不會改變啟動項的順序,只是會在開機的時候使游標預設停留在你設定的那個啟動項上,因為啟動項grub是ubuntu提供的,所以我們...
Ubuntu安裝Openoffice並啟動服務
前言 專案中要用到文件預覽功能,經查閱需要用到openoffice外掛程式,現將ubuntu上的安裝總結如下 1.解除安裝ubuntu自帶的libreoffice 3.解壓openoffice 4.1.7安裝包 64 bit tar xvf apache openoffice 4.1.7 linux...