我正在使用 Intel 和 M1 Mac,并在 VMWare Fusion VM 中运行 Ubuntu Server。我目前正在使用最新的 ubuntu-23.10-live-server-amd64.iso 和 ubuntu-23.10-live-server-arm64.iso。我可以让一切按基于 Intel 的系统需要运行,但使用 arm64.iso 时,它不包含 and /boot.catalog
。/boot/grub/i386-pc/eltorito.img
因此,在修改 grub.cfg 后,我无法重新创建可启动 ISO。
我从各种来源拼凑了一些信息,从这里开始:https://ubuntu.com/server/docs/install/autoinstall-quickstart,但还没有找到或理解足够的信息来填补我的 arm64 平台的最后一块拼图。此外,我无法使用 livefs-edit,因为它依赖于“losetup”,而这在 macOS 上不可用;然而,xorriso 在英特尔上 100% 解决了这个问题,我想……如果我能解决启动映像问题,那么在 M1s 上基本上就可以解决这个问题。
对于 amd64.iso 来说,这是有效的:
- 提取原始 ISO
- 创建用户数据和元数据文件
- 修改 grub.cfg 以添加自动安装菜单项
- 使用下列内容重新打包 ISO:
xorriso -as mkisofs \
--modification-date='2021101314195100' \
--grub2-mbr \
--interval:local_fs:0s-15s:zero_mbrpt,zero_gpt:"${ORIGINAL_ISO_PATH}" \
--protective-msdos-label \
-partition_cyl_align off \
-partition_offset 16 \
--mbr-force-bootable \
-append_partition 2 28732ac11ff8d211ba4b00a0c93ec93b \
--interval:local_fs:2470124d-2478587d::"${ORIGINAL_ISO_PATH}" \
-part_like_isohybrid \
-iso_mbr_part_type a2a0d0ebe5b9334487c068b6b72699c7 \
-c '/boot.catalog' \
-b '/boot/grub/i386-pc/eltorito.img' \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
--grub2-boot-info \
-eltorito-alt-boot -e \
'--interval:appended_partition_2_start_617531s_size_8464d:all::' \
-no-emul-boot \
-boot-load-size 8464 \
-isohybrid-gpt-basdat \
-o ubuntu-autoinstall.iso \
-V 'Ubuntu autoinstall' ${EXTRACTED_ISO_PATH}
更新 根据 Thomas Schmitt 的建议,我查询了该提案并修改为使用:
xorriso -as mkisofs \
--modification-date='2023101104561500' \
-partition_cyl_align off \
-partition_offset 16 \
-append_partition 2 0xef --interval:local_fs:4615776d-4629311d::"${ORIGINAL_ISO_PATH}" \
-G --interval:local_fs:0s-15s:zero_mbrpt:"${ORIGINAL_ISO_PATH}" \
-iso_mbr_part_type 0xcd \
-c '/boot/boot.cat' \
-e '--interval:appended_partition_2_start_1153944s_size_13536d:all::' \
-no-emul-boot \
-boot-load-size 13536 \
-output ubuntu-autoinstall.iso \
extracted-iso/
结果是:
GNU xorriso 1.5.6 : RockRidge filesystem manipulator, libburnia project.
Drive current: -outdev 'stdio:ubuntu-autoinstall.iso'
Media current: stdio file, overwriteable
Media status : is blank
Media summary: 0 sessions, 0 data blocks, 0 data, 1415g free
Added to ISO image: directory '/'='/extracted-iso'
xorriso : UPDATE : 980 files added in 1 seconds
xorriso : UPDATE : 980 files added in 1 seconds
xorriso : NOTE : Copying to System Area: 32768 bytes from file '--interval:local_fs:0s-15s:zero_mbrpt:ubuntu-23.10-live-server-amd64.iso'
libisofs: NOTE : Automatically adjusted MBR geometry to 1020/159/32
xorriso : UPDATE : 3.18% done
xorriso : UPDATE : 54.15% done
xorriso : UPDATE : 87.88% done
ISO image produced: 1300424 sectors
Written to medium : 1300424 sectors at LBA 0
Writing to 'stdio:ubuntu-autoinstall.iso' completed successfully.
在检查可启动的原始 ISO 与不可启动的新 ISO 提取后,我发现的唯一区别是:
我也尝试过:
xorriso -as mkisofs \
--modification-date='2023101104561500' \
-partition_cyl_align off \
-partition_offset 16 \
-append_partition 2 0xef --interval:local_fs:4615776d-4629311d::"${ORIGINAL_ISO_PATH}" \
-iso_mbr_part_type 0xcd \
-c '/boot/boot.cat' \
-e '--interval:appended_partition_2_start_1153944s_size_13536d:all::' \
-no-emul-boot \
-output ubuntu-autoinstall.iso \
extracted-iso/
我抓狂不已,无计可施。其中很多我都不太明白,但我可以看到他们-c
放置了启动目录。因此,为了让新 ISO 更接近原始 ISO,我使用了“c '/boot.catalog”,现在我发现原始文件中的一个不同之处,如下所示:
我怀疑有些东西我看不见,也许是在实际的 MBR 中?我只是在挖掘更多信息时猜测一些我不太熟悉的东西。
解决了感谢 Thomas Shchmitt 的帮助。下一步是用修订后的目标、新的 cloud-init 用户数据、grub.cfg 等替换 ORIGINAL_EXTRACTED_ISO_DIR。
case "$ARCHITECTURE" in
"m1")
echo "Running on M1 Mac."
xorriso -as mkisofs \
--modification-date='2023081005071100' \
-partition_cyl_align off \
-partition_offset 16 \
-append_partition 2 0xef --interval:local_fs:4030464d-4042271d::"${ORIGINAL_ISO_FILE}" \
-G --interval:local_fs:0s-15s:zero_mbrpt:"${ORIGINAL_ISO_FILE}" \
-iso_mbr_part_type 0xcd \
-c '/boot/boot.cat' \
-e '--interval:appended_partition_2_start_1007616s_size_11808d:all::' \
-no-emul-boot \
-boot-load-size 11808 \
-output ${AUTOINSTALL_ISO_FILE} \
${ORIGINAL_EXTRACTED_ISO_DIR}/
;;
"intel")
echo "Running on Intel Mac."
xorriso -as mkisofs \
--modification-date='2023081005062500' \
--grub2-mbr --interval:local_fs:0s-15s:zero_mbrpt,zero_gpt:"${ORIGINAL_ISO_FILE}" \
--protective-msdos-label \
-partition_cyl_align off \
-partition_offset 16 \
--mbr-force-bootable \
-append_partition 2 28732ac11ff8d211ba4b00a0c93ec93b --interval:local_fs:4156048d-4166115d::"${ORIGINAL_ISO_FILE}" \
-appended_part_as_gpt \
-iso_mbr_part_type a2a0d0ebe5b9334487c068b6b72699c7 \
-c '/boot.catalog' \
-b '/boot/grub/i386-pc/eltorito.img' \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
--grub2-boot-info \
-eltorito-alt-boot \
-e '--interval:appended_partition_2_start_1039012s_size_10068d:all::' \
-no-emul-boot \
-boot-load-size 10068 \
-output ${AUTOINSTALL_ISO_FILE} \
${ORIGINAL_EXTRACTED_ISO_DIR}/
;;
*)
echo "Unsupported architecture: $ARCHITECTURE"
exit 1
;;
esac
答案1
感谢您乘坐 xorriso。:)
/boot/grub/i386-pc/eltorito.img 适用于 x86 旧版 PC-BIOS。arm64 的 ISO 中没有用处。GRUB2 MBR 也是如此。这三种架构的 EFI 内容非常相似。
向 xorriso 询问重新创建原始 ISO 的启动设备的建议:
$ xorriso -indev ubuntu-23.10-live-server-arm64.iso -report_el_torito as_mkisofs
...
-V 'Ubuntu-Server 23.10 arm64'
--modification-date='2023101104561500'
-partition_cyl_align off
-partition_offset 16
-append_partition 2 0xef --interval:local_fs:4615776d-4629311d::'ubuntu-23.10-live-server-arm64.iso'
-G --interval:local_fs:0s-15s:zero_mbrpt:'ubuntu-23.10-live-server-arm64.iso'
-iso_mbr_part_type 0xcd
-c '/boot/boot.cat'
-e '--interval:appended_partition_2_start_1153944s_size_13536d:all::'
-no-emul-boot
-boot-load-size 13536
在这种情况下,选项 -G 并不是必需的。建议使用此选项是因为存在分区表。其效果会被新分区表的创建所覆盖。如果 EFI 分区的大小存在任何变化的风险,则应省略选项 -boot-load-size。