如何创建可引导的 UEFI/BIOS ISO 文件

我注意到Ubuntu的ISO文件在具有BIOS和UEFI的系统上都可以启动。我从头开始重新制作了Ubuntu,并希望我的ISO文件在这两种情况下都可以启动。
我重新制作Ubuntu的方法是首先将debootstrap安装到chroot jail中,然后逐步添加文件,直到获得所有所需的程序。然而,生成的ISO文件只能在具有BIOS的系统上启动。
我相信我需要使用mkisofs进行一些不同的操作,但是EFI/BOOT目录中的文件呢?这些文件的来源是什么?还需要其他什么吗?
谢谢!
AndyS

1ISO中有一个预配置的grub,重命名为/EFI/Boot/bootx64.efi。UEFI只能从/EFI/Boot/bootx64.efi引导。因此,BIOS引导来自syslinux,UEFI引导来自grub。ISO中的grub版本仅使用启动安装程序所需的文件,而不是标准安装中的完整grub安装。请参阅详细答案,而非脚本:https://askubuntu.com/questions/549647/uefi-machine-doesnt-boot-ubuntu-through-nvram-bootcatalog-how-to-fix - oldfred
创建一个类型为“EFI系统”的分区,并按照@oldfred的建议执行。 - Arpit Agarwal
那个回复谈到了准备一个带有分区等内容的启动介质,而我正试图创建一个其他人可以通过BIOS或UEFI轻松引导的ISO文件。如果我将Ubuntu ISO文件挂载为只读/回环设备,我会看到EFI/BOOT目录下有两个文件:BOOTx64.EFI和grubx64.efi。具体来说,这些文件是如何创建的? - AndyS
根据oldfred的参考,我看到了创建bootx64.efi的明确指示,但是这和BOOTx64.EFI是一样的吗?我还看到一个grub.cfg的例子,但是在Ubuntu ISO中,我在以下位置看到了两个grub.cfg文件:/boot/grub/x86_64-efi/grub.cfg 和 /boot/grub/grub.cfg。我猜应该需要两个文件,一个用于BIOS引导,另一个用于EFI引导。 - AndyS
从oldfred的链接中引用的grub.cfg文件引用了vmlinuz.efi。那个文件是如何创建的? - AndyS
1个回答

您可以使用以下方法生成适用于UEFI引导的ESP(EFI系统分区)镜像:
#! /bin/sh

BOOT_IMG_DATA=$(mktemp -d)
BOOT_IMG=efi.img

mkdir -p $(dirname $BOOT_IMG)

truncate -s 4M $BOOT_IMG
mkfs.vfat $BOOT_IMG
mkdir -p $BOOT_IMG_DATA/efi/boot

grub-mkimage \
    -C xz \
    -O x86_64-efi \
    -p /boot/grub \
    -o $BOOT_IMG_DATA/efi/boot/bootx64.efi \
    boot linux search normal configfile \
    part_gpt btrfs fat iso9660 loopback \
    test keystatus gfxmenu regexp probe \
    efi_gop efi_uga all_video gfxterm font \
    echo read ls cat png jpeg halt reboot

mcopy -i $BOOT_IMG -s $BOOT_IMG_DATA/efi ::

这将生成一个FAT格式的文件(通过更改$BOOT_IMG变量的位置来更改文件位置),该文件本身是一个ESP镜像。
您可以通过在xorriso命令中添加标志-append_partition 2 0xef efi.img来使用生成的镜像。
生成的xorriso命令可能类似于以下内容:
xorriso -as mkisofs \
    -r -V <ISO_LABEL> \
    -o <OUTPUT_ISO_IMAGE> \
    -J -J -joliet-long -cache-inodes \
    -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin \
    -b isolinux/isolinux.bin \
    -c isolinux/boot.cat \
    -boot-load-size 4 -boot-info-table -no-emul-boot \
    -eltorito-alt-boot \
    -e --interval:appended_partition_2:all:: \
    -append_partition 2 0xef efi.img \
    -no-emul-boot -isohybrid-gpt-basdat \
    <ISO_DIRECTORY>

请记住,如果您希望镜像在BIOS系统上启动,还需要使用ISOLINUX。GRUB2适用于UEFI。
此外,您应该使用最新版本的xorriso(标志--interval:appended_partition_2:all::是几年前添加的,所以旧版本不支持它)。
如需进一步指导,请参阅this问题。