聊一聊 ISO 9660

ISO 9660

ISO 9660,也被一些硬件和软件供应商称作CDFS(光盘文件系统),是一个由国际标准化组织(ISO)为光盘介质发布的文件系统。其目标是能够在不同的操作系统如Windows、Mac OS以及类Unix系统上交换数据。

我们平时接触到的 ISO 格式文件均为 ISO 9660,我们可以通过 file 命令进行查看,以 RedHat 发行版为例:

1
2
[root@node redhat]# file rhel-server-7.6-x86_64-dvd.iso
rhel-server-7.6-x86_64-dvd.iso: ISO 9660 CD-ROM filesystem data 'RHEL-7.6 Server.x86_64 ' (bootable)

用途

  1. 安装操作系统,我们可以通过将 ISO 挂载到物理服务器/PC 上,从 ISO 启动进行操作系统的安装;
  2. 作为软件安装源,比如红帽系列的版本,在 ISO 中,通常会有 Packages 路径,下面包含了当前版本完整的软件源,我们可以通过本地挂载的方式使用;
  3. 作为软件发行方式,常见的有 VMware vmtools, KVM Virtio 等统一打包方式;

制作方式

  1. genisoimage
  2. mkisofs

第一种方式不常用,主要使用第二种方式进行使用,之前的文章中提到过 LiveCD 制作方式也是通过 mkisofs 命令继续构建的。

这里我们可以参考 VMware 官方文档了解如何定制自己的 ISO。

说一下何时需要定制我们自己的 ISO。当我们获取到各个发行版本的 ISO 后,我们可以正常使用进行安装,但是都是交互式安装,需要我们通过图形化界面/命令行交互的方式进行配置确认及参数设置。如果我们想要 ISO 支持静默安装,那么就需要我们自己定制属于自己的 KickStart 脚本,然后放置到 ISO 中并设置为默认执行项。
此场景对于 *nix 系统均适用。

当前路径结构

1
2
3
4
5
6
7
8
9
10
11
12
13
test/
├── a.b00
├── ata_liba.v00
|...
├── char_ran.v00
├── efi
│   └── boot
│   ├── boot.cfg
│   ├── bootia32.efi
│   └── bootx64.efi
├── efiboot.img
├── hid_hid.v00
|...

执行 mkisofs 命令,指定 ISO 源文件路径,指定目标 ISO 名称,即可构建。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
[root@installer mnt]# mkisofs -relaxed-filenames -J -R -o custom_esxi.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table test/
Warning: creating filesystem that does not conform to ISO-9660.
I: -input-charset not specified, using utf-8 (detected in locale settings)
Size of boot image is 4 sectors -> No emulation
2.89% done, estimate finish Sat Jan 12 21:56:27 2019
5.78% done, estimate finish Sat Jan 12 21:56:27 2019
8.66% done, estimate finish Sat Jan 12 21:56:27 2019
11.55% done, estimate finish Sat Jan 12 21:56:27 2019
14.44% done, estimate finish Sat Jan 12 21:56:27 2019
17.33% done, estimate finish Sat Jan 12 21:56:27 2019
20.21% done, estimate finish Sat Jan 12 21:56:27 2019
23.10% done, estimate finish Sat Jan 12 21:56:27 2019
25.98% done, estimate finish Sat Jan 12 21:56:27 2019
28.88% done, estimate finish Sat Jan 12 21:56:27 2019
31.76% done, estimate finish Sat Jan 12 21:56:27 2019
34.65% done, estimate finish Sat Jan 12 21:56:27 2019
37.53% done, estimate finish Sat Jan 12 21:56:27 2019
40.42% done, estimate finish Sat Jan 12 21:56:27 2019
43.31% done, estimate finish Sat Jan 12 21:56:27 2019
46.20% done, estimate finish Sat Jan 12 21:56:27 2019
49.08% done, estimate finish Sat Jan 12 21:56:27 2019
51.97% done, estimate finish Sat Jan 12 21:56:27 2019
54.85% done, estimate finish Sat Jan 12 21:56:27 2019
57.74% done, estimate finish Sat Jan 12 21:56:27 2019
60.63% done, estimate finish Sat Jan 12 21:56:27 2019
63.52% done, estimate finish Sat Jan 12 21:56:27 2019
66.40% done, estimate finish Sat Jan 12 21:56:27 2019
69.29% done, estimate finish Sat Jan 12 21:56:27 2019
72.17% done, estimate finish Sat Jan 12 21:56:27 2019
75.06% done, estimate finish Sat Jan 12 21:56:27 2019
77.95% done, estimate finish Sat Jan 12 21:56:27 2019
80.84% done, estimate finish Sat Jan 12 21:56:27 2019
83.72% done, estimate finish Sat Jan 12 21:56:27 2019
86.61% done, estimate finish Sat Jan 12 21:56:27 2019
89.49% done, estimate finish Sat Jan 12 21:56:27 2019
92.39% done, estimate finish Sat Jan 12 21:56:27 2019
95.27% done, estimate finish Sat Jan 12 21:56:27 2019
98.16% done, estimate finish Sat Jan 12 21:56:27 2019
Total translation table size: 2048
Total rockridge attributes bytes: 14593
Total directory bytes: 6144
Path table size(bytes): 50
Max brk space used 25000
173203 extents written (338 MB)

使用 file 命令查看构建结果:

1
2
[root@installer mnt]# file custom_esxi.iso
custom_esxi.iso: # ISO 9660 CD-ROM filesystem data 'CDROM' (bootable)

定制 ISO 信息

通过上面的命令,我们构建了属于我们自己的 ISO,但是这时候出现一个需求,如果我们要对我们定制的 ISO 进行版本管理,要求可以通过 ISO 自动升级,那么我们在需要有渠道/方式获取 ISO 属性信息,比如:release date,size,dependency… 我们如何管理这些属性信息呢?

最简单的方式肯定是直接再编写一个文件,与 ISO 一一匹配,在文件中记录 ISO 相应信息,比如:

1
2
3
4
{"md5": "04db3dc9d872c382b1f42c9741815138",
"size": 354719744,
"dependency": ["yiran1", "yiran2", "yiran3"]
}

这样虽然简单实现了,但是很不方便管理,通过查看 ISO 9660 维基百科中的描述,可以看到有一个特性:

最开始的32768字节没有被ISO 9660数据结构使用,因此可以有其他用处,例如:CD-ROM可以在此区包含一个替代文件系统描述信息块,通常被混合光盘(Hybrid CD)用于提供Mac OS特定的内容。此未用块后面跟着一连串卷描述符,详细记录了该磁盘上的内容和类型信息(类似被FAT和NTFS格式磁盘使用的BIOS参数块)。

可以看到 ISO 前 32KiB 空间未被使用,Mac OS 早就利用这个空间来进行信息记录了,那么我们可以通过 dd 的方式来将二进制的信息写入 ISO 前 32KiB 空间中。
这样就避免了同时维护 ISO 及 ISO 对应 metadata 文件,管理起来更加方便。

参考链接