ISO9660 标准和 genisoimage 命令
当我们要定制一个 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
,就是减少对文件名的限制。
- 允许非转换的文件名,这会导致完全不兼容 ISO9660 标准。相当于开启了以下选项:
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
参数。
- EFI 启动文件的位置。UEFI 启动文件也需要指定
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%