主要的啟動流程
初始化bios→執行啟動加載器→載入內核→啟動init服務
BIOS
1.1檢測所有外設
檢測有那些外設,以及外設的錯誤
1.2尋找啟動設備
依據BIOS裡面設置的啟動順序來尋找可以啟動的設備(CD-ROM、IDE-HDD、Floppy….)
啟動加載器
BIOS找到啟動設備後,接下來就是啟動該設備中的操作系統。BIOS會試著依照下列的順序找出啟動扇區,也就是主引導記錄(MBR)的磁區。
2.1尋找硬盤的第一個扇區,也就是主引導記錄。
2.2如果主引導記錄中沒有存儲操作系統,則尋找磁盤中標注為啟動分區(BootPartition)的第一個扇區中的操作系統。
不管是主引導記錄扇區還是啟動分區中的第一個扇區,存儲操作系統的空間都只有446個字節。目前的操作系統沒法擠在這麼小的空間內。如果沒有辦法在上面提到的扇區中存儲操作系統的內核,那麼,就會使BIOS無法繼續啟動的工作。為了避免重新定制BIOS的規則,又能讓BIOS可以順利啟動存儲於其他位置的操作系統內核,人們想出來的辦法就是寫一個小小的程序,存儲到啟動扇區的前446個字節空間內。然後再由這個小程序來加載存儲到其他位置的操作系統。
這個小程序就是“啟動加載器”(linux默認是GRUB)
啟動內核
當BIOS順利的執行啟動加載器後,啟動加載器會尋找存儲在其他扇區的操作系統,然後啟動它。Linux內核啟動後會執行下列幾項工作
3.1檢測所有的硬件設備
內核向BIOS查詢計算機的所有硬件信息,然後自己接管這些硬件設備,以便提供給系統使用。
3.2驅動硬件設備
接著linux驅動硬件
要驅動硬件設備,就必須加載它的驅動。linux的驅動程序分為編譯在內核的靜態驅動程序與內核模塊的動態驅動程序兩種。其中動態驅動程序存儲在文件系統中。
由於此時還沒有掛載任何文件系統,所以只能使用靜態驅動程序,驅動一些其能驅動的程序。其他的硬件要等到掛載完根文件系統後才能驅動。
以只讀的方式掛載根文件系統
接著linux內核會嘗試著去掛載根文件系統,掛載根文件系統有兩個目地。
安裝適當的內核模塊,以便驅動某些硬件設備或啟動某些功能。
啟動存儲於根文件的init服務,以便讓init服務接管後續的啟動工作。
啟動init服務
啟動內核後的最後一個動作就是啟動init服務。linux內核會按照如下順
序來尋找init服務。
找/sbin/是否有init服務
找/etc/init
找/bin/init
如果都找不到,最後執行/bin/sh
初始化系統環境
啟動init服務時,init服務會讀取/etc/inittab文件,根據該文件的設置進行初始化系統環境的工作。該文件定義init服務在linux啟動過程中必須依序執行以下幾個Script。
/etc/init.d/rc.sysinit
/etc/init.d/rc
/etc/init.d/rc.local
下面介紹一下這幾個RCScript都做了什麼事情
/etc/init.d/rc.sysinit
啟動udev與SELinux子系統
設置內核參數
設置系統時間
加載鍵盤對應表
啟用虛擬內存空間
設置主機名
檢測並掛載所有文件系統
初始化硬件
啟用軟件磁盤陣列與LVM
初始化串行端口
清除過期的鎖定文件與IPC文件
重新設置硬盤參數
/etc/rc.d/rc
這個用來建立RunLevel環境
/etc/rc.d/rc.local
存放用戶啟動的腳本