systemd-boot

出自 ArchWiki
(重定向自 Gummiboot

systemd-boot(7),之前名为 gummiboot (德语意为 “橡皮艇”),是一个易于配置的 UEFI 启动管理器。它提供了一个文本菜单来选择启动项,以及一个用于编辑内核命令行编辑的界面。

请注意,systemd-boot 只能从安装它的 EFI 系统分区 或同一磁盘上的扩展启动加载器分区 (XBOOTLDR 分区) 启动 EFI 可执行文件 (例如,Linux 内核 EFI 启动桩UEFI ShellGRUBWindows 启动管理器)。

注意: 在整篇文章中,esp 表示 EFI 系统分区 的挂载点,而 boot 表示可选 XBOOTLDR 分区的挂载点。假设您已 chroot 到系统的挂载点。

支持的文件系统

systemd-boot 继承了 固件 对文件系统的支持 (即至少 FAT12、FAT16 和 FAT32)。此外,它还会加载放置在 esp/EFI/systemd/drivers/ 中的任何 UEFI 驱动程序

安装

systemd-bootsystemd 软件包一起发布,该软件包是 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.efiesp/EFI/BOOT/BOOTX64.EFI
  • 在 IA32 UEFI 上,/usr/lib/systemd/boot/efi/systemd-bootia32.efi 将被复制到 esp/EFI/systemd/systemd-bootia32.efiesp/EFI/BOOT/BOOTIA32.EFI

本文或章节已过时。

原因: 在 chroot 环境中运行时,自 systemd v257 起,bootctl 不再在 NVRAM 中创建 UEFI 启动项。(在 User talk:Scimmia#Revert on systemd-boot about sd-boot not creating EFI entries inside chroot 中讨论)

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 安装

本文或章节是移动到 分区#独立分区 的候选内容。

注意: 所有分区信息都应移动到分区,如果采用这种设置,则仅保留与安装 systemd-boot 相关的步骤。(在 Talk:Systemd-boot 中讨论)

可以创建一个单独的 “Linux 扩展引导” (XBOOTLDR) 类型的 /boot 分区,以将内核和 initramfs 与 ESP 分开。这对于 与 Windows 双启动 并且现有 ESP 太小的情况特别有用。

像往常一样准备一个 ESP,并在同一物理驱动器上创建另一个 XBOOTLDR 分区。XBOOTLDR 分区必须具有分区类型 GUID bc13c2ff-59e6-4262-a352-b275fd6f7172 [1] (对于 gdiskea00 类型,对于 fdiskxbootldr 类型)。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 启动管理器。这可以手动或自动完成;以下描述了两种方法。

注意: UEFI 启动管理器是一个独立的 EFI 可执行文件,任何版本都可以用于启动系统 (不适用部分更新,因为 pacman 仅安装 systemd-boot 安装程序,而不是 systemd-boot 本身)。但是,新版本可能会添加新功能或修复错误,因此更新 systemd-boot 可能是个好主意。
警告: 如果您启用了 安全启动,则需要对引导加载程序更新进行签名。请参阅 #为安全启动签名

手动更新

使用 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 installbootctl 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 不接受制表符进行缩进,请改用空格。
  • defaulttimeout 可以在启动菜单本身中更改,更改将作为 UEFI 变量 LoaderEntryDefaultLoaderConfigTimeout 存储,覆盖这些选项。
  • bootctl set-default ""bootctl set-timeout "" 可用于清除覆盖 defaulttimeout 选项的 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,则必须在 linux 键中将 /boot/vmlinuz-linux 文件指定为 /vmlinuz-linux
  • 安全启动 处于活动状态时,带有嵌入式 .cmdline统一内核镜像 (UKI) 会忽略传递给它们的所有命令行选项 (通过带有 options 的启动项或交互式方式)。当安全启动未激活时,通过命令行传递的选项将覆盖嵌入式 .cmdline

以下是启动卷上 Arch 的加载器文件示例,使用其 UUID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

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 将在启动时自动检查 Windows 启动管理器 (位置 /EFI/Microsoft/Boot/Bootmgfw.efi)、固件中的 Apple macOS 启动管理器UEFI Shell /shellx64.efiEFI 默认加载器 /EFI/BOOT/bootx64.efi,以及在 /EFI/Linux/ 中找到的专门准备的内核文件。检测到后,将分别生成标题为 auto-windowsauto-osxauto-efi-shellauto-efi-default 的相应启动项。这些启动项不需要手动引导加载器配置。但是,它不会自动检测其他 EFI 应用程序 (与 rEFInd 不同),因此为了启动 Linux 内核,必须创建手动配置启动项。

提示
  • 可以使用命令 bootctl list 列出已配置的可用启动项。
  • 示例启动项文件位于 /usr/share/systemd/bootctl/arch.conf
  • 有关 LVMLUKSdm-cryptBtrfs 等场景的 内核参数 可以在相关页面上找到。
注意: 如果使用 外部微码 initramfs 镜像 (例如,当使用 Booster 作为 initramfs 生成器时),则必须在单独的 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.efiefi /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 可以链式加载 GRUBgrubx64.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

启用编辑器后,系统将提示您输入密码,然后您才能编辑内核参数。

技巧与窍门

启动菜单内的按键

您可以在菜单中使用 tT 来调整菜单超时,使用 e 来编辑此启动的内核参数。按 h 查看有用的热键的简短列表。有关启动菜单中可用的完整按键绑定列表,请参阅 systemd-boot(7) § KEY BINDINGS

选择下次启动项

启动管理器与 systemctl 命令集成,允许您选择重启后要启动的选项。例如,假设您构建了一个自定义内核并创建了一个启动项文件 esp/loader/entries/arch-custom.conf 以启动到其中,您可以直接启动

$ systemctl reboot --boot-loader-entry=arch-custom.conf

您的系统将重启进入该启动项,并为后续启动保持默认选项不变。要查看可能的启动项列表,请传递 --boot-loader-entry=help 选项。

如果您想直接启动进入主板的固件,则可以使用以下命令

$ systemctl reboot --firmware-setup

统一内核镜像

esp/EFI/Linux/ 中的统一内核镜像 (UKI) 由 systemd-boot 自动获取,并且不需要在 esp/loader/entries 中添加启动项。(请注意,统一内核镜像必须具有 .efi 扩展名才能被 systemd-boot 识别。)

提示: 如果在 esp/loader/loader.conf 中未设置 default,则 esp/loader/entries/ 中的文件将首先启动。删除这些启动项,或使用完整文件名设置默认值,即 default arch-linux.efi

ESP 上的 Grml

注意: 以下说明并非 Grml 独有。稍作调整,安装其他软件 (例如,SystemRescueCD) 也是可能的。
提示: 提供了一个 PKGBUILDgrml-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

提示: 提供了一个 PKGBUILDarchiso-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

注意: Dell Latitude 系列的固件界面提供了设置 UEFI 启动所需的一切,但 UEFI Shell 将无法写入计算机的 ROM。

使用 efibootmgr 手动添加启动项

如果 bootctl install 命令失败,您可以使用 efibootmgr 手动创建 UEFI 启动项

# efibootmgr --create --disk /dev/sdX --part Y --loader '\EFI\systemd\systemd-bootx64.efi' --label "Linux Boot Manager" --unicode

其中 /dev/sdXYEFI 系统分区

注意: 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 启动管理器 而无需 BitLocker 请求恢复密钥。这是一次性更改,systemd-boot 仍然是默认引导加载程序。如果 Windows 是自动检测到的,则无需将其指定为启动项。

这是一个实验性功能,因此请务必查阅 loader.conf(5)

参见