Systemd-boot
systemd-boot 是一个简单的 UEFI 引导管理器。它提供一个文本菜单来选择要引导的条目,并提供一个用于内核命令行编辑器的界面。systemd-boot 仅支持具有 UEFI 固件的系统。
基本安装
默认情况下,使用 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 快照集成,需要一些额外的工具。上游目前不支持它(但正在进行中)。额外的工具的工作原理在此 文档 中说明。
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 需要按下令牌上的按钮。
引导加载程序
加密
首次引导向导
根密码
可以使用根密码作为加密密码
首次引导显示恢复密钥





