Linux 操作系统如何启用 secure boot(不限发行版)(简单的方法)
网上很多方法比较复杂,而且容易出现各种不兼容问题,这里我记录我的一种比较简单的方法。(需要确保你的电脑支持 tpm)
该方法在我的 kali linux(基于 debian)已测试成功。
参考文献:archwiki
安装 sbctl
archlinux: sudo pacman -S sbctl
gentoo: sudo emerge --ask app-crypt/sbctl
其他发行版请使用通用方法:
- 下载仓库
https://github.com/Foxboron/sbctl
,进入仓库目录。 - 安装软件包,Debian 可用
sudo apt install asciidoc asciidoc-base
- 编译:
make
- 安装:
sudo cp ./sbctl /usr/local/bin
- 之前安装的软件包可选择卸载:
sudo apt autoremove asciidoc asciidoc-base
,也可以不卸载,根据你的情况来看。
安装 grub 模块
这样一定能完成:
sudo grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB --modules="tpm" --disable-shim-lock
本人使用简单一点的命令也能完成:
sudo grub-install --modules="tpm" --disable-shim-lock
调整 boot 为 setup mode
重启,开机的时候进入主板的 bios 的 secure boot 的设置,记得把 setup mode 打开(和电脑品牌或主板厂商有关,一般自己都能找得到)
使用 sbctl 签名
登记密钥
使用 sbctl 检测状态:sbctl status
,理论上来讲,installed 是 not,setup mode 是 Enabled(必须),secure boot 是 disabled,除了中间那一项,别的也许有些不同也是可接受的。
创建密钥:sudo sbctl create-keys
登记 UEFI:sudo sbctl enroll-keys -m
这一步可能提示
you need to chattr -i files in efivars
,此时把上面列出的每个文件都依次执行sudo chattr -i <文件名>
之后再重复执行这一步。
接下再检测状态:sbctl status
,这时候输出应该有 Installed: ✓ sbctl is installed
,否则请检查前几步是否出错。
签署
检查验证情况:sudo sbctl verify
,会列出来一大对叉号,
找到你的操作系统正在使用的内核,一般是 /boot/vmlinuz
开头的某个文件,签名:sudo sbctl sign -s <文件名>
注:我的 ESP 分区是 /boot/efi,下文中你可能需要根据你的不同挂载位置进行调整
如果你的电脑有 Windows,那么应该有一个自带的启动文件,我的操作系统是 /boot/efi/EFI/Boot/bootx64.efi
,签名:sudo sbctl sign -s <文件名>
找到你的 grub 启动文件,我的操作系统是 /boot/efi/EFI/kali/grubx64.efi
,签名:sudo sbctl sign -s <文件名>
重启验证
重启之后启用 secure boot,观察是否能正常启动。
若不能可关闭 secure boot 重新尝试。
若可以,验证:sbctl status
,大概有如下输出:
$ sbctl status
Installed: ✓ sbctl is installed
Owner GUID: 一个 UUID
Setup Mode: ✓ Disabled
Secure Boot: ✓ Enabled
Vendor Keys: microsoft
就算完成。
后续
如果你更新了内核,如使用包管理器更新内核,或是自行编译的内核,除非你是使用 pacman 安装的 sbctl,其他情况下需要每次自行给新的内核进行签署。
如果你要删除已签署的内核(包括使用包管理器更新时移除较老旧的内核),可以编辑 /var/lib/sbctl/files.json
删除相关项目。其实不删也无所谓,但 sudo sbctl verify
的时候会出现找不到文件的情况。