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

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

在自动化过程中,将使用 .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 )

在其他完全相同的文件中似乎只有 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/"

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

答案1

首先重要说明:请勿使用,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

答案2

人们切换到克索里索作为人们可能想避免 mkisofgenisoimage 似乎没有进一步开发。

为了使 xorriso 输出可重现,请将名为 SOURCE_DATE_EPOCH 的环境变量设置为与 1970 年 1 月 1 日以来的秒数相同的值。

您可以直接使用 xorriso 或其mkisofs 兼容模式名为 xorrisofs

SOURCE_DATE_EPOCH=0 xorrisofs YOUR-MKISOFS-ARGS

答案3

提供的答案对我不起作用,但在一些朋友的帮助下,我找到了一种使用 xorriso 从任意文件夹创建可复制 ISO 映像的方法

日期必须作为环境变量导出。文件权限对于不同的人来说可能是不同的,所以我们强制他们做一些事情。preparer_id会有所不同,因为默认情况下它包含 xorriso 的全名和版本。uid/gid在不同的系统上也可以不同。

此脚本接受文件夹路径作为启动参数或提示输入。不过还没有尝试过创建操作系统映像。

export SOURCE_DATE_EPOCH="$(date -d20010101 -u +%s)"
output_filename=result.iso
file_mode=0444

folder="$1"
while [ ! -d "$folder" ]; do
    [ -z "$folder" ] || printf "'%s' not a directory?\n" "$folder"
    read -p "Enter path to dir containing files to pack: " folder
done
list="$(mktemp)"
(cd "$folder"; for f in *; do printf "%s\n" "$f=$PWD/$f"; done) \
    | LC_ALL=C sort >"$list"

xorriso \
    -preparer_id xorriso \
    -volume_date 'all_file_dates' "=$SOURCE_DATE_EPOCH" \
    -as mkisofs \
    -iso-level 3 \
    -graft-points \
    -full-iso9660-filenames \
    -joliet \
    -file-mode $file_mode \
    -uid 0 \
    -gid 0 \
    -path-list "$list" \
    -output "$output_filename"

rm -f "$list"

相关内容