理解開機流程的價值#

當系統無法開機時,如果你不理解開機流程,就只能束手無策。理解從「按下電源鍵」到「看到登入畫面」之間發生的每一步,才能準確定位問題出在哪個環節,並採取正確的救援措施。

Linux 開機流程全覽#

  1. BIOS/UEFI 自我測試(POST):偵測硬體、決定開機裝置
  2. Boot Loader(GRUB2):從 MBR 或 ESP 載入,提供選單讓使用者選擇核心
  3. 載入核心與 initramfs:核心映像檔被載入記憶體,initramfs 提供開機所需的驅動程式
  4. 核心初始化:偵測硬體、載入驅動、掛載根檔案系統
  5. 啟動 systemd(PID 1):第一支使用者空間程序,接管後續的初始化工作
  6. sysinit.target → basic.target:硬體初始化、基本服務啟動
  7. multi-user.target / graphical.target:啟動系統服務、網路、使用者環境

PID 1 是特殊的——它是所有程序的祖先,如果 PID 1 死掉,整個系統就崩潰了。這就是為什麼 systemd 的穩定性如此重要,也是為什麼在 Docker 容器中需要特別注意 PID 1 的問題(容器的 PID 1 不是 systemd)。

initramfs 的角色#

核心在開機時需要讀取根檔案系統的驅動程式,但驅動程式本身又存放在根檔案系統上——這形成了一個雞生蛋蛋生雞的困境。

**initramfs(Initial RAM Filesystem)**解決了這個問題:

  • 它是一個壓縮的小型檔案系統映像,與核心一起被 Boot Loader 載入記憶體
  • 包含了掛載真正根檔案系統所需的驅動程式和工具
  • 核心先載入 initramfs 作為臨時根目錄,找到真正的根檔案系統後再切換過去

這也是為什麼 initramfs 需要與核心版本配對。如果你更新了核心但忘了更新 initramfs,可能會因為缺少必要的驅動程式而無法開機。

核心模組(Kernel Module)#

Linux 核心採用模組化設計——不是所有功能都編譯進核心主體,而是將驅動程式和功能做成可動態載入的模組。這樣的好處:

  • 核心本體保持精簡
  • 需要時才載入對應的模組,節省記憶體
  • 可以在不重新編譯核心的情況下新增功能

模組管理#

  • lsmod:列出目前已載入的模組
  • modinfo:查看模組的詳細資訊
  • modprobe:載入模組(自動處理相依性)
  • rmmod:移除模組

模組之間可能有相依性(A 模組需要 B 模組才能運作)。modprobe 會根據 modules.dep 檔案自動解析並載入所有相依的模組。

GRUB2 Boot Loader#

為什麼需要 Boot Loader#

BIOS/UEFI 只知道去哪裡載入 Boot Loader,不認識檔案系統,也不知道核心在哪裡。GRUB2 擔任橋樑的角色——它認識檔案系統,能找到核心映像檔並載入。

GRUB2 的兩階段載入#

  1. Stage 1:MBR 中的程式(非常小),負責載入 Stage 2
  2. Stage 2:完整的 GRUB2 程式,提供選單、讀取設定檔、載入核心

GRUB2 的設定#

  • /etc/default/grub:主要的設定參數(預設啟動項、等待時間、核心參數)
  • /etc/grub.d/:選單產生腳本
  • grub2-mkconfig:根據上述設定產生最終的 grub.cfg

不要直接編輯 grub.cfg 這個檔案是自動產生的,修改它會在下次執行 grub2-mkconfig 時被覆蓋。應該修改 /etc/default/grub/etc/grub.d/ 下的腳本。

開機問題的救援#

忘記 root 密碼#

使用 rd.break 模式進入 initramfs 環境:

  1. 在 GRUB2 選單按 e 編輯開機參數
  2. 在核心參數行末加上 rd.break
  3. 系統會停在 initramfs 階段,此時真正的根檔案系統掛載在 /sysroot
  4. chroot /sysroot 切換到真正的根目錄
  5. 重設密碼後,建立 /.autorelabel 讓 SELinux 重新標記

檔案系統損壞#

如果根檔案系統損壞導致無法開機,需要進入救援模式(rescue mode)使用 fsckxfs_repair 修復。

在修復檔案系統之前,務必先將檔案系統卸載(umount)。在已掛載的檔案系統上執行修復工具可能造成更嚴重的損毀。