如何使用 mkisofs/genisoimage 制作可复制的 iso 文件?

fra*_*one 5 rsync mkisofs reproducible-build

在自动化过程中,将使用 .iso 文件创建 ISO 文件mkisofs。甚至,由于原始数据完全相同,因此生成的 iso 文件也不相同(它们的md5sum更改)。因为我的rsync --checksum结果,我不喜欢每次都重新传输“相同的iso”。我预计时间戳是主要区别。

是否有一些内置开关可以通过确实相同的libfaketime方式生成 iso 。mkisofs

我不知道只有时间戳才重要吗?我将生成的 iso 文件与其xxd isofile输出进行了比较,如下所示:

diff --side-by-side  --suppress-common-lines <(xxd a.iso) <(xxd b.iso )
Run Code Online (Sandbox Code Playgroud)

在其他完全相同的文件中似乎只有 51 行代表 16 字节(大约有 800 字节的差异)。

用于生成该 iso 的命令大致如下:

genisoimage -o "file.iso" -b isolinux/isolinux.bin \
    -c isolinux/boot.cat -no-emul-boot \
    -boot-load-size 4 -boot-info-table \
    -J -R -v -T -V 'CDLABEL' "datadir/"
Run Code Online (Sandbox Code Playgroud)

BS:我是否缺少一个命令行参数开关,rsync它可以对大约 1MB 的大文件块进行校验和,以防止在我的情况下只有大约 800 字节不同时重新传输?

sch*_*ily 6

首先重要说明:请勿使用,genisoimage因为它是 2004 年 5 月的有缺陷的变体mkisofs

截至 2007 年 5 月,大量 Debian 特有的 bug 被添加,从那时起它就消失了。

这里要知道的重要一点是genisoimage创建有缺陷的文件系统映像,这些映像有时可能不再被您的操作系统接受......

然而,官方mkisofs仍在积极维护并于 2006 年 8 月修复了大量非 Debian 特定的错误。目前没有已知的错误。

现在解决您的问题:您正在使用 -R (Rock Rigde),这会UNIX向文件元数据添加时间戳。这是问题 1....

另一个问题是 ISO-9660 文件系统超级块(正式称为primary_descriptor)包含创建日期和修改日期。后者可以通过选项进行控制-modification-date

如果您认为这是真正需要的功能,我可以为创建日期添加类似的选项。然而,您仍然需要一个选项来告诉 Rock Ridge 格式化部分使用文件的修改日期而不是上次读取访问的时间。

经常更新的原始源版本是schilytoolstarball 的一部分,可以从以下位置检索:http ://sourceforge.net/projects/schilytools/files/

当前最新的 schilytools tarball 引入了对可复制 ISO-9660 文件系统映像的支持。请获取/编译/安装 schily-2020-03-27.tar.bz2。

有一些新选项:

  • -noatime告诉mkisofs将修改时间归档为atime。

  • -creation-date在 PVD ​​中设置创建日期

  • -expiration-date在 PVD ​​中设置到期日期

  • -effective-date在 PVD ​​中设置生效日期

  • -reproducible-date设置除-effective-date-noatime另外之外的所有时间。

这适用于普通 ISO-9660 文件系统映像以及包含Rock Ridge和的映像UDF。请参阅最近的手册页:http://schilytools.sourceforge.net/man/man8/mkisofs.8.html

您更新后的命令行将如下所示:

mkisofs -b isolinux/isolinux.bin \
  -c isolinux/boot.cat -no-emul-boot \
  -boot-load-size 4 -boot-info-table \
  -J -R -v -T -V 'CDLABEL' \
  -reproducible-date=20200327 "datadir/" > file.iso
Run Code Online (Sandbox Code Playgroud)