我今天使用 ukuu 升级了我的内核,从那时起我就无法启动,因为我收到以下错误:
error: /boot/vmlinuz-4.18.12-041812-generic has invalid signature
error: you need to load the kernel first
我有 Windows 10 和 Ubuntu 18.10 双启动(今天升级)
更新:我设法启动到我在 grub 中的“Ubuntu 高级选项”中选择的旧内核
但是我需要升级我的内核,如果我这样做,我仍然会遇到同样的问题......
答案1
https://github.com/jakeday/linux-surface/blob/master/SIGNING.md有关于内核签名的更具体说明(改编自已接受答案中链接的同一教程)。 说明全文如下:
为安全启动签名自定义内核
这些说明适用于 ubuntu,但如果其他发行版使用 shim 和 grub 作为引导加载程序,则它们的操作应该类似。如果您的发行版不使用 shim(例如 Linux Foundation Preloader),则应该有类似的步骤来完成签名(例如,对于 LF Preloader,使用 HashTool 而不是 MokUtil),或者您可以安装 shim 来代替。shim 的 ubuntu 软件包名为shim-signed
,但请了解如何正确安装它,以免弄乱您的引导加载程序。
自 Ubuntu 中最新的 GRUB2 更新(2.02+dfsg1-5ubuntu1)以来,只要启用了安全启动,GRUB2 就不再加载未签名的内核。Ubuntu 18.04 用户将在升级 grub-efi 软件包时收到通知,告知该内核未签名,升级将中止。
因此,您有三个选项可以解决此问题:
- 您自己对内核进行签名。
- 您使用发行版的签名的通用内核。
- 您禁用安全启动。
由于选项二和选项三实际上不可行,因此这些是自己对内核进行签名的步骤。
说明改编自Ubuntu 博客。在执行以下步骤之前,请备份您的 /boot/EFI 目录,以便您可以恢复所有内容。执行以下步骤的风险由您自行承担。
- 创建配置以创建签名密钥,保存为 mokconfig.cnf:
# This definition stops the following lines failing if HOME isn't
# defined.
HOME = .
RANDFILE = $ENV::HOME/.rnd
[ req ]
distinguished_name = req_distinguished_name
x509_extensions = v3
string_mask = utf8only
prompt = no
[ req_distinguished_name ]
countryName = <YOURcountrycode>
stateOrProvinceName = <YOURstate>
localityName = <YOURcity>
0.organizationName = <YOURorganization>
commonName = Secure Boot Signing Key
emailAddress = <YOURemail>
[ v3 ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage = codeSigning,1.3.6.1.4.1.311.10.3.6
nsComment = "OpenSSL Generated Certificate"
将所有带有<YOUR*>的部分调整为您的详细信息。
- 创建用于签名内核的公钥和私钥:
openssl req -config ./mokconfig.cnf \
-new -x509 -newkey rsa:2048 \
-nodes -days 36500 -outform DER \
-keyout "MOK.priv" \
-out "MOK.der"
- 将密钥也转换为 PEM 格式(mokutil 需要 DER,sbsign 需要 PEM):
openssl x509 -in MOK.der -inform DER -outform PEM -out MOK.pem
- 将密钥注册到你的 shim 安装中:
sudo mokutil --import MOK.der
系统会要求您输入密码,您只需在下一步中使用它来确认您的密钥选择,因此请选择任意一个。
- 重启系统。您将看到一个名为 MOKManager 的工具的蓝屏。选择“注册 MOK”,然后选择“查看密钥”。确保它是您在步骤 2 中创建的密钥。然后继续该过程,您必须输入您在步骤 4 中提供的密码。继续启动系统。
注意:如果 MOKManger 在重启时没有加载,则更改启动顺序。关联
- 通过以下方式验证您的密钥是否已注册:
sudo mokutil --list-enrolled
- 对您安装的内核进行签名(它应该位于 /boot/vmlinuz-[KERNEL-VERSION]-surface-linux-surface):
sudo sbsign --key MOK.priv --cert MOK.pem /boot/vmlinuz-[KERNEL-VERSION]-surface-linux-surface --output /boot/vmlinuz-[KERNEL-VERSION]-surface-linux-surface.signed
- 复制未签名内核的 initram,这样我们就有了一个签名内核的 initram。
sudo cp /boot/initrd.img-[KERNEL-VERSION]-surface-linux-surface{,.signed}
- 更新你的 grub-config
sudo update-grub
- 重启系统并选择已签名的内核。如果启动成功,你可以删除未签名的内核:
sudo mv /boot/vmlinuz-[KERNEL-VERSION]-surface-linux-surface{.signed,}
sudo mv /boot/initrd.img-[KERNEL-VERSION]-surface-linux-surface{.signed,}
sudo update-grub
现在您的系统应该在已签名的内核下运行,并且 GRUB2 升级再次有效。如果您想升级自定义内核,您可以按照上述步骤从第 7 步开始轻松签名新版本。因此备份 MOK 密钥(MOK.der、MOK.pem、MOK.priv)。
答案2
我没有对相关内核进行签名,而是关闭了笔记本电脑 BIOS/UEFI 菜单中的安全启动。
您通常可以通过以下方式进入菜单在启动过程中按下特殊键,您可以通过 Google 搜索适合您的设备的特定版本,或者它甚至可能在启动时显示在屏幕上。
答案3
我今天更新后遇到了这个问题。将引导加载程序更改为shimx64.efi
似乎已经解决了这个问题。