Ubuntu 22.04 构建的 ISO 镜像(包括 MBR 和 EFI)

在我们公司,我们使用修改过的Ubuntu安装ISO镜像。 由于Ubuntu 22.04改变了安装镜像的结构(ISOLINUX已被移除,改为GRUB2),我需要关于如何构建一个新的ISO镜像的建议,以支持同时在同一镜像上支持MBR和EFI,就像Ubuntu 22.04一样。
在Ubuntu 20.04中,我使用以下命令构建了ISO镜像。
所以问题是:如何为Ubuntu 22.04构建一个ISO镜像?谢谢。

使用Ubuntu 20.04 LTS创建ISO镜像的命令

从镜像中提取内容:
dd if="/opt/ubnt/ubuntu-20.04.4-desktop-amd64.iso" bs=1 count=432 of="/opt/ubnt/isohdpfx.bin"
xorriso -osirrox on -indev /opt/ubnt/ubuntu-20.04.4-desktop-amd64.iso -extract / /opt/ubnt/ubuntu-MODIF

...这里有一些定制...
构建Ubuntu 20.04 LTS
xorriso -as mkisofs -r  
  -V 'Ubuntu 20.04 LTS MODIF (EFIBIOS)' 
  -o /opt/ubnt/ubuntu-modif.iso 
  -isohybrid-mbr /opt/ubnt/isohdpfx.bin 
  -J -joliet-long -b isolinux/isolinux.bin 
  -c isolinux/boot.cat 
  -boot-load-size 4 
  -boot-info-table -no-emul-boot -eltorito-alt-boot 
  -e boot/grub/efi.img 
  -no-emul-boot 
  -isohybrid-gpt-basdat /opt/ubnt/ubuntu-MODIF

20.04仍然得到支持。在你的环境中,有特定的原因要升级到22.04吗? - Thomas Ward
22.04/jammy没有我想象中的变化;我认为它与21.10相同,大部分变化发生在groovyhirsute版本周期中。 - guiverc
1个回答

Ubuntu 22.04构建ISO(MBR和EFI都支持)

xorriso的最新版本(1.5.4)可以告诉:


$ xorriso -indev ubuntu-22.04-desktop-amd64.iso -report_el_torito as_mkisofs
-V 'Ubuntu 22.04 LTS amd64'
--modification-date='2022041910231900'
--grub2-mbr --interval:local_fs:0s-15s:zero_mbrpt,zero_gpt:'ubuntu-22.04-desktop-amd64.iso'
--protective-msdos-label
-partition_cyl_align off
-partition_offset 16
--mbr-force-bootable
-append_partition 2 28732ac11ff8d211ba4b00a0c93ec93b --interval:local_fs:7129428d-7137923d::'ubuntu-22.04-desktop-amd64.iso'
-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_1782357s_size_8496d:all::'
-no-emul-boot
-boot-load-size 8496

老版本猜错了。新的布局让他们有些惊讶。 但他们可以创建它。原始版本是由xorriso-1.5.2制作的。
显示的选项是为了尽可能精确地复制ISO。 对于修改后的ISO,人们会希望省略其中一些选项以获取默认设置,并用后续不需要原始ISO镜像存在的操作替换其他选项。

# Extract the MBR template for --grub2-mbr
# We only need the x86 code. All partition stuff will be newly created.
dd if=ubuntu-22.04-desktop-amd64.iso bs=1 count=432 of=/opt/ubnt/boot_hybrid.img

# The EFI partition is not a data file inside the ISO any more.
# So extract the EFI partition image image for -append_partition
# 7129428d-7137923d : 7137923 - 7129428 + 1 = 8496
dd if=ubuntu-22.04-desktop-amd64.iso bs=512 skip=7129428 count=8496 of=/opt/ubnt/efi.img

# Extract file tree as usual ...

# Finally pack up an ISO the new way
xorriso -as mkisofs -r \
  -V 'Ubuntu 22.04 LTS MODIF (EFIBIOS)' \
  -o /opt/ubnt/ubuntu-modif.iso \
  --grub2-mbr /opt/ubnt/boot_hybrid.img \
  -partition_offset 16 \
  --mbr-force-bootable \
  -append_partition 2 28732ac11ff8d211ba4b00a0c93ec93b /opt/ubnt/efi.img \
  -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:::' \
    -no-emul-boot \
  /opt/ubnt/ubuntu-MODIF

优点是,将ISO文件放在USB闪存驱动器上时,它将被识别为GPT分区,并且分区之间有清晰的分隔。

$ /sbin/fdisk -l ubuntu-22.04-desktop-amd64.iso

Disk ubuntu-22.04-desktop-amd64.iso: 3.4 GiB, 3654957056 bytes, 7138588 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: A09DB2B8-B5F6-43AE-AFB3-91E0A90189A1

Device                            Start     End Sectors  Size Type
ubuntu-22.04-desktop-amd64.iso1      64 7129427 7129364  3.4G Microsoft basic da
ubuntu-22.04-desktop-amd64.iso2 7129428 7137923    8496  4.2M EFI System
ubuntu-22.04-desktop-amd64.iso3 7137924 7138523     600  300K Microsoft basic da

(第三个分区涵盖了传统的300 KiB末尾填充,实际上只有在使用Track-At-Once写入类型的CD介质时才需要。选项-no-pad可以防止这种情况发生。)

2Thomas,你是怎么把 7129428d-7137923d 转换成 7137923 - 7129428 + 1 = 8496 的呢? - Andrey Zentavr
1另一个问题是:为什么你复制了 MBR 的 432 字节而不是 446 字节?经典的 MBR 有 446 字节的引导代码区域。现代的 MBR 则有 218 字节的引导代码区域(第一部分)和 216(或 222)字节的引导代码区域(第二部分)。 - Andrey Zentavr