在linux社區中看到了這篇文章,關於啟動的,還是得好好學習一下!
主要的啟動流程
初始化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
存放使用者啟動的指令碼