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方式,基於事件機制,系統的所有服務,任務都是由事件驅動的。至於這個,並不複雜,只是改成由事件驅動。

採用後一種方式的目前有UbuntuFedoraDebian

Ubuntu由於採用 Upstart方式,它上面是沒有inittab這個文件的。

  Ubuntu使用的是Upstart方式的initializationUbuntu採用的是兼容模式,即:系統中既有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-sysinitstartup事件發生時被啓動,rc在系統runlevel變化時被啓動,rcS在系統runlevelS時啓動

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

由於系統的默認runlevel發生了變化, 由於調用了telinit進入了設定的runlevelrunlevel改變的事件發生,此時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中根據ks來進行執行或者終止軟鏈接所對應的/etc/init.d/服務

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

  常規中,默認安裝Linux會直接到圖形界面。Ubuntu安裝後默認的run level2,這個可以用runlevel命令查看。因爲runlevel=2,所以在啓動過程中自動執行/etc/rc2.d/目錄下的以S開頭的腳 本。Ubuntu之所以能直接啓動到圖形界面,是由於運行gdm所致。所以,只要把gdm的啓動腳本禁用就可以了,方法就是把文件名的第一個字母S改成 K

一般的linux8個級別:0-6和一個'S'級別。

對各個運行級的詳細解釋:

爲停機,機器關閉。

爲單用戶模式,就像Win9x下的安全模式類似。

爲多用戶模式,但是沒有NFS支持。

爲完整的多用戶模式,是標準的運行級。

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

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

爲重啓,運行init 6機器就會重啓。

'S'級別是一個比較特殊的級別,他應該是先於其他級別運行的級別。

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

這裏說明一下,0-6級別的運行是互斥的,而不是疊加運行,

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

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章