initrd 使用 kexec 链接加载另一个内核的简单方法

initrd 使用 kexec 链接加载另一个内核的简单方法

我这里有一台无法启动 64 位内核的机器(它有 efi32 和一些......不常见的固件)。

目前,我启动 64 位 Linux 系统的唯一方法是:

  1. 从启动/实时 CD 启动 32 位发行版,
  2. 用于kexec启动我自己的 64 位内核。

当然我可以重新安装 32 位发行版,但这是不是我想要的是。我想要一个 32 位内核/initrd 组合,它可以作为我真正的 64 位内核/initrd 的引导加载程序。

这是一个最小的 initrd 系统,能够加载并启动我自己的辅助内核。这项工作是否有现有的解决方案?

答案1

32 位 grub 引导加载程序将使用“linux”和“initrd”命令引导使用 CONFIG_EFI_MIXED 选项编译的 64 位 Linux 映像。

请注意,这些 Grub 命令在启动内核之前执行 EFI 的 ExitBootServices()。因此,内核无法使用安全启动,也无法访问 PCI 插槽的 ROM(尤其是显卡的 BIOS)。

另一种方法是运行“shim”引导加载程序,然后运行 ​​Grub,并使用 Grub 的 linuxefi 和 linuxrdefi 命令。它们不会运行 ExitBootServices() ,而是调用内核中的 EFI 存根,该存根会复制 ROM 等,然后在正确启动内核之前调用 ExitBootServices() 本身。尝试在没有 shim 引导加载程序的情况下运行 Grub 的“linuxefi”命令会导致“校验和错误”错误,无论是否存在安全引导。不幸的是,这种方法有两个问题:(1) 内核必须是 32 位,(2) 目前 32 位 EFI 存根中存在一个错误,该错误会阻止内核启动(它挂起且没有输出)。

这个错误是臭名昭著的。此外,某些 64 位 Linux 映像会失败,强烈表明存在一些对齐或数据覆盖问题。

获得所需结果的唯一方法是修改内核,以便可以使用 32 位 EFI 存根启动,然后转换到正确的 64 位内核。 CONFIG_EFI_MIXED 的作者可能正在研究这个问题,也许你可以给他们发电子邮件。

答案2

配置_EFI_混合可能就是你所需要的。

相关内容