从源代码安装了第二个内核,但启动时出现错误

从源代码安装了第二个内核,但启动时出现错误

我有 Ubuntu 22.04,最初内核是 6.5.0-14-generic。

我遵循了以下指南:

https://phoenixnap.com/kb/build-linux-kernel

编译并安装最新的内核源。但是,现在当我启动时,我得到了这个菜单:

Ubuntu
Advanced Options for Ubuntu
UEFI Firmware settings

如果我选择 Ubuntu,它会说:

error: bad shim signature
error: you need to load the kernel first

Press any key to continue

如果我选择 Ubuntu 的高级选项,我会得到:

Ubuntu, with Linux 6.8.0-rc1+
Ubuntu, with Linux 6.8.0-rc1+ (recovery mode)
Ubuntu, with Linux 6.5.0-14-generic
Ubuntu, with Linux 6.5.0-14-generic (recovery mode)

如果我选择“Ubuntu,带有 Linux 6.8.0-rc1+”,我会得到:

Loading Ubuntu, with Linux 6.8.0-rc1+...
error: bad shim signature
Loading initial ramdisk
error: you need to load the kernel first

如果我选择“Ubuntu,带有 Linux 6.5.0-14-generic”,它就可以工作。

当我跑步时find /boot/vmli*我得到:

/boot/vmlinuz
/boot/vmlinuz-6.5.14-generic
/boot/vmlinuz-6.8.0-rc1+
/boot/vmlinuz.old

我哪里做错了?我只是想了解为什么这没有按计划进行。感觉很糟。

我想了解如何安装不同的内核并能够无缝地从它们启动。

答案1

背景信息:

对于安全启动,BIOS有一组嵌入式证书用于检查启动过程中的每一项。如果某项未由证书签名,则不会加载,并且启动过程会在此点停止。

截至目前,所有安全启动安全性的根证书都是 Microsoft 的Microsoft UEFI CA 2011(将于 2026 年到期,然后被替换Microsoft UEFI CA 2023),该证书存在于所有在购买时启用了安全启动的 BIOS 中。

对于安全启动,Linux有一个名为 的第一阶段引导加载程序shim。 的代码shim在所有 Linux 版本中共享,但每个 Linux 发行版都会创建一个shim二进制文件,其中嵌入了他们自己的签名密钥证书,并由 Microsoft 使用 对其进行签名(使用Microsoft UEFI CA 2011),这允许通过安全启动过程启动签名的 shim 实例。

shim二进制文件(Ubuntushim嵌入了 Ubuntu 证书)加载 Ubuntu 签名文件,Grub进而加载签名的 Ubuntu 内核。

背景介绍到此结束。

您的内核未经过 Ubuntu 签名。因此它不会被识别为安全内核,因此不会被加载。初始 ramdisk 无需签名,因此将被加载,这会导致上述错误。

为了绕过这个限制,Linux 提出了“机器所有者密钥”(简称 MOK)的概念。您需要创建一个 MOK 并将其注册到 shim 二进制文件中,之后您的自建内核和 MOK 签名内核就可以正常启动了。

Ubuntu 安全启动文档 有一个部分How can I do non-automated signing of drivers?用于创建和注册 MOK。使用 MOK 进行内核签名的文档位于https://wiki.ubuntu.com/UEFI/SecureBoot/Signing

相关内容