用 systemd-boot 替换 GRUB

👍 在桶装幺蛾子食用更佳!

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-bootsystemd 的依赖,而后者又是 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

首先把 grubosprober 包删掉:

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 时间超过了引导时间?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值