Upstart與ubuntu啟動過程,簡單原理

2021-07-05 02:16:38 字數 2776 閱讀 3093

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/中刪去即可。

//注:

unbuntu  14.10版本 已經沒有 /etc/event.d/ 檔案,取而代之的是 etc/init/ ,其中就是對每個初始化啟動程序的配置

ubuntu 和upstart啟動過程研究

原文 ubuntu從6.10開始逐步用upstart代替原來的sysinit,進行服務程序的管理。也正是從6.10開始,ubuntu的啟動過程開始變得有點 變幻莫測 也沒辦法,這是正在開發中的upstart不可避免的。為了對原有的init實現向後相容,upstart可以說是在表象上保留了大部分原來i...

Ubuntu安裝Openoffice並啟動服務

前言 專案中要用到文件預覽功能,經查閱需要用到openoffice外掛程式,現將ubuntu上的安裝總結如下 1.解除安裝ubuntu自帶的libreoffice 3.解壓openoffice 4.1.7安裝包 64 bit tar xvf apache openoffice 4.1.7 linux...

Ubuntu設定服務自啟

1.進入 etc init.d目錄下 cd etc init.d 2.建立啟動指令碼run script.sh touch run script.sh 3.編輯檔案,儲存以下內容 vi run script.sh bin sh begin init info provides gw required...