2023 archlinux 启用 Secure Boot (安全启动) 的最简单方法 -- sbctl
配置背景
最近在我的 Thinkpad 上装了 Windows 11 + Archlinux 双系统。想要开启下 Secure Boot。
其实不开启 Secure Boot 双系统运行也正常。目前 Windows 11 仅在安装阶段要求 Secure Boot,安装完成后可以关闭。不过由于 WSA 以及部分游戏的反作弊模块会校验 Secure Boot。为了不影响 Windows 功能,最终决定开启它。
注意事项
- 本文的操作存在设备损坏的风险,该风险需要你自行承担。
- sbctl 不能保证对所有设备生效。本文的方法,在 Thinkpad T14 Gen3 (Intel) 版本下配置成功,但不保证适配所有设备。
- 某些设备固件可能由制造商通过密钥签名。对于固件的修改可能导致这些设备验证出错无法启动。特别是仅有独显的设备,如果独立显卡在BIOS显示阶段出现问题,则会导致设备无法展示BIOS界面,从而导致设备变砖。一般此类设备会使用微软密钥进行签名。虽然本文介绍的方法使用的也是微软密钥,理论上出现问题的可能性较低,但仍有风险。请提前阅读以下文章以了解详情:1)Bai-Chiang 安装笔记 , 2)sbctl FAQ
- 如果 Windows 开启了 BitLocker 请提前关闭。
关于 Shim
对于 Ubuntu / Fedora / Debian 来说,开启 Secure Boot 可能就是配置下 BIOS 的事情,而由于 ArchLinux 系统下,官方移除了 Secure Boot 支持,事情就没有那么简单了。你需要自己基于Arch Wiki 进行手动配置。
根据 ArchBoot 和 Debian 对Secure Boot的支持来看,它们都使用的是 Shim 的方式。
Shim 是 fedora 团队提供的一个为 linux 系统支持 secure boot 的解决方案。shim提供了一个由微软支持的第三方签名 efi 启动项(shimx64.efi),和一个 MokManager (mmx64.efi)。MokManager 用于在你启动失败的时候,提供一个 Fallback 界面让你导入你的 key / hash。配置好后,BIOS 设置Secure Boot允许微软颁发的第三方CA证书,应该就可以正常启动了。
最初我也想通过类似的方式实现。但是最后还是停在了 “shim Verification Failed 0x1A security violation” 这个报错上。
Arch Wiki 说 Grub 启动要指定 GRUB_MODULES,但是我的报错和 Wiki 提到的也不完全相同。我也不想再去尝试 PreLoader, rEFInd, systemd-boot 这些我不熟悉的工具链。
最终在 reddit 上找到了一个高赞文章《My easy method for setting up Secure Boot with GRUB》。看上去很美好,通过 sbctl,直接使用微软的证书签名自己的密钥。我也很快就配置成功了。
在这里翻译一下分享给需要在 ArchLinux 开启 Secure Boot 的朋友。
配置方法
下文中esp需要修改为你的efi挂载分区,按照官方Wiki安装的话,应该是/boot目录。
以下命令通过 root 权限运行
# 重新安装 Grub
grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB --modules="tpm" --disable-shim-lock
# 生成启动项
grub-mkconfig -o /boot/grub/grub.cfg
# 安装 sbctl (Secure Boot配置工具)
pacman -S sbctl
# 下面的命令执行前需要在 BIOS 的 UEFI 配置中,设置 Secure Boot 为 Setup 模式,文末有图。
# 重启后校验是否进入进入了安装模式
sbctl status
# 创建 keys
sbctl create-keys
# 使用微软的CA证书注册 keys
sbctl enroll-keys -m
# enroll-keys 会提示一些 efivars 不可写
# 通过 chattr -i 修改后再次执行 enroll-keys
chattr -i /sys/firmware/efi/efivars/<filename>
# 查看状态
sbctl status
# 检测状态,会看到启动项未签名
sbctl verify
# 启动项签名
sbctl sign -s /boot/EFI/GRUB/grubx64.efi
# 检测状态,会看到启动项已签名
sbctl verify
# 重启,并在 UEFI 中开启 Secure Boot
# 再次查看状态
sbctl status
# sbctl 自带了一个 pacman hook 用于自动签名,所以在更新系统后无需额外处理。
其他
恢复 bios 默认选项导致无法启动
如果恢复 BIOS 默认选项,可能导致无法启动,这是因为 efi 启动项也被重置了。
解决方法是提前将 grubx64.efi 复制为 bootx64.efi 以支持硬盘启动,或者通过 efibootmgr 重新创建启动项。
Windows 安装时,会自动在 esp/EFI/Boot 下创建 bootx64.efi,替换它就可以在 BIOS 重置默认选项后,选择硬盘来启动。我已经通过 os-prober 让 GRUB 的启动项中包含了 Windows。所以 Windows 的 bootx64.efi 我已经用不到了。
# 拷贝 grubx64.efi 为 bootx64.efi
cd /boot/EFI/
rm Boot/*
cp GRUB/grubx64.efi Boot/bootx64.efi
# 也可在 grub-install 时,添加 --removeable 参数
也可以通过U盘启动livecd后,重新创建 linux 的启动项。
# 重新创建启动项
# 我的efi分区为 nvme0n1p1
# 命令中的 disk part 参数需自行调整 disk 是磁盘名 part 是分区号
fdisk -l
efibootmgr --unicode --disk /dev/nvme0n1 --part 1 --create --label "GRUB" --loader /EFI/GRUB/grubx64.efi
bios 设置 Secure Boot 为 Setup 模式
引用:
- https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface/Secure_Boot#shim
- https://www.reddit.com/r/archlinux/comments/10pq74e/my_easy_method_for_setting_up_secure_boot_with/
- https://www.reddit.com/r/archlinux/comments/10k58uj/encrypted_root_secure_boot_unified_kernel_image/
- https://pkgbuild.com/~tpowa/archboot/web/archboot.html#secure-boot-support-with-shim-package-signed-from-fedora
- https://wiki.debian.org/SecureBoot
- https://github.com/Foxboron/sbctl/wiki
本文采用 知识共享署名 4.0 国际许可协议 进行许可