天天看點

Linux系統init啟動流程

 【

看網上很多教程分析Linux啟動過程中提到inittab這個檔案,然後發現Ubuntu下并沒有/etc/inittab這個東西。今天想到 這個問題,學Linux系統,不明白他到底是怎麼運作起來的總是有點迷迷糊糊。

  】

  其實沒有想象中的複雜,一步步,分析清楚,對比自己的Linux系統觀察一些配置檔案。

這裡主要探讨Linux核心加載後如何執行初始化系統,關于BIOS。GRUB如何加載核心的過程各位自己找資料看。總的流程大體如此,部落客雖然說得不夠細,但是大概流程如此:

http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html

推薦大家看看這個:

鳥哥的教程:http://vbird.dic.ksu.edu.tw/linux_basic/fedora_4/0510osloader-fc4.php#startup_loader

首先今天了解了一個概念,關于Linux主流的兩種init方式:

一種是System V initialization,它來源于Unix并至今仍被各種Linux distros所采用;這也是上面鳥哥的教程中所說的

一種是近幾年提出的Upstart方式,基于事件機制,系統的所有服務,任務都是由事件驅動的。至于這個,并不複雜,隻是改成由事件驅動。

采用後一種方式的目前有Ubuntu,Fedora,Debian。

Ubuntu由于采用 Upstart方式,它上面是沒有inittab這個檔案的。

  Ubuntu使用的是Upstart方式的initialization,Ubuntu采用的是相容模式,即:系統中既有System V-style啟動的服務,也有Upstart啟動的服務。以Ubuntu11.04,你可以看到系統中有這麼幾個目錄:

/etc/init

/etc/init.d

/etc/rc${runlevel}.d

 進入/etc/init目錄(Upstart init會到該目錄下讀取配置檔案),有幾個和rc有關的配置檔案:

rc.conf

rc-sysinit.conf

rcS.conf

  rc-sysinit在startup事件發生時被啟動,rc在系統runlevel變化時被啟動,rcS在系統runlevel為S時啟動。

  rc-sysinit在startup事件發生時被啟動,Upstart init會首先讀取rc-sysinit.conf并執行相關配置和腳本。rc-sysinit.conf的主要工作是設定系統預設runlevel,檢測是否存在/etc/inittab或核心指令行,若存在,則按核心指令行>/etc/inittab>預設runlevel的順序設定系統 runlevel。最後,調用telinit進入設定的runlevel。

由于系統的預設runlevel發生了變化, 由于調用了telinit進入了設定的runlevel,runlevel改變的事件發生,此時rc服務啟動(當然其他服務也會)。打開rc.conf檔案,檢視最後一行:

exec /etc/init.d/rc $RUNLEVEL

  很明顯,/etc/init.d/rc被調用了,并且傳入了早前設定好的系統runlevel作為參數。而/etc/init.d/rc會根據傳入 的runlevel參數調用/etc/rc${runlevel}.d/下的腳本(以S開頭)以啟動服務。在/etc/rc${runlevel}.d/下,發現裡面的檔案都是到/etc /init.d/下對應的腳本/程式的軟連結。以S開頭的為啟動的意思,以K開頭的為停止。并且S/K後面的兩位數數字代表了服務的啟動順序(由服務依賴關系決定)。凡是以S開頭的就是本次要啟動服務,凡是以k開頭的,就是要在本次runlevel啟動的時候要終止掉的服務。

整體 Init啟動總結:

1.核心啟動init程序。

2.init找到/etc/init/rc-sysinit.conf檔案,确定預設的運作級别(假設為X)。

3.觸發相應的runlevel事件,開始運作/etc/rc.conf

4.傳遞參數,運作/etc/init.d/rc,傳入參數X,并且最後調用/etc/rc${runlevel}.d

5./etc/rc${runlevel}.d中根據k和s來進行執行或者終止軟連結所對應的/etc/init.d/服務

6. 最後按照事先設定的優先級依次啟動,直至最後給出登入畫面

  正常中,預設安裝Linux會直接到圖形界面。Ubuntu安裝後預設的run level為2,這個可以用runlevel指令檢視。因為runlevel=2,是以在啟動過程中自動執行/etc/rc2.d/目錄下的以S開頭的腳 本。Ubuntu之是以能直接啟動到圖形界面,是由于運作gdm所緻。是以,隻要把gdm的啟動腳本禁用就可以了,方法就是把檔案名的第一個字母S改成 K:

一般的linux分8個級别:0-6和一個'S'級别。

# 對各個運作級的詳細解釋:

0 為停機,機器關閉。

1 為單使用者模式,就像Win9x下的安全模式類似。

2 為多使用者模式,但是沒有NFS支援。

3 為完整的多使用者模式,是标準的運作級。

4 一般不用,在一些特殊情況下可以用它來做一些事情。例如在筆記本電腦的電池用盡時,可以切換到這個模式來做一些設定。

5 就是X11,進到X Window系統了。

6 為重新開機,運作init 6機器就會重新開機。

'S'級别是一個比較特殊的級别,他應該是先于其他級别運作的級别。

在userlinux(包括ubuntu)中2-5級别是毫無差别的。

這裡說明一下,0-6級别的運作是互斥的,而不是疊加運作,

所有的運作服務的腳本存儲在/etc/init.d/裡面。而在/etc/中有rc'X'.d的檔案夾,'X'代表0-6和X,也就對應了這8個啟動級别,裡面就都是指向/etc/init.d/裡面運作服務的腳本的軟連接配接(symbol link),軟連接配接的數目少于運作腳本數,這就是說不是所有服務都要在一個級别中運作的。軟連接配接的命名是有規則的:[K|S][0-90-9][name],K代表kill,S代表start,後面是個二位數,最後是對應的運作服務的腳本檔案名。這個名字是在運作相應的腳本的時候傳遞的參數,K是傳遞stop(就是關閉服務),S是傳遞start(就是啟動服務)。

  參考:http://blog.csdn.net/heqiyu34/article/details/18793857

繼續閱讀