在 UEFI 中使用 ISOLINUX 的正确方法是什么?

Iva*_*dov 7 boot iso syslinux uefi

很长一段时间以来,我一直试图在Minimal Linux Live的 64 位版本中添加 UEFI 支持,但不幸的是没有取得太大成功。如下图所示,每次尝试通过 UEFI 启动时都会出现严重错误

最小的 Linux Live - UEFI

这是我为了达到这一点所做的:

  1. 我下载了syslinux-6.0.3
  2. 我按照此处的说明操作并复制efi64/efi/syslinux.efi\EFI\BOOT\BOOTX64.EFI.
  3. 我也复制efi64/com32/elflink/ldlinux/ldlinux.e64\EFI\BOOT\LDLINUX.E64.
  4. 我在VirtualBox(版本 5.0.20)中创建了虚拟机并启用了 UEFI。
  5. 我生成了新的 ISO 映像(所有 ISOLINUX 配置文件都在根文件夹中,请参见屏幕截图)并将其作为虚拟机中的主要可启动媒体。
  6. 启动后,我立即收到了您在屏幕截图中看到的错误。
  7. 在这一点上,我不得不重命名\EFI\BOOT\BOOTX64.EFI\EFI\BOOT\BOOTX641.EFI以“中断”引导过程并回退到 UEFI shell。
  8. 在 UEFI shell 中,我使用了该命令edit,然后导航到该\EFI\BOOT文件夹。
  9. 我手动调用BOOTX641.EFI,最终得到了您可以看到的相同错误。

所以,我可以得出结论,我的 EFI 存根正在执行,但在执行过程中出现了一些问题,此时我不知道出了什么问题。

我检查了System Rescue CD的 ISO 映像结构,我知道它支持 UEFI,我注意到以下几点:

  1. EFI 结构只包含一个文件:\efi\boot\bootx64.efi.
  2. 的大小\efi\boot\bootx64.efi是724KB,而Sysl​​inux 6.03中对应的文件efi64/efi/syslinux.efi是~200KB,所以这绝对不是同一个文件。
  3. 当我\efi\boot\bootx64.efi从“System Rescue CD”复制并在“Minimal Linux Live”中的 EFI 结构中使用它时,UEFI 引导过程很好,以至于我看到了 GRUB 2 shell。

这就是我如何发现\efi\boot\bootx64.efi“System Rescue CD”中的文件具有内置的 GRUB 2 支持,因此它必须是自定义构建的解决方案。

所以,问题就简单几句话 - 我使用的是 vanilla Syslinux 包,我想创建 UEFI 兼容的配置来启动一个简单的 ISO 映像。按照官方说明操作似乎对我不起作用。

非常感谢所有建议!谢谢!


注 1: ISO 映像在 BIOS 模式下可以正常启动。那里没有问题。

注意 2:这很可能不是 VirtualBox 中的错误,因为其他操作系统(例如 Ubuntu 和 Linux Mint)在 UEFI 模式下启动得很好。


编辑 1 -(2017 年 1 月):

很长时间没有答案,所以我以完全不同的方式实现了我的解决方案:

  • 我不在SyslinuxUEFI 启动模式下使用。
  • 我用 EFI 存根编译了我的 Linux 内核。
  • 我创建了一个简单的startup.nsh脚本,它在 UEFI 启动后自动执行。
  • 相同的脚本加载内核和 initramfs。

通过这种方式,我失去了一些启动功能,例如vga=askSyslinux它在 UEFI 模式下工作正常,但在 UEFI 模式下不起作用,因为这个特定的引导选项需要正确的 Linux 引导加载程序。

即使我有工作正常的解决方案,问题仍然存在。

编辑 2 -(2017 年 12 月):

这是对先前更新的补充。该解决方案startup.nsh仅在 UEFI 系统具有“UEFI Shell”(根据 UEFI 规范,固件可能会或可能不会提供外壳)并且仅当该外壳具有 1 级或更高级别支持时才有效。此外,无法保证启动脚本会被执行,因为在 ISO 映像中提供 ESP 的正确方法是通过“El Torito”启动映像。直接在 ISO 映像上提供 ESP 兼容结构似乎在某些固件上运行良好,但这不是通用解决方案。

问题仍然存在,但同时我设法集成了systemd-boot并且我不再认为这个问题是高优先级的。

sou*_*edi 2

听起来更像是 System Rescue CD 使用 GRUB,而不是 syslinux。我的 grub64.efi 大约为 1MB,但我想您可以使用更少的模块来构建它。

您复制的映像名为 syslinux.efi,因此我不会将其称为 isolinux。我希望它寻找一个名为 的文件syslinux.cfg,而不是isolinux.cfg. (isolinux 会回退到syslinux.cfg)。

我还注意到你说“所有 ISOLINUX 配置文件都在根文件夹中”。我不知道你是如何创建 ISO 的。请记住,引导加载程序需要位于特殊的引导映像中,而不是挂载 iso9660 文件系统时看到的目录树中。显然 VirtualBox 正在启动一些东西,所以这不是这里的问题,但如果它比其他系统更宽松,那么你可能仍然在做“错误”的事情。

由“几个流行的 Linux 发行版”设置的混合启动映像读起来非常有趣,但我上次读到的内容不太可能有一个单一映像支持所有 Mac、32 位 EFI...至少固件可以看到多个启动映像并要求用户在“1”和“2”之间进行选择。在任何人尝试进入兔子洞之前请注意,至少在 Mac 特定的支持下,仅实现您能够测试的部分可能会更安全。