如何为我的 UEFI 应用程序制作可启动 ISO?

如何为我的 UEFI 应用程序制作可启动 ISO?

好吧,我制作了一个 rust UEFI 应用程序并在 virtualbox 的 efi shell 上运行它(我的应用程序在 ubuntu 20.04 上开发,测试托管在安装在 windows 10 会话上的 virtualbox 上)。

为此,我制作了一个 ISO 文件,如下所示:

xorriso -as mkisofs -R -J -o myiso.iso /some/directories/BOOTX64.EFI /some/others/directories/myapp.elf

当我在 virtualbox 上时,我切换到 FS0 文件系统并且我可以看到我的 2 个可执行文件:(启动文件myapp.elf)。 这启动文件通过命令行启动,工作并返回一些信息,如 gop 协议帧缓冲区定位和其他一些内容。我还使用 EFI 文件系统来加载和使用myapp.elf对于程序的这一部分,它没有提供有关myapp.elf文件或者我无法读取它。(没有错误,没有警告,我几乎确定 EFI 应用程序中的代码是正确的,但例如,file_info 协议返回 0(size 或 file_size))。

我认为问题在于我的 ISO 文件不是真正的可启动文件格式。例如,切换 FS0 文件系统并在 EFI shell 上列出内容后,所有可执行文件信息(如日期或小时)都为 0。(仅文件大小返回正确)。

我不想使用像 grub 或 isolinux 这样的应用程序,因为我的项目目标是学习如何制作它们。^^

如果有人可以逐步解释制作 UEFI 应用程序可启动 .ISO 的过程,以及 .ISO 中包含的一些其他可执行文件,我将不胜感激。

希望这就是问题所在...

答案1

由于您以超级用户身份重新提出了该问题,因此我决定自己尝试一下。

问题在于您创建 ISO 时没有将其分区为 GPT,也没有将任何分区标记为 ESP(EFI 系统分区)。因此,UEFI 附带的基本实用程序(包括文件系统驱动程序)无法识别您的 ISO。

您需要做的是在系统上创建 ESP,然后根据该 ESP 创建 ISO。请按照以下步骤操作:

  1. 创建一个充满零的 disk.img。
dd if=/dev/zero of=disk.img bs=512 count=93750
  1. 使用 GPT 对原始归零映像进行分区,并在其上创建 ESP 分区(按顺序输入 o、y、n、default、default、default、ef00、w、y)。有关 gdisk 命令步骤的更多详细信息,请参阅图像。
gdisk disk.img

gdisk 示例

  1. 设置一个回送设备以挂载 disk.img。此处的 disk.img 文件是原始硬盘映像。它不采用任何特殊格式,例如 .iso 格式。这意味着 Linux 存档程序和 Linux 挂载实用程序都无法识别它。您需要使用 losetup 设置一个回送设备,该设备会将此原始磁盘映像变成一个实际的假硬盘设备,然后挂载实用程序可以轻松挂载该设备。命令中的偏移量指定分区的起始位置。您可以使用它fdisk -lu disk.img来找出此分区的起始位置。此处给出的偏移量与我上面提到的步骤的偏移量相符,因此它应该可以正常工作。
sudo losetup --offset 1048576 --sizelimit 46934528 /dev/loop5 disk.img
  1. 在回送设备上创建 FAT32 文件系统。基本上,您要在 ESP 分区上创建完整的文件系统。
sudo mkdosfs -F 32 /dev/loop5
  1. 将文件系统挂载到 /mnt。
sudo mount /dev/loop5 /mnt
  1. 将 efi 应用程序复制到挂载点。
sudo cp path/to/boot.efi /mnt
  1. 将内核复制到挂载点。
sudo cp path/to/kernel.elf /mnt
  1. 将整个挂载点制作成一个 ISO 文件。
sudo mkisofs -o disk.iso /mnt
  1. 授予 ISO 上的所有用户权限。
sudo chmod a+rwx disk.iso
  1. 将 ISO 文件附加到虚拟盒 CD-ROM,然后启动机器。现在您应该在 shell 中拥有 efi 应用程序和内核。现在您应该能够启动内核了。

另外,您可以将最后几个命令放入脚本中并直接运行,如下所示:

sudo cp path/to/boot.efi /mnt
sudo cp path/to/kernel.elf /mnt
sudo mkisofs -o disk.iso /mnt
sudo chmod a+rwx disk.iso

您不需要重新运行前几个命令,因为一旦文件系统挂载,您只需要将新编译的文件复制到挂载点并从中创建新的 ISO 文件。也许您必须在重新启动时重新运行前几个命令,我还没有测试过。

此外,使用此方法,您无需再设置虚拟盒。只需设置一次即可使用 disk.iso 文件,即使您对其进行了修改,它也会始终使用相同的文件。

最后一件事是 /dev/loop5 可能很忙。如果是这种情况,也许可以尝试另一个更高级别的环回设备,或者尝试sudo umount /dev/loop5

答案2

UEFI 启动纯粹基于文件系统 - 与 BIOS 不同,BIOS 使用不属于文件系统的启动扇区。

将一个名为的文件放在bootx64.efi名为的目录中EFI\boot。就是这样。UEFI 将找到并启动它。

注意,对于不同的系统架构,文件名会有所不同。

相关内容