如何使用具有安全启动功能的 EFI 存根(efistub)加载器来引导加载内核?

如何使用具有安全启动功能的 EFI 存根(efistub)加载器来引导加载内核?

我已按照如何使用 EFI 存根(efistub)加载器引导加载内核?

在我的例子中,安全启动已打开。因此我稍微修改了 zz-update-efistub.sh,使用

cp /$(readlink /vmlinuz).eif.signed /boot/efi/EFI/ubuntu/vmlinuz

但是我的机器仍然拒绝从该映像启动。

答案1

您遇到的问题是由于 Ubuntu 的内核(文件名以 结尾的内核.efi.signed)由 Canonical 的安全启动密钥签名。此密钥不包含在大多数计算机的固件中,因此会被大多数计算机的安全启动子系统拒绝。(此规则有几个例外。例如,我有一块华硕 P8-H77I 主板,它标配了 Canonical 的嵌入公钥。但是,如果您的主板如此配置,您就不会遇到此问题。)

从广义上讲,您有三种选择:

  • 完全控制安全启动-- 您可以完全控制安全启动并安装您喜欢的任何安全启动密钥。如果您添加 Canonical 的密钥,您将能够直接启动 Ubuntu 的签名内核。不过,这个过程很繁琐。有关如何操作的详细信息,请参阅我的有关该主题的网页。简而言之,您需要生成自己的密钥,删除计算机当前的密钥集,添加自己的密钥,添加 Canonical 的密钥,并可选地添加您可能想要使用的任何其他密钥(例如 Microsoft 的密钥)。有几种方法可以做到这一点,其中一些依赖于固件自己的用户界面,因此无法以通用方式 100% 准确地描述。
  • 使用垫片-- 您可以使用shimx64.efiUbuntu 附带的程序来启动内核。为此,您需要将其放入shimx64.efi与(重命名的)内核相同的目录中,并将其添加shimx64.efi到引导列表(通过efibootmgr)而不是内核。一个额外的技巧是,您必须shimx64.efi通过适当的efibootmgr选项将内核的文件名和选项传递给 。这类似于efibootmgr -c...您引用的答案的步骤 #3 中的命令,但程序文件将是shimx64.efi,内核文件名将成为通过 传递的选项-u。请注意,并非所有版本都shimx64.efi支持以这种方式传递选项。我不记得这个功能是什么时候添加的,但您应该可以使用最新版本。请注意,我从未尝试过自己这样做,所以我无法为您提供分步说明;您可能必须自己尝试找出细节。这也意味着它有可能无法工作,尽管理论上它可以应该工作。
  • 使用更传统的设置-- 在我看来,直接启动内核并不是一个好方法,即使没有安全启动。虽然使用 GRUB、rEFind 或其他引导加载程序或引导管理器在技术上使引导过程复杂化,但这些引导程序提供了管理引导过程的工具,从而简化了实际的设置。因此,在我看来,最好使用这些工具之一。如果您对 GRUB 有特定的抱怨,您可能想要分享它;可以想象另一个启动程序将解决您的问题。但是,如果您只是将此作为学习练习,那么直接启动内核是有好处的。通过让它工作,您肯定会学到一些关于 EFI 启动过程的知识,并且就您而言,还有安全启动。

如果您想要一个简单的解决方案,那么使用传统的引导加载程序或引导管理器是最佳选择。如果您想学习更多知识,您可能需要研究如何完全控制安全启动 - 但请注意,这条路上有很多陷阱,因此即使借助我之前编写和引用的指南,也可能需要一段时间。使用 Shim 是一种折衷方案 - 它比完全控制方法更容易设置,但这样做您学到的东西会更少。

相关内容