![如何使用 mkisofs/genisoimage 制作可复制的 iso 文件?](https://linux22.com/image/169116/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20mkisofs%2Fgenisoimage%20%E5%88%B6%E4%BD%9C%E5%8F%AF%E5%A4%8D%E5%88%B6%E7%9A%84%20iso%20%E6%96%87%E4%BB%B6%EF%BC%9F.png)
在自动化过程中,将使用 .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 格式化部分使用文件的修改日期而不是上次读取访问的时间。
经常更新的原始源版本是schilytools
tarball 的一部分,可以从以下位置检索: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"