当我们要定制一个 RHEL 及其衍生版的操作系统镜像时,我们会使用 genisoimage 命令来生成最终的 ISO 文件。

例如,我们基于 Rocky Linux 8.5 版本,定制了一个镜像后,最终我们会执行如下这条命令:

$ cd rocky-linux-8-5-x86_64-dvd/
$ genisoimage -v -U -r -T -J -joliet-long \
  -V Rocky-8-5-x86_64-dvd -volset Rocky-8-5-x86_64-dvd -A Rocky-8-5-x86_64-dvd \
  -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table \
  -eltorito-alt-boot -e images/efiboot.img -no-emul-boot \
  -o ../NEWISO.iso

这条命令参数很多,我们需要先了解和光盘有关的相关标准才能看懂这个命令。

ISO9660 及相关标准

ISO9660 就是光盘文件系统的标准,意思就是如何在光盘上存储文件。更多信息可以查看 wiki 链接:https://en.wikipedia.org/wiki/ISO_9660

随着计算机行业的发展,原来的标准不太适用于新的需求,比如文件名字更长,目录层级更多等。所以业界也一直在扩充 ISO9660 的相关标准。这里我们说三个目前最常用的。

Rock Ridge

https://en.wikipedia.org/wiki/ISO_9660#Rock_Ridge

Rock Ridge Interaction Protocol (RRIP) 为光盘文件系统增加了 POSIX 文件系统语意。支持这个标准后,操作系统可以更好的跟光盘文件系统进行交互,比如支持更长的文件名,文件 mode, uid 等。

这个标准的名字是一部电影里的虚构城镇的名字。电影的中文名字是:神枪小子。

fictional town Rock Ridge in Mel Brooks' film Blazing Saddles.

El Torito

https://en.wikipedia.org/wiki/ISO_9660#El_Torito

El Torito 是一个让 PC 可以从 CD-ROM 启动的标准。最初由 IBM 和 Phoenix Technologies (卖 BIOS 的厂商)制定,随后被所有 BIOS 支持。支持这个标准后,BIOS 除了可以加载硬盘上的启动代码,也可以加载光盘上的启动代码。

据说这个名字是加州一家墨西哥餐馆的名字,这个标准是在这个餐馆里想出来的。

El Torito restaurant in Irvine, California (33.684722°N 117.852547°W)

Joliet

https://en.wikipedia.org/wiki/ISO_9660#Joliet

这里由微软提出的标准。原来的标准对于光盘上的文件名字限制太死,比如长度、格式、不支持 Unicode 等,所以用这个标准扩展了一下,方便存放名字更复杂的文件。

三个扩展标准的小结

Standard Description
Rock Ridge 让光盘文件系统更接近 POSIX 文件系统,操作系统可以更方便的访问。
El Torito 让计算机可以从光盘启动。
Joliet 让光盘的文件名可以更复杂,符合现在的计算机系统中的文件名。

genisoimage 命令的参数

$ genisoimage -v -U -r -T -J -joliet-long \
  -V Rocky-8-5-x86_64-dvd -volset Rocky-8-5-x86_64-dvd -A Rocky-8-5-x86_64-dvd \
  -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table \
  -eltorito-alt-boot -e images/efiboot.img -no-emul-boot \
  -o ../NEWISO.iso

上面这个命令的参数看起来很多,但是可以分组来看。-v-o 参数比较简单,就不展开说了。

和光盘的名字相关的

这些参数就是让光盘在系统上有一个友好的展示名字。

  • -A or -appid
    • 会被写入 volume header 的一个字符串,表示这个光盘中装载的应用程序,最多 128 字符。
  • -V
    • 将 volume id 写入 master block,长度限制是 32 个字符。
  • -volset
    • 设置 volume set id,长度限制是 128 字符。Volume set 相当于是一套光盘的意思,所以后续还可以设置当前光盘是一套光盘里的第几张光盘。

Joliet 标准相关

这些参数用来控制光盘上的文件的文件名的限制,配置这些选项的目的就是尽量不限制文件名。

  • -J
    • 生成 Joliet 目录记录。
  • -joliet-long
    • 允许 Joliet 文件名的最大长度达到 103 个字符。
  • -r or -rational-rock
    • 类似 -R,生成 SUSP 和 RR 记录,但是 file ownership 会被设置为更有用的值,减少使用 ISO 的人需要处理的文件权限的问题。
  • -T or -translation-table
    • 在光盘的每个目录下都生成一个 TRANS.TBL 的文件,用于帮助在不兼容 RR 标准的系统上使用正确的文件名来访问文件。
  • -U or -untranslated-filenames
    • 允许非转换的文件名,这会导致完全不兼容 ISO9660 标准。相当于开启了以下选项:-d -l -N -allow-leading-dots -relaxed-filenames -allow-lowercase -allow-multidot -no-iso-translate,就是减少对文件名的限制。

El Torito 标准相关

这些参数是用来控制光盘作为启动盘是如何工作的。

  • -b or -eltorito-boot
    • 指定 El Torito 启动盘使用的启动文件。对于 legacy BIOS,这个就是 isolinux.bin 文件。
  • eltorito-alt-boot
    • 开始一组新的 El Torito 启动参数的配置。一般一组用于 isolinux,一组用于 UEFI。

以下几个参数是和 legacy BIOS 启动方式相关的

  • -c or -eltorito-catalog
    • 指定 El Torito 的 boot catalog 文件的位置。启动需要这个文件。
  • -no-emul-boot
    • 用于 El Torito 的启动文件是一个非模拟镜像。系统会加载并且直接执行,而不会像使用一个硬盘一样,先通过分区表来查找启动分区。现在计算机都支持这种方式,通过这种方式,就不需要在一个启动文件里模拟硬盘的数据保存格式。
  • -boot-load-size
    • 指定在非模拟的情况下,load 的 virtual sector (512B) 数量。这里一般要求是 4 的倍数,否则在有些系统上无法工作。这个意思是启动的时候,在启动阶段,通过读取启动文件的这么多数据,就可以把控制权转给启动文件。
  • -boot-info-table
    • 指定需要在 boot file offset 8 的位置插入一个 56 字节长的内容,这个插入的内容和光盘的 layout 信息有关,如下面所示。主要目的是为了在启动的过程中,找到 boot 文件的位置。
    • LBA:linear block address (given in CD sectors, normally 2048 bytes)。
         Offset    Name           Size      Meaning
          8        bi_pvd         4 bytes   LBA of primary volume descriptor
         12        bi_file        4 bytes   LBA of boot file
         16        bi_length      4 bytes   Boot file length in bytes
         20        bi_csum        4 bytes   32-bit checksum
         24        bi_reserved    40 bytes  Reserved

以下几个参数是和 UEFI 启动方式相关的

  • -e or -efi-boot
    • EFI 启动文件的位置。UEFI 启动文件也需要指定 -no-emul-boot 参数。

implantisomd5 命令

将 ISO 的 md5sum 写入一个没有的 sector,以便随后使用 checkisomd5 命令进行校验。

$ implantisomd5 Rocky-Linux-8.5-x86_64-dvd.iso

使用 checkisomd5 命令进行校验:

$ checkisomd5 --verbose Rocky-Linux-8.5-x86_64-dvd.iso
Rocky-Linux-8.5-x86_64-dvd.iso:   e9ebe80ba90b67c1a4e3ccfd971bd86a
Fragment sums: 6ec3c854976341d15f5425ae13b7e16f5a7df75942a553adb6f29ba6798c
Fragment count: 20
Supported ISO: no
Press [Esc] to abort check.
Checking: 093.3%

知识共享许可协议本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。