systemd-boot

出自 Arch Linux 中文维基

systemd-boot,曾用名 gummiboot (德語裏「橡皮筏」的意思),是一款可以執行 EFI 鏡像文件的簡單 UEFI 引導管理器。可以通過配置好的模式(全局)或可用方向鍵導航的屏幕菜單選擇默認條目。Arch 默認安裝的 systemd 包含了 systemd-boot。

Systemd-boot 很容易配置,但只能啟動 EFI 可執行程序,例如 Linux 內核 EFISTUB, UEFI Shell, GRUB 或者 Windows Boot Manager 等。

注意: 本文用 $esp 表示EFI 系統分區,即 ESP 掛載的位置。

安裝[編輯 | 編輯原始碼]

安裝 EFI 啟動管理器[編輯 | 編輯原始碼]

要安裝 systemd-boot EFI 啟動管理器,首先確保啟動方式是 UEFI 模式,可以訪問 UEFI 變量。用 efivar --list 命令進行檢查,如果沒有安裝 efivar ,使用 ls /sys/firmware/efi/efivars (如果目錄存在,系統是以 UEFI 模式啟動的)。

systemd-boot 僅可以從ESP 分區加載 EFISTUB 內核。要持續更新內核,建議將 ESP 掛載到 /boot. 如果沒將 ESP 掛載到 /boot,需要手動將內核和 initramfs 複製到 ESP. 詳情請參考 EFI system partition#Alternative mount points .

下面的例子中會用 $esp 代替 EFI 系統分區的實際位置,例如 /boot

ESP 掛載到 $esp 後,使用 bootctl(1)systemd-boot 安裝到 EFI 系統分區:

# bootctl --path=$esp install

在 x64 架構的系統上,兩個完全一樣的二進制文件 $esp/EFI/systemd/systemd-bootx64.efi$esp/EFI/BOOT/BOOTX64.EFI 會被複製到 ESP. 然後將 systemd-boot 設置為 EFI 啟動管理器的默認 EFI 程序(默認啟動項)。

要完成安裝,請 配置 systemd-boot

更新 EFI 啟動管理器[編輯 | 編輯原始碼]

每當 systemd-boot 有新版本時,用戶都需要更新啟動管理器。

手動更新[編輯 | 編輯原始碼]

更新 systemd-boot 需要使用 bootctl。如果沒指定 path,會按順序檢查 /efi, /boot/boot/efi

# bootctl update

可以用 path 指定具體位置:

# bootctl --path=$esp update
注意: 這條命令同樣用於在移除 systemd-boot 之前遷移。但是如果該軟件包已被刪除,請運行 bootctl --path=$esp install

自動更新[編輯 | 編輯原始碼]

如果你需要自動更新 systemd-boot,你可以嘗試使用 systemd 服務Pacman 鈎子,下方介紹了這兩種方法。

systemd 服務[編輯 | 編輯原始碼]

在版本 250 後, systemd 添加了 systemd-boot-update.service啟用 這個服務後將會在下次啟動系統時更新 bootloader

警告: 如果你啟用了 安全啟動,你需要在更新 bootloader 後為其簽名。請查看 #pacman 鈎子 後有關於 安全啟動 的相關說明。
pacman 鈎子[編輯 | 編輯原始碼]

軟件包 systemd-boot-pacman-hookAUR 提供了一個 Pacman 鈎子 以自動化更新過程。 安裝 該軟件包將添加一個在每次更新 systemd 時執行的 hook。

或者,不安裝 systemd-boot-pacman-hook 實現相同功能,在 /etc/pacman.d/hooks/ 放置以下 Pacman 鈎子

/etc/pacman.d/hooks/100-systemd-boot.hook
[Trigger]
Type = Package
Operation = Upgrade
Target = systemd

[Action]
Description = Updating systemd-boot
When = PostTransaction
Exec = /usr/bin/bootctl update

如果你啟用了 安全啟動,你需要添加一個 Pacman 鈎子 以在更新 內核systemd 後自動為其重簽名:

/etc/pacman.d/hooks/99-secureboot.hook
[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = linux
Target = systemd

[Action]
Description = Signing Kernel for Secure Boot
When = PostTransaction
Exec = /usr/bin/find /boot -type f ( -name vmlinuz-* -o -name systemd* ) -exec /usr/bin/sh -c 'if ! /usr/bin/sbverify --list {} 2>/dev/null | /usr/bin/grep -q "signature certificates"; then /usr/bin/sbsign --key db.key --cert db.crt --output "$1" "$1"; fi' _ {} ;
Depends = sbsigntools
Depends = findutils
Depends = grep

配置[編輯 | 編輯原始碼]

啟動選單配置[編輯 | 編輯原始碼]

配置文件保存於 $esp/loader/loader.conf,可指定以下設置:

  • default#增加啟動選項 中默認選擇的選項,可以使用通配符,例如 arch-*
  • timeout – 啟動默認選項前的超時時間(以秒為單位)。如果未設定,選單僅在啟動時按空格鍵(或大多數其他鍵)顯示;
  • editor – 是否啟用內核參數編輯器。 yes (默認)為啟用, no 為禁用;因為用戶可以添加 init=/bin/bash 以繞過密碼獲取 root 權限,如果未經授權的人可以使用這台機器,強烈建議將此選項設置為 no
  • auto-entries – 自動為 Windows、EFI Shell 和 Default Loader 添加選項, 1 (默認)啟用, 0 為禁用;
  • auto-firmware – 顯示「重啟到 UEFI 固件設置」的選項, 1 (默認)啟用, 0 為禁用;
  • console-mode – 更改 UEFI 控制台模式: 0 為 80x25, 1 為 80x50, 2 and above for non-standard modes provided by the device firmware, if any, auto picks a suitable mode automatically, max for highest available mode, keep (默認) 由固件確定。
  • random-seed-mode - 控制是否從文件 $esp/loader/random-seed 中讀取隨機種子。如果設為 with-system-token (默認),僅在設置了 EFI 變量 LoaderSystemToken 的情況下才從文件加載種子;如果設為 always,即使未設置 EFI 變量,它也會從文件加載種子;如果設為 off 文件將被忽略。


現有設置的詳細解釋和對應的參數位於 loader.conf(5) 手冊。以下是一個簡單的示例:

$esp/loader/loader.conf
default  arch.conf
timeout  4
console-mode max
editor   no
提示:
  • defaulttimeout 可在啟動選單中修改並保存為 EFI 變量,這些選項會被覆蓋。
  • bootctl set-default "" 可用於清除覆蓋了 default 選項的 EFI 變量。
  • 基本配置文件示例位於 /usr/share/systemd/bootctl/loader.conf

增加啟動選項[編輯 | 編輯原始碼]

注意: 如果存在的話,bootctl 會自動為 "Windows Boot Manager (Windows 啟動管理器)" (\EFI\Microsoft\Boot\Bootmgfw.efi), "EFI Shell" (\shellx64.efi) 和 "EFI Default Loader" (\EFI\Boot\bootx64.efi)增加啟動選項. 但並不會為其他EFI應用程式創建啟動選項,所以需要進行進一步設置. 如果你是和Windows 組成雙重啟動,建議禁用 Windows 中的"快速啟動" 選項.

如果需要 Intel microcode,不要忘了修改 initrd

提示:你能用 blkid -s PARTUUID -o value /dev/sdxY 找到某個分區的PARTUUID, 'x' 和 'Y' 分別是磁盤和分區編號.稍後可能需要這些信息.

bootctl 會在 $esp/loader/entries/*.conf 搜索啟動選項– 一個文件中只能包含一個啟動選項,下面是參數列表:

  • title必須選項. 系統的名稱.
  • version – 內核版本,只在有多個 title 時需要.
  • machine-id – 通過 /etc/machine-id用於區分不同設備的名稱, 只在有多個titleversion 時需要.
  • efi – 要啟動的EFI應用程式的位置,以 ($esp) 為相對路徑,; 例如 /vmlinuz-linux. 需要此選項或是 linux (參閱下文) 的一項.
  • options – 傳遞給 EFI 應用程式或內核啟動的參數,可選.但如果你要啟動linux,至少需要 initrd=efipathroot=dev選項.

要啟動linux,你還可以指定 linux path-to-vmlinuzinitrd path-to-initramfs;這會自動轉換成 efi pathoptions initrd=path – 這個語法只是為了方便,在功能上並沒有區別.

一般的安裝選項[編輯 | 編輯原始碼]

這是一個根分區既不在LVM邏輯卷又沒有加密時的配置選項:

$esp/loader/entries/arch.conf
title          Arch Linux
linux          /vmlinuz-linux
initrd         /initramfs-linux.img
options        root=PARTUUID=14420948-2cea-4de7-b042-40f67c618660 rw

注意這個例子中用PARTUUID(或是PARTLABEL)來標識一個GPT分區(和UUID/LABEL不同,它標識一個文件系統).使用因為PARTUUID/PARTLABEL是因為它不像UUID/LABEL會在格式化時改變,也不像 /dev/sd* 會在某些時候交換.在某些無文件系統分區(或是不支持卷標的LUKS 加密卷)上也能工作.

提示:/usr/share/systemd/bootctl 提供了參考示例文件.

根分區在LVM 邏輯卷上時[編輯 | 編輯原始碼]

警告: 如果沒有一個在LVM卷組外的/boot分區,不要用 Systemd-boot .

這是一個根分區在LVM邏輯卷上時的樣例:

$esp/loader/entries/arch-lvm.conf
title          Arch Linux (LVM)
linux          /vmlinuz-linux
initrd         /initramfs-linux.img
options        root=/dev/mapper/<VolumeGroup-LogicalVolume> rw

用實際的邏輯卷組和邏輯卷名替換 <VolumeGroup-LogicalVolume> (例如 root=/dev/mapper/volgroup00-lvolroot). 也可以使用UUID:

....
options  root=UUID=<UUID identifier> rw

加密的根分區[編輯 | 編輯原始碼]

這是一個加密的根分區 (例如通過DM-Crypt / LUKS)的樣例:

$esp/loader/entries/arch-encrypted.conf
title Arch Linux Encrypted
linux /vmlinuz-linux
initrd /initramfs-linux.img
options cryptdevice=UUID=<UUID>:<mapped-name> root=/dev/mapper/<mapped-name> quiet rw

這個例子中用了UUID; PARTUUID 應該也可以使用, 如果你願意,也可以用UUID替換/dev/段. 參閱 Dm-crypt/System configuration#Boot loader[損壞的連結:無效的章節].

如果使用 LVM,cryptdevice 行應該類似於:

$esp/loader/entries/arch-encrypted-lvm.conf
title Arch Linux Encrypted LVM
linux /vmlinuz-linux
initrd /initramfs-linux.img
options cryptdevice=UUID=<UUID>:MyVolGroup root=/dev/mapper/MyVolGroup-MyVolRoot quiet rw

你也可以加入類似於 \EFI\arch\grub.efi的EFI應用程式.

根分區是btrfs子卷[編輯 | 編輯原始碼]

如果用btrfs子卷作為根分區,記得加入 rootflags=subvol=<root 子卷名稱>options選項中,在這個例子中,根分區掛載在名稱為'ROOT'的btrfs子卷中 (例如 mount -o subvol=ROOT /dev/sdxY /mnt):

$esp/loader/entries/arch-btrfs-subvol.conf
title          Arch Linux
linux          /vmlinuz-linux
initrd         /initramfs-linux.img
options        root=PARTUUID=14420948-2cea-4de7-b042-40f67c618660 rw rootflags=subvol=ROOT

如果做不到這一點的話,會出現這樣的錯誤消息: ERROR: Root device mounted successfully, but /sbin/init does not exist.

EFI Shells 或其他 EFI 應用程式[編輯 | 編輯原始碼]

你可以像這樣加載EFI Shell或其他EFI應用程式:

$esp/loader/entries/uefi-shell-v1-x86_64.conf
title  UEFI Shell x86_64 v1
efi    /EFI/shellx64_v1.efi
$esp/loader/entries/uefi-shell-v2-x86_64.conf
title  UEFI Shell x86_64 v2
efi    /EFI/shellx64_v2.efi

這篇文章的某些內容需要擴充。

原因: 加入如何進入UEFI固件設置的配置. (在 Talk:Systemd-boot 中討論)

對休眠的支持[編輯 | 編輯原始碼]

參閱 Suspend and hibernate.

啟動選單中的按鍵操作[編輯 | 編輯原始碼]

啟動選單中支持的按鍵操作有:

  • Up/Down - 選擇選項
  • Enter - 加載所選的選項
  • d - 設置默認的啟動選項 (會保存在 EFI 變量中)
  • -/T - 增加超時時間 (會保存在 EFI 變量中)
  • +/t - 減少超時時間 (會保存在 EFI 變量中)
  • e - 編輯內核參數,如果 editor 選項設置為0,則沒有任何作用.
  • v - 顯示版本信息
  • Q - 退出
  • P - 顯示目前的配置
  • h/? - 幫助

這些熱鍵可以在啟動管理器時直接指定啟動哪一個選項

  • l - Linux
  • w - Windows
  • a - OS X
  • s - EFI Shell
  • 1-9 -選項的編號

排除問題[編輯 | 編輯原始碼]

在傳統啟動下安裝[編輯 | 編輯原始碼]

警告: 這不是建議的方法!

如果你以傳統方式(MBR)啟動電腦,或許能成功安裝,不過需要在安裝之後向你的固件提供如何啟動systemd-boot的相關信息,為此你需要:

  • 一個EFI Shell;
  • 或是你的UEFI 固件設置中提供了更改啟動選項的界面.
注意: 例如某些 Dell Latitude 計算機上,UEFI固件設置界面提供了設置EFI啟動所需的工具,而EFI Shell 無法修改那些設置.

如果能這樣做的話,進入你的 EFI Shell 或是 UEFI 固件設置,修改你的默認EFI啟動加載器為 $esp/EFI/systemd/systemd-bootx64.efi (在i686架構上是 systemd-bootia32.efi).

通過efibootmgr手動添加啟動選項[編輯 | 編輯原始碼]

如果運行bootctl install 命令失敗,你可以通過 efibootmgr手動增加選項:

# efibootmgr -c -d /dev/sdX -p Y -l /EFI/systemd/systemd-bootx64.efi -L "Linux Boot Manager"

EFI 系統分區的設備名稱替換/dev/sdXY.

在Windows升級後不能看到啟動菜單[編輯 | 編輯原始碼]

參閱Windows 修改了啟動順序

參閱[編輯 | 編輯原始碼]