一 Linux系統啟動流程
1234
POST --> BIOS (Boot Sequence) --> MBR(bootloader)
-> Kernel (CentOS5: initrd, CentOS6: initramfs)
->
/sbin/init
(CentOS5:
/etc/inittab
, CentOS6:
/etc/inittab
,
/etc/init/
*.conf)
二 啟動詳解
(1)POST自檢
123456
POST自檢:第一步就是CPU加電然後定址,而CPU定址所需的代碼指令
來自於ROM->硬體廠商製作(記憶體分為ROM+RAM),關於CPU如何找到
指令代碼的?硬體的設計的思想就是:CPU懂的去特定的位置去尋找
代碼,而代碼得存貯者ROM就應該在特定的位置。與此同時POST自檢
還會檢測記憶體,主板,顯卡,音效卡,網卡等I
/O
裝置,等一切沒有
問題POST自檢完成!將工作移交給BIOS去處理
(2)BIOS
123
BIOS:(Boot Sequence)載入可選擇的啟動裝置->韌體廠商製造
Bios中存放著各種I/O裝置的資訊參數、系統時間、啟動尋找順序
所以必須要檢測Bios是否正常。之後會去載入第一個硬碟裝置
(3)MBR
123
MBR:硬碟的主引導記錄,存在於
0
磁軌第
0
扇區,共
512
位元組。其中Bootloader佔據
446
位元組,分區表佔據
64
位元組,magic num佔據
2
位元組。MBR將載入Bootloader去開始
後邊的工作
(4)Bootloader
123456789
Bootloader(核心載入器)位於第0磁軌第0扇區的446位元組是最前邊
的446位元組哦!Bootloader的工作機制:bootloader可以訪問檔案系
統,而核心則作為檔案而存在。所以bootloader可以訪問核心檔案,
深入的說bootloader訪問核心檔案時,是將核心檔案Vmlinz所在的
整個分區當作根去訪問的,如訪問
/Vmlinz
而根
"/"
本身的存在位置
是由核心檔案自己決定。(因為每個檔案必須要有一個自己的起始路徑)
能理解這種邏輯嗎?
現代我們常用的核心載入器是grub(Grand Unified Bootloader)
以此grub來載入核心。載入核心之前grub所做的工作
第一步 1) grub將核心檔案Vmlinz 和 grub自己載入到了/boot上,
同時也在/boot上存放了所有模組的驅動程式xxx.img檔案
用ll /boot 查看
2) 接下來讓我們查看grub目錄中存放的是什麼
grub目錄中存放著grub.conf自身設定檔,device.map磁碟映射圖(映射分區/boot和/根分區)
你會看到有stage1 stage2 還有各種stage1.5
1234567
1st stage: 位於MBR中,為了引導2nd stage
1.5 stage: 位於boot基本磁碟分區中,為識別
核心檔案所在的檔案系統提供檔案系統識別擴充(因為我們上邊
提到過grub只能識別基本的檔案系統,而核心檔案不可能沒有高
級的檔案系統,所以需要賦予grub能識別核心進階檔案系統的擴
展功能)
2nd stage: 位於boot基本磁碟分區中,GRUB的引導程式
3)查看grub.conf檔案內容和 device.map檔案內容
第二步 1) 上邊我們已經提到grub目錄中存放著device.map磁碟映射分區,接下來我們去查看
映射的根分區/(核心真正掛載的分區)中的各種模組所在的路徑
2)接下來查看路徑下的各個模組.ko檔案
(5)Kernerl
123
Linux屬於單核系統:Kernel+各種外圍模組組成
通過grub載入核心後,核心開始自我解壓並工作
通過虛擬根檔案系統initrfs 調用init工作
(6)/sbin/init 以CentOS6為例
123
/sbin/init
程式被核心第一個所調用,所以init的PID號為1
init調用其設定檔
/etc/inittable
和啟動指令碼
/etc/init/rcS
.conf
從而啟動各個子進程
/etc/inittable
/etc/rc.d 目錄中存放著123456運行層級的目錄
以rc3.d為例,目錄中存放著進程, 進程運行層級 ,進程狀態(K為開啟、S為關閉)——>
init就是控制進程是K還是S得總管 (當系統在1 2 3 4 5 6 之間切換時由父進程fork而來的
子進程就會在K與S之間切換狀態)
PS:以上為個人理解的Linix啟動和初始化流程,如果有問題請各位大神細心指點
繩命是如此的精彩~