Systemd-boot

跳转到:导航搜索

systemd-boot 是一个简单的 UEFI 引导管理器。它提供一个文本菜单来选择要引导的条目,并提供一个用于内核命令行编辑器的界面。systemd-boot 仅支持具有 UEFI 固件的系统。

基本安装

仅使用上游功能也可以使用 systemd-boot。但是,这将缺乏与 btrfs 快照的集成和支持。因此,以下说明用于解释或在非 btrfs 系统上使用。

默认情况下,使用 yast 进行全新安装会建议创建一个 500MB 的 EFI 分区并安装 grub。这很好,并且可以正常工作。

编辑 /etc/sysconfig/bootloader 中的 LOADER_TYPE 为空值,以确保其他脚本不会在以后干扰。

安装 systemd-boot。请注意,它将覆盖 efi 分区上的 /EFI/BOOT/BOOTX64.EFI。请记住这一点,如果系统包含其他安装程序。

   # bootctl --make-machine-id-directory=yes install
   Created "/boot/efi/EFI/systemd".
   Created "/boot/efi/loader".
   Created "/boot/efi/loader/entries".
   Created "/boot/efi/EFI/Linux".
   Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/efi/EFI/systemd/systemd-bootx64.efi".
   Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/efi/EFI/BOOT/BOOTX64.EFI".
   Created "/boot/efi/6626acc518bd42bcbf374199a45a6fb3".
   Random seed file /boot/efi/loader/random-seed successfully written (512 bytes).
   Not installing system token, since we are running in a virtualized environment.
   Created EFI boot entry "Linux Boot Manager".

验证 systemd-boot 是否处于活动状态

   # tree /boot/efi/
   /boot/efi/
   ├── 6626acc518bd42bcbf374199a45a6fb3
   ├── EFI
   │   ├── Linux
   │   ├── boot
   │   │   ├── BOOTX64.EFI
   │   │   ├── MokManager.efi
   │   │   └── fallback.efi
   │   ├── opensuse
   │   │   ├── MokManager.efi
   │   │   ├── boot.csv
   │   │   ├── grub.cfg
   │   │   ├── grub.efi
   │   │   ├── grubx64.efi
   │   │   └── shim.efi
   │   └── systemd
   │       └── systemd-bootx64.efi
   └── loader
       ├── entries
       ├── loader.conf
       └── random-seed
   
   8 directories, 12 files
   # efibootmgr -v
   BootCurrent: 0003
   Timeout: 0 seconds
   BootOrder: 0001,0003,0002,0000
   Boot0000* UiApp FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)
   Boot0001* Linux Boot Manager    HD(1,GPT,bc0eb5a4-6f31-485f-8d6b-581c60653263,0x800,0x100000)/File(\EFI\systemd\systemd-bootx64.efi)
   Boot0002* UEFI Misc Device      PciRoot(0x0)/Pci(0x2,0x3)/Pci(0x0,0x0)N.....YM....R,Y.
   Boot0003* opensuse-secureboot   HD(1,GPT,bc0eb5a4-6f31-485f-8d6b-581c60653263,0x800,0x100000)/File(\EFI\opensuse\shim.efi)

安全启动

如果启用了安全启动,则需要手动安装 shim。由于 shim 仅读取 grub.efi,因此需要将 systemd-boot 重命名为假装它是 grub

   # mokutil --sb-state
   SecureBoot enabled
   # mv /boot/efi/EFI/systemd/systemd-bootx64.efi /boot/efi/EFI/systemd/grub.efi
   # cp /usr/share/efi/x86_64/shim.efi /boot/efi/EFI/systemd/shim.efi
   # cp /usr/share/efi/x86_64/MokManager.efi /boot/efi/EFI/systemd/MokManager.efi

每次 `bootctl install` 后都需要重复这些步骤

使用完整的 BTRFS 快照和安全启动支持进行安装

为了将 systemd-boot 与 btrfs 快照集成,需要一些额外的工具。上游目前不支持它(但正在进行中)。额外的工具的工作原理在此 文档 中说明。

Icon-warning.png
警告: Systemd-boot 支持是实验性的。除非您知道如何从引导失败中恢复,否则不要在生产环境中使用它!
在 MicroOS 上,在事务性 shell 中执行命令 transactional-update --no-selfupdate --continue shell

如果 /etc/sysconfig/bootloader 存在,请确保将 LOADER_TYPE 更改为空值:LOADER_TYPE="",以免其他工具意外运行不同引导加载程序的脚本。

删除 grub 的痕迹

   # efibootmgr --delete --label opensuse-secureboot
   # efibootmgr --delete --label "openSUSE Boot Manager"
   # rm -r /boot/efi/EFI/opensuse

安装 systemd-boot 实用程序。接受删除 grub2

   # zypper in sdbootutil-snapper sdbootutil-rpm-scriptlets

退出 transactional-update shell 并安装 systemd-boot 并为所有内核添加条目

   # exit
   # sdbootutil install
   # sdbootutil add-all-kernels

已知问题/缺失功能

  • systemd-boot 不会更新 EFI 分区中的自身(通过“sdbootutil update”更新它)
  • 首次使用 systemd-boot 引导可能会选择错误快照。解决方法是在首次引导时按住空格键,从菜单中选择正确的快照。然后按“d”将其设置为默认值。在正在运行的系统中,您还可以使用 sdbootutil set-default-snapshot $NUMBER 来引导正确的快照。 上游问题

通过 chroot 修复/重新安装 systemd-boot

如果由于某种原因您破坏了 systemd-boot,并且系统不再引导,则可以通过 chroot 修复它。

第一步是引导任何 linux 的 live iso,不一定必须是 openSUSE。

将根分区或逻辑卷挂载到 /mnt

   # mount /dev/<device name> /mnt

将 esp 分区挂载到 /mnt/boot/efi

   # mount /dev/<device name> /mnt/boot/efi

挂载完成后,使用以下 for 循环来 rbind 虚拟文件系统

   # for i in proc sys dev run; do mount --rbind /$i /mnt/$i ; done

在挂载了根文件系统和虚拟文件系统后,运行此命令以 chroot 进入

   # chroot /mnt

进入 chroot 后,最好运行此命令以确保也挂载了所有其他必要的分区

   # mount -a

现在您可以重新安装 systemd-boot

   # sudo sdbootutil install
   # sudo sdbootutil add-all-kernels

您可以使用 `exit` 退出并重新启动系统。Systemd-boot 应该像往常一样工作。

预构建的 Appliance

有用于在 qemu 中使用的带有 systemd-boot 的预构建镜像,用于 MicroOS 以及 Tumbleweed

这些镜像需要使用 UEFI 固件引导,并且不能与 Legacy MBR VM 一起使用。

除了支持带有快照和回滚的 systemd-boot,这些镜像还在首次交互式引导时对自身进行加密。如果检测到 TPM 或 FIDO2 密钥,则首次引导向导将提供使用任一密钥来解锁磁盘。使用 TPM 可以在未修改引导文件的情况下实现无人值守引导。FIDO2 需要按下令牌上的按钮。

参考资料