參考:《鳥哥的linux私房菜》
1、BIOS階段
主板上的BIOS為塊flash或EEPROM程式,他會從主板上的CMOS硬體資訊,這些硬體資訊是可以通過BIOS程式修改。、、
BIOS進行啟動自我測試(Power-on self test,POST),然後開始運行硬體偵測的初始化,並配置PnP裝置,之後定義出可啟動裝置。即
根據BIOS中設定的啟動目標裝置(硬碟還是隨身碟還是光碟片),進入階段2
2、boot loader階段
讀取並回合組態的第一個啟動裝置中MBR去的的Boot loader(即grub,spfdisk等程式),由於每個檔案系統(filesystem和分割槽並不等價,參見鳥哥的linxu私房菜)第一個扇區為開機磁區(boot sector)(512bytes),而開機磁區中包含MBR(446bytes)和分割表(partition table)(64byte),由於MBR大小的限制,例如grub
的設定檔就只能放在MBR之外的地方了。
boot loader轉移控制權給kernel
3、kernel階段
核心解壓縮到主存當中,並開始測試與驅動各個周邊裝置,而不一定會使用IBISO偵測到的硬體資訊。
/boot分區的掛載是通過BIOS實現,當控制權交給boot loader,由於kernel在/boot分區中,可以直接掛載,但kernel需要動態載入核心模組(可以理解為驅動程式),而核心某塊一般在/目錄中,而/目錄的分區還沒有掛載,但此時核心是沒法識別硬碟的,這就需要虛擬檔案系統(Inital RAM Disk,initrd)來協助載入核心模組。
而虛擬檔案系統同樣是位於/boot,是透過BIOS載入的,等解壓縮到記憶體中,會類比根目錄,並提供一隻可啟動並執行程式來載入核心模組。
4、init程式階段
linux核心初始化各種硬體以後,linux計入保護模式(protected mode)載入作業系統,然後初始化各種核心資料結構像i-node和檔案表(file tables)等,這個進程PID為0
它建立init進程(PID為1),即執行/sbin/init程式(一隻可執行程式),
init的處理流程的配置在/etc/inittab檔案中(不過在Fedora15中性的啟動方式systemd啟動被使用,不再使用下面的/etc/inittab檔案,關於systemd參考這裡)
關於/etc/inittab檔案的配置參見
鳥哥的linux私房菜,該檔案配置了是否預設runlevel,以及該層級需要運行哪些程式,以及圖形終端是否開啟,tty情況等。
runlevel(來自鳥哥的linux私房菜):
- 0 - halt (系統直接關機)
- 1 - single user mode (單人維護模式,用在系統出問題時的維護)
- 2 - Multi-user, without NFS (類似底下的 runlevel 3,但無 NFS 服務)
- 3 - Full multi-user mode (完整含有網路功能的純文字模式)
- 4 - unused (系統保留功能)
- 5 - X11 (與 runlevel 3 類似,但載入使用 X Window)
- 6 - reboot (重新啟動)
事實上 /etc/inittab 的配置也有點類似 shell script 啦,因為該檔案內容的配置也是一行一行的從上往下處理的, 因此我們可以知道 CentOS 的 init 依據 inittab 配置的處理流程會是:
- 先取得 runlevel 亦即預設運行等級的相關等級 (以鳥哥的測試機為例,為 5 號);
- 使用 /etc/rc.d/rc.sysinit 進行系統初始化
- 由於 runlevel 是 5 ,因此只進行『l5:5:wait:/etc/rc.d/rc 5』,其他行則略過
- 配置好 [ctrl]+[alt]+[del] 這組的按鍵組合功能
- 配置不斷電系統的 pf, pr 兩種機制;
- 啟動 mingetty 的六個終端機 (tty1 ~ tty6)
- 最終以 /etc/X11/perfdm -nodaemon 啟動圖形介面啦
這裡每個過程更進一步的細節,請參考鳥哥的linux私房菜
5、登入過程
在login提示符下,按下<Enter>,gettry進程建立一個子進程(名字是你輸入的登入名稱),提示輸入密碼並驗證。如果正確,則該子進程再建立一個子進程(它將轉變成你的登入shell);如果驗證失敗,該子進程終止,控制權重新回到getty.