理解開機流程是排查啟動故障、優化啟動速度、實作自定義啟動邏輯的前提。本文按階段拆解 x86_64 架構下傳統 SysV init 與現代 systemd 並行的完整啟動鏈路。
ext2.mod),位於 MBR 後間隙或 /boot/grub/grub.cfg、顯示選單、載入核心與 initramfsmenuentry 'CentOS Linux' {
linux /vmlinuz-4.18.0 root=/dev/mapper/cl-root ro
initrd /initramfs-4.18.0.img
}
Uncompressing Linux... OK, booting the kernel.switch_root 切換至真實根目錄start_kernel() → kernel_init() → run_init_process("/sbin/init")| 特性 | SysV init (傳統) | systemd (現代標準) |
|---|---|---|
| PID 1 程式 | /sbin/init | /usr/lib/systemd/systemd |
| 配置方式 | /etc/inittab + /etc/rc.d/rc*.d/ 腳本 | .unit 檔案 (/usr/lib/systemd/system/) |
| 啟動模式 | 串行 (依 runlevel 順序) | 並行 (依賴圖自動解析) |
| 服務管理 | service / chkconfig | systemctl |
| 日誌 | syslog / /var/log/messages | journald / journalctl |
| 相容性 | systemd 可執行 SysV 腳本 | 原生支援 Socket/D-Bus/Path 啟動 |
default.target (通常指向 graphical.target 或 multi-user.target).service、.socket、.mount、.targetbasic.target → sysinit.target (早期服務:udev、sysfs、swap、fsck)multi-user.target (文字模式完整) → graphical.target (啟動 display manager)systemd-analyze # 總啟動時間
systemd-analyze blame # 各服務耗時排序
systemd-analyze critical-chain # 關鍵路徑
systemctl list-unit-files --state=enabled # 開機自啟服務
journalctl -b # 本次啟動日誌
dmesg -T # 核心環形緩衝區 (人類可讀時間)
cat /proc/cmdline # 核心啟動參數
| 症狀 | 排查方向 |
|---|---|
| GRUB 救援模式 | 核心/initramfs 路徑錯誤、磁碟 UUID 變更、grub2-install 重裝 |
| 緊急模式 | journalctl -xb、/etc/fstab 掛載錯誤、SELinux 標籤錯誤 |
| 啟動卡住 | systemd-analyze critical-chain 找阻塞服務、systemctl mask 暫停 |
| 雙系統 GRUB 消失 | Windows 更新覆蓋 MBR → LiveCD grub2-install /dev/sda |
現代 Linux 啟動鏈路:UEFI → GRUB2 → 核心 + initramfs → systemd 並行啟動。掌握各階段產物 (grub.cfg、vmlinuz、initramfs、unit 檔) 與診斷工具 (systemd-analyze、journalctl、dmesg),即可從容應對啟動故障與效能優化。