理解開機流程的價值#
當系統無法開機時,如果你不理解開機流程,就只能束手無策。理解從「按下電源鍵」到「看到登入畫面」之間發生的每一步,才能準確定位問題出在哪個環節,並採取正確的救援措施。
Linux 開機流程全覽#
- BIOS/UEFI 自我測試(POST):偵測硬體、決定開機裝置
- Boot Loader(GRUB2):從 MBR 或 ESP 載入,提供選單讓使用者選擇核心
- 載入核心與 initramfs:核心映像檔被載入記憶體,initramfs 提供開機所需的驅動程式
- 核心初始化:偵測硬體、載入驅動、掛載根檔案系統
- 啟動 systemd(PID 1):第一支使用者空間程序,接管後續的初始化工作
- sysinit.target → basic.target:硬體初始化、基本服務啟動
- 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 的兩階段載入#
- Stage 1:MBR 中的程式(非常小),負責載入 Stage 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 環境:
- 在 GRUB2 選單按
e編輯開機參數 - 在核心參數行末加上
rd.break - 系統會停在 initramfs 階段,此時真正的根檔案系統掛載在
/sysroot - 用
chroot /sysroot切換到真正的根目錄 - 重設密碼後,建立
/.autorelabel讓 SELinux 重新標記
檔案系統損壞#
如果根檔案系統損壞導致無法開機,需要進入救援模式(rescue mode)使用 fsck 或 xfs_repair 修復。
在修復檔案系統之前,務必先將檔案系統卸載(umount)。在已掛載的檔案系統上執行修復工具可能造成更嚴重的損毀。