ubuntu 的啟動過程

2021-08-25 20:08:56 字數 3570 閱讀 3732

一. ubuntu的啟動流程

ubuntu的啟動流程和我們熟知的redhat的啟動方式有所區別。

redhat的啟動過程如下圖:

這是我們熟知的linux啟動流程,但是ubuntu的啟動流程和這個有些區別,我在ubuntu的/etc/目錄下面找不到inittab這個檔案,一開始很納悶ubuntu是怎麼啟動的?一查資料發現ubuntu並沒有採用init的方法,所以在/etc/目錄下面找不到inittab,這主要是因為init採用序列的方式,引導很費時,redhat9啟動時序列執行大量指令碼以及啟動各種需要的服務,因此從ubuntu6.10開始逐步採用upstart來代替init,進行服務程序的管理。為了對原有的init實現向後相容,upstart可以說是在表象上保留了大部分原來init的特性,因此目前ubuntu初始化程序名仍然叫init,而改變的核心,則是event機制。

event機制就是將程序的觸發、停止都看成是event。ubuntu的/etc/下有乙個event.d,這個目錄是upstart的核心。/etc/event.d/下面存放了目前upstart需要識別的各種event。這其中主要有三種:rc-default,rcx(x = 0,1,2,3,4,5,6,s),ttyx(x = 0,1,2,3,4,5,6,s)。

其中rc-default就類似與inittab檔案,用來設定預設執行級別的。cat rc-default,我們可以看到:

# rc - runlevel compatibility #

# this task guesses what the "default runlevel" should be and starts the

start on stopped rcs

script

runlevel --reboot || true

if grep -q -w -- "-s/|single/|s" /proc/cmdline; then

telinit s

elif [ -r /etc/inittab ]; then

rl="$(sed -n -e "/^id:[0-9]*:initdefault:/" /etc/inittab || true)"

if [ -n "$rl" ]; then

telinit $rl

else

telinit 2 fi

else

telinit 2 fi

end script

預設的執行級別是2。

rcx是發生相應執行級別事件時需要執行程式的指令碼,我們再cat一下rc2:

# rc2 - runlevel 2 compatibility #

# this task runs the old sysv-rc runlevel 2 ("multi-user") scripts. it

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/了。

/etc/init.d/中存放的都是服務或者任務的執行指令碼。可以這麼說,只要你安裝了乙個程式(特別是服務程式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/了。

ls一下/etc/rcx.d/,發現裡面全是一堆到/etc/init.d/中的指令碼符號鏈結,不同的是它們的開頭加上了s和乙個數字。熟悉原本init的人應該知道,s表示在啟動時執行,數字則表示執行的先後順序。其中有乙個鏈結叫做s30gdm,gdm的意思是gnome display management,也就是用來啟動gnome桌面的。

綜上所述,upstart管理的ubuntu啟動過程如下圖所示:

二. x-window啟動過程解析

從控制台進入x一般用startx命令,故啟動x應該從startx這個指令碼開始分析。以下是startx指令碼的一部分:

#!/bin/sh

userclientrc=$home/.xinitrc #使用者的client定義檔案

userserverrc=$home/.xserverrc #使用者的server定義檔案

sysclientrc=/usr/x11r6/lib/x11/xinit/xinitrc #系統的client

sysserverrc=/usr/x11r6/lib/x11/xinit/xserverrc #系統的server

defaultclient=/usr/x11r6/bin/xterm #預設的client程式

defaultserver=/usr/x11r6/bin/x #預設的server程式

defaultclientargs="" #下面定義了client和server的引數變數

defaultserverargs=""

clientargs=""

serverargs="" ……

可以看到,startx主要是置x client和x server所在的位置,並處理相關引數,最後交給xinit處理。可以看出startx 設定x client的位置是先搜尋$home/.xinitrc,然後是/etc/x11/xinit/xinitrc;設定x server的位置是先搜尋$home/.xserverrc,然後是/etc/x11/xinit/xserverrc。在ubuntu8.10的$home下面沒有.xinitrc和.xerverrc,所以startx直接去/etc/下面找x-client和x-server,完成啟動x的工作。

總結一下x-window的啟動流程圖:

ubuntu 的啟動過程

一 ubuntu的啟動流程 ubuntu的啟動流程和我們熟知的redhat的啟動方式有所區別。redhat的啟動過程如下圖 這是我們熟知的linux啟動流程,但是ubuntu的啟動流程和這個有些區別,我在ubuntu的 etc 目錄下面找不到inittab這個檔案,一開始很納悶ubuntu是怎麼啟動...

ubuntu 10 04 啟動過程

我的前面的博文已經提到了linux系統的啟動過程,但是由於各distribution的差異,再具體到init程序啟動以後os啟動過程會有所差異。據了解ubuntu9.04以後不再採用 etc inittab啟動,而是採用init和upstart相結合的方式。標準的linux啟動順序是 1 init根...

ubuntu 和upstart啟動過程研究

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