理解 Linux 開機流程是系統管理、故障排除與嵌入式移植的基礎。本文不涉及核心內部初始化細節,專注於從硬體通電到出現 login: 提示符的完整用戶空間可見流程,對比 Red Hat (SysV init) 與 Slackware (BSD 風格) 兩大主流啟動腳本體系。
vmlinuz + initrd。e2fs_stage1_5) → Stage 2 (/boot/grub/stage2) → 選單/命令列 → 載入核心 + initrd。core.img (含模組) → /boot/grub/grub.cfg 選單 → 模組化載入核心。關鍵限制:BIOS INT 13h 僅能存取前 1024 柱面 (約 8.4 GB),因此 /boot 分區 (含核心、initrd、grub) **必須位於此範圍內**,否則無法啟動。現代 UEFI + GPT 無此限制。
bzImage → startup_32/64) → start_kernel() 初始化子系統 (參見《讀核日記一》)。rest_init() 建立兩個核心執行緒:kernel_init (PID 1 祖先) 與 kthreadd (所有核心執行緒父進程)。kernel_init → kernel_init_freeable() → run_init_process("/sbin/init") (或 /etc/init, /bin/init, /bin/sh)。/etc/inittab 核心配置格式:id:runlevels:action:process
| action | 行為 |
|---|---|
| initdefault | 預設運行級別 (如 id:3:initdefault:) |
| sysinit | 系統啟動第一個腳本 (si::sysinit:/etc/rc.d/rc.sysinit) |
| wait | 進入指定 runlevel 執行一次並等待結束 (l3:3:wait:/etc/rc.d/rc 3) |
| once | 進入 runlevel 執行一次不等待 |
| respawn | 進程結束自動重啟 (getty, xdm) |
| ctrlaltdel | Ctrl+Alt+Del 觸發命令 (ca::ctrlaltdel:/sbin/shutdown -t3 -r now) |
| powerfail/powerwait | UPS 電源故障/恢復處理 |
/etc/rc.d/rc.sysinit (sysinit) — 系統級一次性初始化:fsck 檢查並掛載檔案系統、啟用 quota、載入聲卡模組、設定系統時鐘 (hwclock)。/etc/rc.d/rc $RUNLEVEL (wait) — 運行級別腳本:/etc/rc.d/rc$RUNLEVEL.d/ 目錄下腳本:K* (Kill) → stop 參數,按編號遞增 (停止上一級別服務)。S* (Start) → start 參數,按編號遞增 (啟動本級別服務)。S10network < S55sshd < S99local。/etc/rc.d/rc.local — 所有初始化完成前最後執行,適合用戶自訂命令。/sbin/mingetty tty[1-6] (respawn) — 虛擬終端登入提示符。/etc/rc.d/rc.S (sysinit) — 系統初始化 (掛載、fsck、網路、syslog、inetd...)。/etc/rc.d/rc.K — 單用戶模式 (runlevel 1) 腳本。/etc/rc.d/rc.M — 多用戶模式 (runlevel 2/3/4/5) 主腳本,依序呼叫:/etc/rc.d/rc.modules (載入模組)、/etc/rc.d/rc.inet1 (網路)、/etc/rc.d/rc.inet2 (網路服務)、/etc/rc.d/rc.local。/etc/rc.d/rc.0 — 關機腳本。/etc/rc.d/rc.4 — 圖形登入 (xdm/gdm/kdm) 啟動腳本。Slackware 無 /etc/rc.d/rc*.d/ 目錄,所有邏輯集中於少數大腳本,風格簡潔、透明,適合學習啟動邏輯。
mingetty / agetty / getty 開啟終端、顯示 login:。login 程式驗證 (PAM) → 成功 → 設定環境 (HOME, SHELL, PATH, MAIL...) → 執行 /bin/bash (或 zsh, fish)。/etc/profile → ~/.bash_profile → ~/.bashrc → 顯示 PS1 提示符。RHEL 7+/CentOS 7+/Fedora 15+/Debian 8+/Ubuntu 15.04+ 採用 systemd:
/usr/lib/systemd/systemd (PID 1)。default.target (通常符號連結至 graphical.target 或 multi-user.target)。.service, .target, .mount, .socket, .timer...。systemd-getty-generator 動態產生 getty@tty1.service 等。systemd-user-sessions.service 允許用戶登入。關鍵指令:systemctl list-dependencies, systemd-analyze blame, systemd-analyze critical-chain。
| 階段 | Red Hat (SysV) | Slackware (BSD) | Modern (systemd) |
|---|---|---|---|
| Bootloader | GRUB/LILO | LILO/GRUB | GRUB2/UEFI |
| 核心初始化 | start_kernel → rest_init | 同 | 同 |
| PID 1 | /sbin/init (SysV) | /sbin/init (BSD) | /usr/lib/systemd/systemd |
| 系統初始化 | /etc/rc.d/rc.sysinit | /etc/rc.d/rc.S | sysinit.target + generators |
| 服務啟動 | /etc/rc.d/rcN.d/S* | /etc/rc.d/rc.M | *.service 平行啟動 |
| 用戶自訂 | /etc/rc.d/rc.local | /etc/rc.d/rc.local | /etc/rc.local (兼容) / *.service |
| 登入管理 | mingetty (inittab respawn) | getty (inittab respawn) | getty@.service + display-manager.service |
掌握三代啟動體系演進脈絡,可在任何 Linux 環境快速定位開機故障、客製化啟動流程、優化啟動速度。