systemd-boot
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
bootctl --path=$esp install
。自動更新[編輯 | 編輯原始碼]
如果你需要自動更新 systemd-boot,你可以嘗試使用 systemd 服務 或 Pacman 鈎子,下方介紹了這兩種方法。
systemd 服務[編輯 | 編輯原始碼]
在版本 250 後, systemd包 添加了 systemd-boot-update.service
。 啟用 這個服務後將會在下次啟動系統時更新 bootloader。
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
default
和timeout
可在啟動選單中修改並保存為 EFI 變量,這些選項會被覆蓋。bootctl set-default ""
可用於清除覆蓋了default
選項的 EFI 變量。- 基本配置文件示例位於
/usr/share/systemd/bootctl/loader.conf
。
增加啟動選項[編輯 | 編輯原始碼]
\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
用於區分不同設備的名稱, 只在有多個title
和version
時需要.efi
– 要啟動的EFI應用程式的位置,以 ($esp
) 為相對路徑,; 例如/vmlinuz-linux
. 需要此選項或是linux
(參閱下文) 的一項.options
– 傳遞給 EFI 應用程式或內核啟動的參數,可選.但如果你要啟動linux,至少需要initrd=efipath
和root=dev
選項.
要啟動linux,你還可以指定 linux path-to-vmlinuz
和 initrd path-to-initramfs
;這會自動轉換成 efi path
和 options 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 邏輯卷上時[編輯 | 編輯原始碼]
/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
對休眠的支持[編輯 | 編輯原始碼]
啟動選單中的按鍵操作[編輯 | 編輯原始碼]
啟動選單中支持的按鍵操作有:
Up/Down
- 選擇選項Enter
- 加載所選的選項d
- 設置默認的啟動選項 (會保存在 EFI 變量中)-/T
- 增加超時時間 (會保存在 EFI 變量中)+/t
- 減少超時時間 (會保存在 EFI 變量中)e
- 編輯內核參數,如果editor
選項設置為0
,則沒有任何作用.v
- 顯示版本信息Q
- 退出P
- 顯示目前的配置h/?
- 幫助
這些熱鍵可以在啟動管理器時直接指定啟動哪一個選項
l
- Linuxw
- Windowsa
- OS Xs
- EFI Shell1-9
-選項的編號
排除問題[編輯 | 編輯原始碼]
在傳統啟動下安裝[編輯 | 編輯原始碼]
如果你以傳統方式(MBR)啟動電腦,或許能成功安裝,不過需要在安裝之後向你的固件提供如何啟動systemd-boot的相關信息,為此你需要:
- 一個EFI Shell;
- 或是你的UEFI 固件設置中提供了更改啟動選項的界面.
如果能這樣做的話,進入你的 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
.