【
看網上很多教程分析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