systemd-boot 全攻略與 Pacman Hook 自動化
一、 認識 systemd-boot:比 GRUB 更輕量的現代 UEFI 引導器 在現代 UEFI 架構下,越來越多 Arch 原生使用者與 archinstall 腳本選擇採用 systemd-boot(前身為 Gummiboot)。 相較於設定檔龐大且依賴 grub-mkconfig 重新生成的 GRUB,systemd-boot 具備以下優勢:
-
原生整合:systemd 內建,無需額外安裝龐大的引導軟體套件。
-
配置模組化:每個核心的啟動項目都是獨立的
.conf檔案,互不干擾。 -
極速開機:直接調用 UEFI 韌體介面載入 EFI 執行檔,開機延遲極低。
二、 systemd-boot 核心結構與日常管理 systemd-boot 的所有設定與核心映像檔都存放在 EFI 系統分割區(通常掛載於 /boot 或 /efi,以下以 /boot 為例)。
-
核心檔案目錄樹
/boot/├── EFI/│ ├── systemd/systemd-bootx64.efi│ └── BOOT/BOOTX64.EFI└── loader/├── loader.conf # 全域引導設定檔└── entries/ # 開機選單項目存放處├── arch.conf # 預設 Linux 核心└── arch-linux-zen.conf # Zen 效能核心 -
核心開機項目檔範例 (
loader/entries/arch-linux-zen.conf)title Arch Linux (Linux-Zen)linux /vmlinuz-linux-zeninitrd /intel-ucode.img # 若為 AMD 請改用 amd-ucode.imginitrd /initramfs-linux-zen.imgoptions root=UUID=xxxx-xxxx-xxxx rw quiet -
開機維護核心指令:bootctl 日常維護完全不需要手動翻找設定檔,透過
bootctl即可完成常用操作:# 查看當前引導狀態、預設核心與所有偵測到的啟動項目bootctl status# 列出所有可用的開機項目清單bootctl list# 一鍵變更預設開機項目(名稱對應 entries 裡的檔名,不需副檔名)sudo bootctl set-default arch-linux-zen# 設定開機選單等待時間(例如 3 秒)sudo bootctl set-timeout 3
三、 核心痛點:為什麼更新核心後容易翻車? 在使用 systemd-boot 時,常見的翻車場景有兩個:
-
systemd 套件更新後引導二進位檔未同步:系統升級了
systemd,但/boot/EFI/systemd/systemd-bootx64.efi仍停留在舊版。 -
多核心切換時 initramfs 遺失:安裝或移除新核心(例如在
linux與linux-zen之間切換)時,若未及時執行mkinitcpio -P重新生成映像檔,重開機將直接卡在 UEFI 引導錯誤。
四、 終極自動化:部署 Pacman Hook 一勞永逸 在 Arch Linux 哲學中,最優雅的解法是利用 Pacman Hook,讓系統在套件安裝或更新後,自動在背景觸發維護腳本,徹底杜絕人為遺漏。
-
Hook 一:systemd 更新時自動升級開機引導程式 建立
/etc/pacman.d/hooks/95-systemd-boot.hook:[Trigger]Type = PackageOperation = UpgradeTarget = systemd[Action]Description = Updating systemd-boot in EFI system partition...When = PostTransactionExec = /usr/bin/bootctl update作用:每當
systemd套件升級,系統自動執行bootctl update,確保 EFI 分割區內的引導二進位檔永遠與系統同步,防止版本斷節。 -
Hook 二:核心更新後自動防護與狀態檢查 雖然 Arch 預設的
90-mkinitcpio-install.hook會自動編譯映像檔,但若你常切換自訂核心或 DKMS 模組,可建立自訂檢查 Hook/etc/pacman.d/hooks/99-boot-integrity.hook:[Trigger]Type = PackageOperation = InstallOperation = UpgradeOperation = RemoveTarget = linuxTarget = linux-zenTarget = linux-lts[Action]Description = Verifying bootloader entries integrity...When = PostTransactionExec = /usr/bin/bootctl --dry-run list作用:在任何核心安裝、升級或移除後,在終端機背景預演並檢驗開機選單設定檔的完整性,若路徑損毀會直接在 pacman 更新流程中噴出警示,讓你在關機前就能當場修復。