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)
用途
- 安装操作系统,我们可以通过将 ISO 挂载到物理服务器/PC 上,从 ISO 启动进行操作系统的安装;
- 作为软件安装源,比如红帽系列的版本,在 ISO 中,通常会有
Packages
路径,下面包含了当前版本完整的软件源,我们可以通过本地挂载的方式使用; - 作为软件发行方式,常见的有 VMware vmtools, KVM Virtio 等统一打包方式;
- …
制作方式
- genisoimage
- mkisofs
第一种方式不常用,主要使用第二种方式进行使用,之前的文章中提到过 LiveCD 制作方式也是通过 mkisofs
命令继续构建的。
这里我们可以参考 VMware 官方文档了解如何定制自己的 ISO。
说一下何时需要定制我们自己的 ISO。当我们获取到各个发行版本的 ISO 后,我们可以正常使用进行安装,但是都是交互式安装,需要我们通过图形化界面/命令行交互的方式进行配置确认及参数设置。如果我们想要 ISO 支持静默安装,那么就需要我们自己定制属于自己的 KickStart 脚本,然后放置到 ISO 中并设置为默认执行项。
此场景对于 *nix 系统均适用。
当前路径结构
1 | test/ |
执行 mkisofs 命令,指定 ISO 源文件路径,指定目标 ISO 名称,即可构建。
1 | [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/ |
使用 file
命令查看构建结果:
1 | [root@installer mnt]# file custom_esxi.iso |
定制 ISO 信息
通过上面的命令,我们构建了属于我们自己的 ISO,但是这时候出现一个需求,如果我们要对我们定制的 ISO 进行版本管理,要求可以通过 ISO 自动升级,那么我们在需要有渠道/方式获取 ISO 属性信息,比如:release date,size,dependency… 我们如何管理这些属性信息呢?
最简单的方式肯定是直接再编写一个文件,与 ISO 一一匹配,在文件中记录 ISO 相应信息,比如:
1 | {"md5": "04db3dc9d872c382b1f42c9741815138", |
这样虽然简单实现了,但是很不方便管理,通过查看 ISO 9660 维基百科中的描述,可以看到有一个特性:
最开始的32768字节没有被ISO 9660数据结构使用,因此可以有其他用处,例如:CD-ROM可以在此区包含一个替代文件系统描述信息块,通常被混合光盘(Hybrid CD)用于提供Mac OS特定的内容。此未用块后面跟着一连串卷描述符,详细记录了该磁盘上的内容和类型信息(类似被FAT和NTFS格式磁盘使用的BIOS参数块)。
可以看到 ISO 前 32KiB 空间未被使用,Mac OS 早就利用这个空间来进行信息记录了,那么我们可以通过 dd
的方式来将二进制的信息写入 ISO 前 32KiB 空间中。
这样就避免了同时维护 ISO 及 ISO 对应 metadata 文件,管理起来更加方便。