按下電源鍵到出現登入提示,Linux 經歷了什麼?本文條理化拆解五大關鍵階段,並深入各階段核心機制,建立完整啟動心智模型。
BIOS (POST) → MBR (GRUB Stage1) → GRUB Stage1.5/Stage2 → Kernel → initrd/initramfs → /sbin/init → 服務啟動 → 登入
MBR 結構(512 Bytes):
0x55AAGRUB 三階段架構:
| 階段 | 位置 | 功能 |
|---|---|---|
| Stage1 | MBR 446 Bytes | 極小,僅載入 Stage1.5 或 Stage2 |
| Stage1.5 | /boot/grub/*_stage1_5 | 檔案系統驅動(ext2/3/4、xfs、fat、reiserfs 等),讓 GRUB 能讀取 /boot 內容 |
| Stage2 | /boot/grub/stage2 | 核心邏輯:讀取 grub.conf、呈現選單、載入 Kernel/initrd |
grub.conf 關鍵設定:root (hd0,0)、kernel /vmlinuz-... ro root=/dev/sda2、initrd /initrd-...
initrd/initramfs 作為臨時根檔案系統問題:Kernel 無內建所有檔案系統/磁碟驅動,但驅動模組存放在根檔案系統中 → 無法掛載根分區載入驅動。
解法:
gz 壓縮的極小根檔案系統映像檔,含 /linuxrc 腳本,載入必要驅動模組,找到真實根裝置後寫入 /proc/sys/kernel/real-root-dev,切換根檔案系統cpio.gz 格式,含 /init 程式(PID=1),直接掛載真實根分區並 exec 切換至 /sbin/init,流程更簡化、啟動更快三代演進:
| 代系 | 代表 | 特徵 |
|---|---|---|
| SysVinit | 傳統 | /etc/inittab 定義運行等級、rc.sysinit、rc 腳本串聯服務,循序啟動慢 |
| Upstart | Ubuntu 早期 | 事件驅動、平行啟動,配置分散在 /etc/init/*.conf |
| systemd | 現代主流 | 單元檔、依賴圖、平行啟動、Socket/Timer 啟動、systemctl 管理 |