前言,起因

由于某些原因,电脑需要开启Secure Boot为了体验Linux Kernel 6.1的新特性(我也不知道要体验啥),但Ubuntu官方还未签名新的Linux内核,于是决定自己签名内核。
这篇文章将带你了解如何在不关闭安全启动的情况下引导Linux内核(签名unsigned内核)

了解Linux Secure Boot机制(基于Grub2)

安装Ubuntu时,官方会同时安装经过微软签名后的EFI文件,使得grub EFI能正确在开启安全启动的设备上启动,启动后,由grub引导内核。这时,由于grub经过安全启动,所以会验证内核是否签名,若未签名,则无法启动。

安装未签名的内核

从ubuntu官方的内核源选择你需要的内核,根据架构,下载对应的 linux-image-unsigned-xxx.deblinux-modules-xxx.deb

然后终端转到下载目录使用如下指令安装内核

dpkg -i ./*.deb

此时,内核还没签名,如果以新安装的内核启动,则会显示 无效的shim签名 ,接下来我们开始签名内核

生成MOK证书

选择一个位置存放你的证书,以后也许会用上
创建MOK证书,这里需要用到 openssl ,使用如下指令

openssl req -newkey rsa:2048 -nodes -keyout MOK.key -new -x509 -sha256 -days 36500 -subj "/CN=my Machine Owner Key/" -out MOK.crt
openssl x509 -outform DER -in MOK.crt -out MOK.der

der格式证书转换为pem格式

openssl x509 -in MOK.der -inform DER -outform PEM -out MOK.pem

向机器注册MOK证书,需要安装好工具 mokutil

mokutil -i MOK.der

mokutil会让你设置一个密码,等下会用上,但不重要,只用一次。
然后重启(你也可以选择全部设置好再重启),会进入MokManner界面,按照要求注册你的证书。

签名内核

需要用到sbsign工具

sudo sbsign --key /var/lib/shim-signed/mok/MOK.priv --cert /var/lib/shim-signed/mok/MOK.pem /boot/vmlinuz-[KERNEL-VERSION]-generic --output /boot/vmlinuz-[KERNEL-VERSION]-generic.signed
sudo cp /boot/vmlinuz-[KERNEL-VERSION]-generic.signed /boot/vmlinuz-[KERNEL-VERSION]-generic && sudo rm /boot/vmlinuz-[KERNEL-VERSION]-generic.signed

更新grub

sudo update-grub

然后重启测试,一切顺利的话新的内核可以正常启动,有些情况会因为NVIDIA显卡驱动不适配无法启动,解决方法这里不过多阐述。

文章作者: orii
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 oriiのBlog
Linux Linux Secure Boot
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝