從按下電源鍵到呈現登入提示符,Linux 經歷了一系列精密協作的階段。理解這 10 個關鍵步驟,不僅能協助排除開機故障,更是系統工程師、嵌入式開發者的核心內功。本文依照傳統 SysV init 流程(systemd 另文詳述)逐層拆解。
EFI/BOOT/BOOTX64.EFI 或 grubx64.efi,跳過 MBR 階段。0x7C00,接管控制權。boot.img):嵌入 MBR,僅負責載入 Stage 1.5/Core.img。core.img):含檔案系統驅動(ext2/xfs/btrfs/lvm/raid),能讀取 /boot/grub。/boot/grub/grub.cfg,載入指定核心與 initramfs。linux /vmlinuz-... root=UUID=... ro quiet、initrd /initramfs-...img。vmlinuz = gzip/xz/lz4 壓縮的 Image)。arch/x86/boot/compressed/head_64.S)建立臨時頁表、解壓核心至高端記憶體。Uncompressing Linux... OK, booting the kernel.start_kernel())rootfs(initramfs 先行,再切換真實根檔案系統)。kthreadd、ksoftirqd、migration、rcu_sched 等。rest_init() → kernel_init() → run_init_process("/sbin/init")。/sbin/init 讀取 /etc/inittab 判斷預設運行等級(id:3:initdefault: 或 id:5:initdefault:)。/sbin/init 為 systemd 符號連結,並行啟動單元,無運行等級概念(對應 graphical.target/multi-user.target)。rc.sysinit(/etc/rc.d/rc.sysinit)PATH、HOSTNAME、網路介面、啟用 swap、掛載 /proc//sys、載入核心參數(sysctl -p)、檢查根檔案系統、設定 SELinux 標籤。/etc/modules.conf(舊)或 /etc/modules-load.d/*.conf(新)自動 modprobe。rcN.d 腳本/etc/rc.d/rc[0-6].d/,符號連結指向 /etc/rc.d/init.d/ 服務腳本。Sname (啟動)、Kname (停止),NN 決定順序。S10network → S55sshd → S99local。rc.local(/etc/rc.d/rc.local)chmod +x /etc/rc.d/rc.local。getty/login 進入登入狀態inittab 中 1:2345:respawn:/sbin/agetty --noclear tty1 linux。Login: 提示符,驗證帳密後啟動使用者 Shell(/bin/bash)。| SysV 階段 | Systemd 對應單元/目標 |
|---|---|
| rc.sysinit | systemd-sysinit.service、sysinit.target |
| rcN.d S* | multi-user.target / graphical.target 依賴鏈 |
| rc.local | rc-local.service(需啟用) |
| inittab 運行等級 | runlevelN.target(符號連結至 multi-user/graphical) |
Linux 啟動是「固件 → 引導載入器 → 核心 → PID 1 → 使用者空間」的接力賽。掌握各階段關鍵檔案(grub.cfg、inittab、rc.sysinit、rc.local)與除錯入口(grub> 編輯、init=/bin/bash、systemd.debug-shell),即可從容應對開機掛掛、根檔案系統損壞、服務啟動失敗等棘手場景。