👍 在桶装幺蛾子食用更佳!
systemd-boot 是一个易于配置的 UEFI 启动引导管理器。相比于更加常见的 GNU GRUB,它有以下优缺点:
- 轻量灵活,功能和界面都很精简,配置文件很好写(GRUB 的配置文件甚至需要
grub-mkconfig
转译)。 - 是一个原生的 EFI 应用程序,只使用固件功能。这导致了下一条的功能缺失。
- 缺乏 GRUB 的一些功能,例如不支持主题、不支持文件系统读写(FAT 等 EFI 固件支持的除外);对于 BTRFS 用户来说,还不支持直接从 BTRFS 子卷启动(只能写内核参数)。
- 似乎有些同学认为 systemd-boot 界面比 GRUB 好看。
对本蛾子来说,由于不需要 Windows 双启动,也不怎么使用 BTRFS 子卷启动的功能,systemd-boot 的功能足矣。因此,今天就来删掉 GRUB,安装 systemd-boot。
📦 安装 systemd-boot
在 Arch Linux 上,systemd-boot
是 systemd
的依赖,而后者又是 base
包组的依赖,因此您应当已经安装了 systemd-boot,可以通过 bootctl
配置。
首先,将 systemd-boot 安装到 /boot
:
sudo bootctl install
systemd-boot 默认您的 ESP 分区是
/boot
、/boot/efi
或/efi
。
如果您的输出中包括以下警告:
⚠️ Mount point '/boot' which backs the random seed file is world accessible, which is a security hole! ⚠️
⚠️ Random seed file '/boot/loader/[SEED]' is world accessible, which is a security hole! ⚠️
您可以先移除安装:
sudo bootctl remove
这是因为您给 /boot
设置的挂载选项给普通用户 r--
的权限,而用于生成证书的种子文件也被设置为了可读,提示您这是一个安全风险。您可以修改 /etc/fstab
,在 /boot
的挂载参数中添加 uid=0,gid=0
并修改 umask=0077,fmask=0077
,这样对普通用户的权限就是 ---
。
然后,卸载并重新挂载 /boot
:
sudo umount /boot
sudo systemctl daemon-reload
sudo mount -a
尝试以普通用户执行 cd /boot
,如果出现 Permission denied
,说明您设置的默认权限已经生效。
💡 umask 是 Linux 创建新文件时的默认权限。
权限分为读取、写入和执行(
rwx
),分别对应数字 4 4 4、 2 2 2、 1 1 1,将数字相加,就可以得到对应的权限。例如,r-x
就是 4 + 1 = 5 4+1=5 4+1=5。权限的对象分为所有者用户、所有者群组和其他人,三者的权限连在一起就是文件的权限设置,如rwxr-xr--
对应数字754
。需要注意,umask 是「减去」的权限数字,上文设置的
0077
结果就是700
,也就是除了所有者(uid=0
就是 Root,而gid=0
就是 Root 的群组)Root 外任何人都无法读写或执行。
再次执行安装指令,就看不到这个警告了。
systemd-boot 不会自动更新引导程序。您可以安装 AUR 包 systemd-boot-pacman-hook
来自动更新。
⚙️ 配置 systemd-boot
systemd-boot 的配置文件直接存储在 /boot/loader
里。
编辑 /boot/loader/loader.conf
,例如:
default @saved
timeout 0
console-mode auto
editor no
其中:
default @saved
:进入上次引导的系统。您也可设置为arch.conf
,也就是您稍后在entries
目录里设置的文件名。timeout 0
:不显示引导菜单。本蛾子很喜欢这个功能,可以节约选择操作系统的时间;如果需要修改内核参数,在开机时按空格即可(很像进入 BIOS 的方法)。console-mode auto
:分辨率设置,自动选择。
然后在 entries
里添加条目。systemd-boot 没有 GRUB 的 os-prober
这样的工具,只能自行添加。例如 /boot/loader/entries/arch.conf
:
title Arch Linux
linux /vmlinuz-linux
initrd /amd-ucode.img
initrd /initramfs-linux.img
options ...
注意几点:
- 如果您使用 CPU 的特定微码,必须设置
initrd /amd-ucode.img
或者initrd /intel-ucode.img
,且必须在initrd /initramfs-linux.img
之前。 options
就是内核参数,可以用sudo grub-mkconfig 2>/dev/null | grep vmlinuz
抄 GRUB 的。尤其是 BTRFS 用户,若不向内核指定子卷将无法启动。
如果您双系统使用 Windows,systemd-boot 会在启动时自动查找其 EFI 文件,加入菜单。同样的还有 UEFI 命令行和固件设置。
由于 systemd-boot 与 systemd 良好的耦合,您可以在重启时指定下一次启动的条目,或者进入固件设置:
sudo systemctl reboot --boot-loader-entry=[SOME_ENTRY].conf
sudo systemctl reboot --firmware-setup
本蛾子警告您:现在不要删除 GRUB!
📜 测试启动
大部分电脑启动时允许您指定从哪一个来源启动;在 UEFI 中,就是从哪个 EFI 应用程序启动。例如,本蛾子的电脑可以使用 F12 键。总之,在进入选择界面之后,您可以选择使用 systemd-boot 启动,若成功引导,则安装正确 🎉
如果出现了配置文件格式错误,但内核可以正常启动,您会看见一条一闪而过的红色警告。不要犹豫——拿出手机录视频,看清楚到底是什么报错。
如果引导结果显示找不到 /sbin/init
,那就是您的 initrd
配置错误(例如没写微码的 initrd
),或者您使用 BTRFS 而未指定子卷。
🗑 删掉 GRUB
首先把 grub
和 osprober
包删掉:
sudo pacman -Rs grub osprober grub-btrfs
然后删除 GRUB 留下的配置文件:
sudo rm /etc/default/grub.pacsave
删除 GRUB 的引导文件:
sudo rm -rf /boot/grub grubfont.pf2
最后拿 efibootmgr
删除启动项:
sudo efibootmgr # 确认 GRUB 是哪个启动项
sudo efibootmgr -b [GRUB_BOOTNUM] -B
然后再次重启测试。如果出现任何问题,翻出您安装 Arch Linux 时安装 GRUB 的命令,从镜像 arch-chroot
进去重装引导即可。UEFI 的一大优点就是灵活。
如果您还有其他的引导程序,它可能意外成了第一启动项。您同样可以用 efibootmgr
修改顺序,详情请查看 efibootmgr -h
。
🎆 下课
systemd-boot 启动是真的快,甚至 BIOS 时间超过了引导时间?