我正在尝试创建一个终极 USB 棒,其中包含 2 个 Linux 发行版、Windows 和大量 ISO。
到目前为止,我已经将 Windows、Ubuntu 和 Fedora Silverblue 安装到磁盘上(我一直在虚拟机中进行测试以使安装速度更快)。在机器的 UEFI 启动菜单中,我可以看到所有选项并成功启动其中任何一个。
从 Fedora 或 Ubuntu GRUB 菜单中,我可以启动 Windows,但它们都无法相互启动。
由于我最终还想引导 ISO 文件,因此我需要能够从 GRUB 加载其他 Linux 安装。
我尝试过的事情:
禁用安全启动:
这确实有效,但我不想这样做,因为我希望能够在其他人的机器上使用它,并且我可能不高兴禁用他们的安全启动。
链式加载:
GRUB 通过 chainloader 加载 Windows,因此我认为我也可以对 Linux 执行同样的操作。
如果我chainloader /EFI/ubuntu/grubx64.efi
(从 Fedora 的 GRUB 菜单)那么我会得到相同的垫片错误。
如果我chainloader /EFI/ubuntu/shimx64.efi
(从 Fedora 的 GRUB 菜单)那么我就可以到达 Ubuntu 的 GRUB 菜单 - 尽管在实际尝试启动 Ubuntu 时我仍然遇到 shim 错误。
如果我理解正确的话
如果我理解正确的话,这shimx64.efi
就是 UEFI BIOS 实际加载的内容。该文件是否仅包含单个内核的安全启动信息?
shimx64.efi
当我选择链接加载到其他 GRUB 菜单时,有什么方法可以让 UEFI 再次加载吗?
太长了;有人可以向我解释一下shimx64.efi
,在启用安全启动的情况下是否可以从同一个 GRUB 菜单双启动两个 Linux 发行版。
非常感谢,威尔
答案1
如果我理解正确的话,shimx64.efi 是 UEFI BIOS 实际加载的。该文件是否仅包含单个内核的安全启动信息?
几乎但不完全正确。 Microsoft 为每个发行版签署了一个垫片版本,并且垫片包含其所属发行版的安全启动公钥。使用填充程序时,它会临时(非持久)将发行版的安全启动密钥添加到允许启动系统的密钥列表中。垫片也可以选择添加机器所有者密钥 (MOK)。
因此,当您加载 Fedora 的 时shimx64.efi
,安全启动就可以接受 Fedora 签名的内容。然后它加载grubx64.efi
,它由 Fedora 签名,现在可以被安全启动固件接受。当grubx64.efi
加载 Fedora 的内核时,内核文件由 Fedora 签名,因此安全启动允许执行内核代码。
如果您想构建自定义内核,则必须创建 MOK 并用它签署您的自定义内核。另外,如果您想构建自定义或第三方内核模块,您也必须使用 MOK 对它们进行签名,因为安全启动“合同”的一部分是不允许使用未签名的内核代码。因此引导加载程序必须检查内核的签名,并且当启用安全引导时内核必须检查每个模块的签名。
你将无法使用发行版的安全启动密钥签署任何内容,因为这需要私人的发行版安全启动密钥的一部分——该密钥可能由负责相应发行版安全的人员极其安全地保存。
并安装你的在其他人的机器上使用 MOK 几乎与禁用他们的安全启动一样糟糕,因为它将使您能够启动任何事物在他们的系统上。
显然,在加载一个填充程序后,链式加载另一个填充程序副本理论上应该可行,但填充程序的源代码注释表明这并不完全是微不足道的。