我注意到 Ubuntu ISO 文件在具有 BIOS 和 UEFI 的系统上均可启动。我已经从头开始重新制作了 Ubuntu,我希望我的 ISO 文件在两种情况下均可启动。
我对 Ubuntu 的重新制作是先将 debootstrap 安装到 chroot jail 中,然后逐渐添加文件,直到我拥有所有想要的程序。但是,生成的 ISO 文件只能在具有 BIOS 的系统上启动。
我相信我需要 mkisofs 的一些不同魔法,但是 EFI/BOOT 中的文件怎么办?这些文件的来源是什么?我还需要什么吗?
谢谢!
安迪
答案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 映像。
-append_partition 2 0xef efi.img
您可以通过在命令中添加标志来使用生成的图像xorriso
。
生成的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::
是几年前添加的,因此旧版本不支持它)。
如需进一步指导,还请参阅这问题。