Loading

2023 archlinux 启用 Secure Boot (安全启动) 的最简单方法 -- sbctl

配置背景

最近在我的 Thinkpad 上装了 Windows 11 + Archlinux 双系统。想要开启下 Secure Boot。

其实不开启 Secure Boot 双系统运行也正常。目前 Windows 11 仅在安装阶段要求 Secure Boot,安装完成后可以关闭。不过由于 WSA 以及部分游戏的反作弊模块会校验 Secure Boot。为了不影响 Windows 功能,最终决定开启它。

注意事项

  1. 本文的操作存在设备损坏的风险,该风险需要你自行承担。
  2. sbctl 不能保证对所有设备生效。本文的方法,在 Thinkpad T14 Gen3 (Intel) 版本下配置成功,但不保证适配所有设备。
  3. 某些设备固件可能由制造商通过密钥签名。对于固件的修改可能导致这些设备验证出错无法启动。特别是仅有独显的设备,如果独立显卡在BIOS显示阶段出现问题,则会导致设备无法展示BIOS界面,从而导致设备变砖。一般此类设备会使用微软密钥进行签名。虽然本文介绍的方法使用的也是微软密钥,理论上出现问题的可能性较低,但仍有风险。请提前阅读以下文章以了解详情:1)Bai-Chiang 安装笔记 , 2)sbctl FAQ
  4. 如果 Windows 开启了 BitLocker 请提前关闭。

关于 Shim

对于 Ubuntu / Fedora / Debian 来说,开启 Secure Boot 可能就是配置下 BIOS 的事情,而由于 ArchLinux 系统下,官方移除了 Secure Boot 支持,事情就没有那么简单了。你需要自己基于Arch Wiki 进行手动配置。

根据 ArchBootDebian 对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 模式

BIOS 新 UI

BIOS 老 UI

引用:

  1. https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface/Secure_Boot#shim
  2. https://www.reddit.com/r/archlinux/comments/10pq74e/my_easy_method_for_setting_up_secure_boot_with/
  3. https://www.reddit.com/r/archlinux/comments/10k58uj/encrypted_root_secure_boot_unified_kernel_image/
  4. https://pkgbuild.com/~tpowa/archboot/web/archboot.html#secure-boot-support-with-shim-package-signed-from-fedora
  5. https://wiki.debian.org/SecureBoot
  6. https://github.com/Foxboron/sbctl/wiki
posted @ 2023-03-25 09:45  wswind  阅读(5517)  评论(0编辑  收藏  举报