systemd-boot
systemd-boot(7),之前被称为 gummiboot (德语,意为“橡皮艇”),是一个易于配置的 UEFI 启动管理器。它提供一个文本菜单来选择启动项和一个内核命令行编辑器。
请注意,systemd-boot 只能从它安装到的 EFI 系统分区或同一磁盘上的扩展启动加载器分区 (XBOOTLDR 分区) 启动 EFI 可执行文件 (例如,Linux 内核 EFI 启动桩、UEFI shell、GRUB 或 Windows 启动管理器)。
支持的文件系统
systemd-boot 继承了 固件 对文件系统的支持 (即至少 FAT12、FAT16 和 FAT32)。 此外,它还会加载放置在 esp/EFI/systemd/drivers/
中的任何 UEFI 驱动程序。
安装
systemd-boot 随 systemd 软件包一起提供,该软件包是 base 元软件包的依赖项,因此无需手动安装其他软件包。
安装 UEFI 启动管理器
要安装 systemd-boot,首先请确保系统已启动进入 UEFI 模式,并且 UEFI 变量 可访问。 这可以通过运行 efivar --list
来验证,或者,如果未安装 efivar,则可以通过运行 ls /sys/firmware/efi/efivars
(如果目录存在,则系统已启动进入 UEFI 模式。) 来验证。
使用 bootctl(1) 将 systemd-boot 安装到 ESP
# bootctl install
这会将 systemd-boot UEFI 启动管理器复制到 ESP,为其创建一个 UEFI 启动条目,并将其设置为 UEFI 启动顺序中的第一个。
- 在 x64 UEFI 上,
/usr/lib/systemd/boot/efi/systemd-bootx64.efi
将被复制到esp/EFI/systemd/systemd-bootx64.efi
和esp/EFI/BOOT/BOOTX64.EFI
。 - 在 IA32 UEFI 上,
/usr/lib/systemd/boot/efi/systemd-bootia32.efi
将被复制到esp/EFI/systemd/systemd-bootia32.efi
和esp/EFI/BOOT/BOOTIA32.EFI
。
UEFI 启动条目将被称为 “Linux Boot Manager”,并将指向 ESP 上的 \EFI\systemd\systemd-bootx64.efi
或 \EFI\systemd\systemd-bootia32.efi
,具体取决于 UEFI 位数。
- 当运行
bootctl install
时,systemd-boot 将尝试在/efi
、/boot
和/boot/efi
中查找 ESP。 将esp
设置为不同的位置需要传递--esp-path=esp
选项。(有关详细信息,请参阅 bootctl(1) § OPTIONS。) - 安装 systemd-boot 将覆盖任何现有的
esp/EFI/BOOT/BOOTX64.EFI
(或 IA32 UEFI 上的esp/EFI/BOOT/BOOTIA32.EFI
),例如 Microsoft 版本的该文件。
要完成安装,请配置 systemd-boot。
使用 XBOOTLDR 安装
可以创建一个单独的 “Linux 扩展启动” (XBOOTLDR) 类型的 /boot 分区,以将内核和 initramfs 与 ESP 分开。 这对于 与 Windows 双启动 并且现有 ESP 太小的情况特别有用。
像往常一样准备一个 ESP,并在同一物理驱动器上创建另一个用于 XBOOTLDR 的分区。 XBOOTLDR 分区必须具有分区类型 GUID bc13c2ff-59e6-4262-a352-b275fd6f7172
[1](gdisk 的 ea00
类型,fdisk 的 xbootldr
类型)。 XBOOTLDR 分区的大小应足够大,以容纳您将要安装的所有内核。
- systemd-boot 不像对 ESP 那样执行文件系统检查。 因此,可以使用 UEFI 实现可以读取的任何文件系统。
- 当启用 “快速启动” 模式时,UEFI 可能会跳过加载 ESP 以外的分区。 这可能会导致 systemd-boot 无法在 XBOOTLDR 分区上找到条目; 在这种情况下,请禁用 “快速启动” 模式。
- XBOOTLDR 分区必须与 ESP 位于同一物理磁盘上,systemd-boot 才能识别它。
在安装过程中,将 ESP 挂载到 /mnt/efi
,将 XBOOTLDR 分区挂载到 /mnt/boot
。
进入 chroot 后,使用命令
# bootctl --esp-path=/efi --boot-path=/boot install
要完成安装,请配置 systemd-boot。
更新 UEFI 启动管理器
每当有新版本的 systemd-boot 时,用户可以选择重新安装 UEFI 启动管理器。 这可以手动或自动完成; 两种方法在下文描述。
手动更新
使用 bootctl 更新 systemd-boot
# bootctl update
bootctl install
一样,systemd-boot 将尝试在 /efi
、/boot
和 /boot/efi
中查找 ESP。 将 esp
设置为不同的位置需要传递 --esp-path=esp
选项。自动更新
要自动更新 systemd-boot,请使用 systemd 服务 或 pacman 钩子。 下面描述了这两种方法。
systemd 服务
从 250 版本开始,systemd 附带 systemd-boot-update.service
。 启用 此服务将在下次启动后更新引导加载程序。
pacman 钩子
软件包 systemd-boot-pacman-hookAUR 添加了一个 pacman 钩子,每次升级 systemd 时都会执行该钩子。
与其安装 systemd-boot-pacman-hook,您可能更喜欢手动将以下文件放置在 /etc/pacman.d/hooks/
中
/etc/pacman.d/hooks/95-systemd-boot.hook
[Trigger] Type = Package Operation = Upgrade Target = systemd [Action] Description = Gracefully upgrading systemd-boot... When = PostTransaction Exec = /usr/bin/systemctl restart systemd-boot-update.service
为安全启动签名
如果您启用了 安全启动,您可能希望添加一个 pacman 钩子,以便在每次升级软件包时自动对启动管理器进行签名
/etc/pacman.d/hooks/80-secureboot.hook
[Trigger] Operation = Install Operation = Upgrade Type = Path Target = usr/lib/systemd/boot/efi/systemd-boot*.efi [Action] Description = Signing systemd-boot EFI binary for Secure Boot When = PostTransaction Exec = /bin/sh -c 'while read -r i; do sbsign --key /path/to/keyfile.key --cert /path/to/certificate.crt "$i"; done;' Depends = sh Depends = sbsigntools NeedsTargets
将 /path/to/keyfile.key
和 /path/to/certificate.crt
替换为您的签名密钥和证书。 为了更好地理解此钩子,请查阅 sbsign(1)。
创建的 /usr/lib/systemd/boot/efi/systemd-boot*.efi.signed
将自动被 bootctl install
或 bootctl update
拾取。 请参阅 bootctl(1) § SIGNED .EFI FILES。
作为替代方案,请使用 sbctl。
配置
bootctl
(不带任何参数)以确保 systemd-boot 能够正确解析它。启动器配置
启动器配置存储在文件 esp/loader/loader.conf
中。 有关详细信息,请参阅 loader.conf(5) § OPTIONS。
下面提供了一个启动器配置示例
esp/loader/loader.conf
default arch.conf timeout 4 console-mode max editor no
- systemd-boot 不接受制表符进行缩进,请改用空格。
default
和timeout
可以在启动菜单本身中更改,并且更改将存储为 UEFI 变量LoaderEntryDefault
和LoaderConfigTimeout
,从而覆盖这些选项。bootctl set-default ""
和bootctl set-timeout ""
可用于清除覆盖default
和timeout
选项的 UEFI 变量。- 如果您已设置
timeout 0
,则可以通过按Space
键访问启动菜单。 - 基本的启动器配置文件位于
/usr/share/systemd/bootctl/loader.conf
。 - 如果启动加载程序(在条目选择期间)出现失真/使用错误的分辨率,您可以尝试将
console-mode
设置为auto
(使用启发式方法选择最佳分辨率)、keep
(保留固件提供的分辨率)或2
(尝试选择第一个非 UEFI 标准分辨率)。
记住上次的条目
可以将 default
更改为 @saved
,以便记住启动时上次选择的条目。 这对于双启动 Windows 并且 Windows 自动更新意外将您推入 Linux 的情况很有用。
esp/loader/loader.conf
default @saved ...
有关更多详细信息,请查阅 loader.conf(5)。
添加启动器
systemd-boot 将会在它启动时所使用的 EFI 系统分区 以及同一磁盘上的 XBOOTLDR 分区的 /loader/entries/
目录下搜索 .conf 文件。
esp/loader/entries/*.conf
中的条目只能使用esp/
目录下的文件(例如内核、initramfs、镜像等),而boot/loader/entries/*.conf
中的条目只能使用boot/
目录下的文件。- 文件路径参数是相对于您的 EFI 系统分区或 XBOOTLDR 分区的根目录。例如,如果您的 EFI 系统分区或 XBOOTLDR 分区挂载在
/boot
,那么/boot/vmlinuz-linux
文件必须在linux
键中指定为/vmlinuz-linux
。 - 当 安全启动 激活时,带有嵌入式
.cmdline
的 统一内核镜像 (UKI) 会忽略所有传递给它们的命令行选项(无论是使用带有options
的启动条目还是交互式地传递)。当安全启动未激活时,通过命令行传递的选项会覆盖嵌入的.cmdline
。
以下是一个加载器文件示例,展示了如何从使用 UUID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
的卷启动 Arch Linux:
esp/loader/entries/arch.conf
title Arch Linux linux /vmlinuz-linux initrd /initramfs-linux.img options root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw
esp/loader/entries/arch-fallback.conf
title Arch Linux (fallback initramfs) linux /vmlinuz-linux initrd /initramfs-linux-fallback.img options root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw
有关所有配置选项的详细信息,请参阅 启动加载器规范。
systemd-boot 会在启动时自动检查以下位置的引导管理器:/EFI/Microsoft/Boot/Bootmgfw.efi
的 Windows 启动管理器,固件中的 Apple macOS 启动管理器,UEFI shell /shellx64.efi
和 EFI 默认加载器 /EFI/BOOT/bootx64.efi
,以及 /EFI/Linux/
中找到的特殊准备的内核文件。当检测到它们时,将分别生成标题为 auto-windows
、auto-osx
、auto-efi-shell
和 auto-efi-default
的相应条目。这些条目不需要手动加载器配置。但是,它不会自动检测其他 EFI 应用程序(与 rEFInd 不同),因此为了启动 Linux 内核,必须创建手动配置条目。
initrd
中指定 /boot/amd-ucode.img
或 /boot/intel-ucode.img
,并且始终将其放在主 initramfs 镜像之前。UEFI Shell 或其他 EFI 应用程序
如果您通过软件包 edk2-shell 安装了 UEFI shell,如果 EFI 文件放置在 esp/shellx64.efi
中,systemd-boot 将会自动检测并创建一个新条目。要执行此操作,安装软件包后的示例命令将是
# cp /usr/share/edk2-shell/x64/Shell.efi /boot/shellx64.efi
否则,如果您将 其他 EFI 应用程序 安装到 ESP 中,您可以使用以下代码片段。
efi
行的文件路径参数是相对于您的 EFI 系统分区 的根目录。如果您的 EFI 系统分区挂载在 /boot
并且您的 EFI 二进制文件位于 /boot/EFI/xx.efi
和 /boot/yy.efi
,那么您应该将参数指定为 efi /EFI/xx.efi
和 efi /yy.efi
。esp/loader/entries/fwupd.conf
title Firmware updater efi /EFI/tools/fwupdx64.efi
esp/loader/entries/gdisk.conf
title GPT fdisk (gdisk) efi /EFI/tools/gdisk_x64.efi
Memtest86+
您需要安装 memtest86+-efi 才能使其工作。在使用安全启动时,还需要对 EFI 二进制文件进行签名。
esp/loader/entries/memtest.conf
title Memtest86+ efi /memtest86+/memtest.efi
网络启动
systemd-boot 可以链式加载 网络启动。下载 ipxe-arch.efi
EFI 二进制文件和签名,验证它并将其按建议放置在 esp/EFI/arch_netboot/arch_netboot.efi
中。
esp/loader/entries/arch_netboot.conf
title Arch Linux Netboot efi /EFI/arch_netboot/arch_netboot.efi
GRUB
systemd-boot 可以链式加载 GRUB。grubx64.efi
二进制文件的位置与 GRUB 安装到 ESP 时使用的 --bootloader-id=
相匹配。
esp/loader/entries/grub.conf
title GRUB efi /EFI/GRUB/grubx64.efi
从另一个磁盘启动
systemd-boot 不能 从除其启动时所使用的 ESP 或同一磁盘上的 XBOOTLDR 分区之外的分区启动 EFI 二进制文件,但它可以指示 UEFI shell 这样做。
首先,按照 上述描述 安装 edk2-shell。在 UEFI shell 中,使用 map 命令记下具有相应 PARTUUID 的分区的 FS 别名(例如:HD0a66666a2、HD0b、FS1 或 BLK7)。
然后,使用 exit
命令启动回 Linux,您可以在其中创建一个新的加载器条目,以通过 UEFI shell 运行目标 EFI 程序
esp/loader/entries/windows.conf
title Windows efi /shellx64.efi options -nointerrupt -nomap -noversion HD0b:EFI\Microsoft\Boot\Bootmgfw.efi
确保 efi
路径与 shellx64.efi
已复制到 esp 分区的位置相匹配。另请注意,shellx64.efi
EFI 文件可以移动到其他位置,以避免 systemd-boot 自动创建条目。
将 HD0b
替换为先前记下的 FS 别名。
-nointerrupt
选项可防止使用Ctrl+c
中断目标 EFI 程序。-nomap -noversion
选项隐藏默认的 UEFI shell 欢迎信息。- 要让 UEFI shell 在目标 EFI 程序退出时(例如,由于错误)自动返回到引导加载程序,请添加
-exit
选项。 - 如果 UEFI shell 中仍然存在不必要的输出,您还可以添加
-noconsoleout
选项。
启动进入 UEFI 固件设置
如果您的设备固件支持从操作系统重启进入设置,systemd-boot 将自动添加一个条目以启动进入 UEFI 固件设置。
支持休眠
请参阅 挂起和休眠。
带密码保护的内核参数编辑器
或者,您可以安装 systemd-boot-passwordAUR,它支持 password
基本配置选项。使用 sbpctl generate
为此选项生成一个值。
使用以下命令安装 systemd-boot-password
# sbpctl install esp
启用编辑器后,系统将提示您输入密码,然后才能编辑内核参数。
技巧和提示
您可以在菜单中使用 t
和 T
来调整菜单超时时间,使用 e
编辑此启动的内核参数。按 h
查看有用的热键简短列表。有关启动菜单内可用的完整按键绑定列表,请参阅 systemd-boot(7) § 按键绑定。
选择下次启动项
引导管理器与 systemctl 命令集成,允许您选择在重启后要启动的选项。例如,假设您构建了一个自定义内核并创建了一个条目文件 esp/loader/entries/arch-custom.conf
以启动它,您可以直接运行
$ systemctl reboot --boot-loader-entry=arch-custom.conf
您的系统将重启进入该条目,并为后续启动保持默认选项不变。要查看可能的条目列表,请传递 --boot-loader-entry=help
选项。
如果您想直接启动到主板的固件,则可以使用此命令
$ systemctl reboot --firmware-setup
统一内核镜像
统一内核镜像 (UKI) 在 esp/EFI/Linux/
中会被 systemd-boot 自动获取,并且不需要在 esp/loader/entries
中添加条目。(请注意,统一内核镜像必须具有 .efi
扩展名才能被 systemd-boot 识别。)
esp/loader/loader.conf
中未设置 default
,则会首先启动 esp/loader/entries/
中的文件。删除这些条目,或使用完整文件名设置默认值,即 default arch-linux.efi
ESP 上的 Grml
PKGBUILD
可用:grml-systemd-bootAUR。Grml 是一个小型 live 系统,其中包含用于系统管理和救援的软件集合。
为了在 ESP 上安装 Grml,我们只需要将内核 vmlinuz
、initramfs initrd.img
和 squashfs 镜像 grml64-small.squashfs
从 iso 文件复制到 ESP。为此,首先下载 grml64-small.iso 并挂载该文件(挂载点在下文中表示为 mnt);内核和 initramfs 位于 mnt/boot/grml64small/
中,squashfs 镜像位于 mnt/live/grml64-small/
中。
接下来,在您的 ESP 中为 Grml 创建一个目录,
# mkdir -p esp/grml
并将上述文件复制到其中
# cp mnt/boot/grml64small/vmlinuz esp/grml # cp mnt/boot/grml64small/initrd.img esp/grml # cp mnt/live/grml64-small/grml64-small.squashfs esp/grml
在最后一步,为 systemd-boot 加载器创建一个条目:在 esp/loader/entries
中创建一个包含以下内容的 grml.conf
文件
esp/loader/entries/grml.conf
title Grml Live Linux linux /grml/vmlinuz initrd /grml/initrd.img options apm=power-off boot=live live-media-path=/grml/ nomce net.ifnames=0
有关可用启动选项的概述,请查阅 Grml 的 cheatcode。
ESP 上的 Archiso
PKGBUILD
可用:archiso-systemd-bootAUR。与 Grml 类似,可以使用 Arch Linux ISO。为此,我们需要将内核 vmlinuz-linux
、initramfs initramfs-linux.img
和 squashfs 镜像 airootfs.sfs
从 ISO 文件复制到 EFI 系统分区。
首先下载 archlinux-YYYY.MM.DD-x86_64.iso。
接下来,在您的 ESP 中为 archiso 创建一个目录
# mkdir -p esp/EFI/archiso
将 arch
目录的内容提取到其中
# bsdtar -v -x --no-same-permissions --strip-components 1 -f archlinux-YYYY.MM.DD-x86_64.iso -C esp/EFI/archiso arch
在最后一步,为 systemd-boot 加载器创建一个启动条目:在 esp/loader/entries
中创建一个包含以下内容的 arch-rescue.conf
文件
esp/loader/entries/arch-rescue.conf
title Arch Linux (rescue system) linux /EFI/archiso/boot/x86_64/vmlinuz-linux initrd /EFI/archiso/boot/x86_64/initramfs-linux.img options archisobasedir=/EFI/archiso archisosearchfilename=/EFI/archiso/boot/x86_64/vmlinuz-linux
有关可用启动选项的概述,请查阅 mkinitcpio-archiso 的 README.bootparams。
BIOS 系统上的 systemd-boot
如果您需要一个用于 BIOS 系统的引导加载程序,该程序遵循 启动加载器规范,那么 systemd-boot 可以在 BIOS 系统上投入使用。Clover 引导加载程序支持从 BIOS 系统启动并提供模拟的 UEFI 环境。
故障排除
systemd-boot 不显示我的启动条目
这可能是由配置文件的各种问题引起的,例如内核路径指定不正确。要检查,请运行
# bootctl
在 BIOS 模式下启动后安装
如果在 BIOS 模式下启动,您仍然可以安装 systemd-boot,但是此过程需要您告诉固件在启动时启动 systemd-boot 的 EFI 文件
- 您在其他地方有一个可用的 UEFI Shell。
- 您的固件界面提供了一种正确设置启动时需要加载的 EFI 文件的方法。
- 如果 UEFI 中没有设置其他条目,则某些固件可能会使用默认的
esp/EFI/BOOT/BOOTX64.EFI
。
如果您可以做到,安装会更容易:进入您的 UEFI Shell 或固件配置界面,并将您机器的默认 EFI 文件更改为 esp/EFI/systemd/systemd-bootx64.efi
。
使用 efibootmgr 手动添加条目
如果 bootctl install
命令失败,您可以使用 efibootmgr 手动创建一个 UEFI 启动条目
# efibootmgr --create --disk /dev/sdX --part Y --loader '\EFI\systemd\systemd-bootx64.efi' --label "Linux Boot Manager" --unicode
其中 /dev/sdXY
是 EFI 系统分区。
\
) 作为分隔符从 Windows 使用 bcdedit 手动添加条目
如果出于任何原因您需要在 Windows 中创建 UEFI 启动条目,则可以使用管理员提示符下的以下命令
> bcdedit /copy {bootmgr} /d "Linux Boot Manager" > bcdedit /set {guid} path \EFI\systemd\systemd-bootx64.efi
将 guid
替换为第一个命令返回的 id。您还可以使用以下命令将其设置为默认条目
> bcdedit /default {guid}
Windows 升级后菜单不出现
请参阅 UEFI#Windows 更改启动顺序。
添加对 Windows BitLocker TPM 解锁的支持
要阻止 BitLocker 请求恢复密钥,请将以下内容添加到 loader.conf
esp/loader/loader.conf
reboot-for-bitlocker yes
这将设置 BootNext UEFI 变量,从而在加载 Windows Boot Manager 时,BitLocker 不会要求恢复密钥。这是一个一次性更改,systemd-boot 仍然是默认的引导加载程序。如果 Windows 已被自动检测到,则无需将其指定为条目。
这是一个实验性功能,因此请务必查阅 loader.conf(5)。