萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 開機流程完整解析:從 BIOS POST 到登入提示符的逐階段拆解

理解 Linux 開機流程是系統管理、故障排除與嵌入式移植的基礎。本文不涉及核心內部初始化細節,專注於從硬體通電到出現 login: 提示符的完整用戶空間可見流程,對比 Red Hat (SysV init) 與 Slackware (BSD 風格) 兩大主流啟動腳本體系。

第一階段:BIOS → MBR → Bootloader

  1. POST (Power-On Self Test):BIOS 檢測 CPU、記憶體、顯卡、磁碟等硬體。
  2. 啟動順序:依 BIOS 設定 (HDD/USB/CDROM/網路) 讀取第一磁區 (MBR, 512 bytes)。
  3. MBR 內容:446 bytes 啟動代碼 + 64 bytes 分區表 (4 條目) + 2 bytes 簽名 (0xAA55)。
  4. Bootloader 階段:
    • LILO:階段 1 (MBR/啟動扇區) → 階段 2 (/boot/boot.b) → 載入核心 vmlinuz + initrd。
    • GRUB Legacy (0.97):Stage 1 (MBR) → Stage 1.5 (檔案系統驅動, 如 e2fs_stage1_5) → Stage 2 (/boot/grub/stage2) → 選單/命令列 → 載入核心 + initrd。
    • GRUB 2 (1.98+):core.img (含模組) → /boot/grub/grub.cfg 選單 → 模組化載入核心。

關鍵限制:BIOS INT 13h 僅能存取前 1024 柱面 (約 8.4 GB),因此 /boot 分區 (含核心、initrd、grub) **必須位於此範圍內**,否則無法啟動。現代 UEFI + GPT 無此限制。

第二階段:核心初始化 → init 進程

  1. 核心解壓 (bzImage → startup_32/64) → start_kernel() 初始化子系統 (參見《讀核日記一》)。
  2. rest_init() 建立兩個核心執行緒:kernel_init (PID 1 祖先) 與 kthreadd (所有核心執行緒父進程)。
  3. kernel_init → kernel_init_freeable() → run_init_process("/sbin/init") (或 /etc/init, /bin/init, /bin/sh)。
  4. 若無 init 程式 → Kernel Panic ("No init found")。

第三階段:SysV init (Red Hat / CentOS / Fedora / Debian 等)

1. /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)
ctrlaltdelCtrl+Alt+Del 觸發命令 (ca::ctrlaltdel:/sbin/shutdown -t3 -r now)
powerfail/powerwaitUPS 電源故障/恢復處理

2. Red Hat 執行順序

  1. /etc/rc.d/rc.sysinit (sysinit) — 系統級一次性初始化:
    鍵盤/字型、啟用 swap、主機名、NIS 域名、fsck 檢查並掛載檔案系統、啟用 quota、載入聲卡模組、設定系統時鐘 (hwclock)。
  2. /etc/rc.d/rc $RUNLEVEL (wait) — 運行級別腳本:
    執行 /etc/rc.d/rc$RUNLEVEL.d/ 目錄下腳本:
    K* (Kill) → stop 參數,按編號遞增 (停止上一級別服務)。
    S* (Start) → start 參數,按編號遞增 (啟動本級別服務)。
    編號規則:S10network < S55sshd < S99local。
  3. /etc/rc.d/rc.local — 所有初始化完成前最後執行,適合用戶自訂命令。
  4. /sbin/mingetty tty[1-6] (respawn) — 虛擬終端登入提示符。

第四階段:Slackware BSD 風格啟動

  • /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/ 目錄,所有邏輯集中於少數大腳本,風格簡潔、透明,適合學習啟動邏輯。

第五階段:登入與 Shell

  1. mingetty / agetty / getty 開啟終端、顯示 login:。
  2. 輸入帳號 → login 程式驗證 (PAM) → 成功 → 設定環境 (HOME, SHELL, PATH, MAIL...) → 執行 /bin/bash (或 zsh, fish)。
  3. Shell 讀取 /etc/profile → ~/.bash_profile → ~/.bashrc → 顯示 PS1 提示符。

第六階段:現代 systemd 啟動流程 (補充)

RHEL 7+/CentOS 7+/Fedora 15+/Debian 8+/Ubuntu 15.04+ 採用 systemd:

  1. 核心啟動 /usr/lib/systemd/systemd (PID 1)。
  2. 解析 default.target (通常符號連結至 graphical.target 或 multi-user.target)。
  3. 並行啟動單元 : .service, .target, .mount, .socket, .timer...。
  4. systemd-getty-generator 動態產生 getty@tty1.service 等。
  5. systemd-user-sessions.service 允許用戶登入。

關鍵指令:systemctl list-dependencies, systemd-analyze blame, systemd-analyze critical-chain。

總結對照表

階段Red Hat (SysV)Slackware (BSD)Modern (systemd)
BootloaderGRUB/LILOLILO/GRUBGRUB2/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.Ssysinit.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 環境快速定位開機故障、客製化啟動流程、優化啟動速度。

copyright © 萬盛學電腦網 all rights reserved