使用GNU tar 1.30在SUSE Linux Enterprise Server 12 SP3系统上打包文件夹时,尽管文件内容不变,但始终提供不同的md5校验和。
我运行tar来打包包含一个简单文本文件的文件夹:
tar cf package.tar folder
尽管如此,尽管内容完全相同,但是生成的tar始终具有不同的md5(或sha1)校验和:
$> rm -rf package.tar && tar cf package.tar folder && md5sum package.tar
e6383218596fffe118758b46e0edad1d package.tar
$> rm -rf package.tar && tar cf package.tar folder && md5sum package.tar
1c5aa972e5bfa2ec78e63a9b3116e027 package.tar
由于linux文件系统似乎以随机顺序将文件传送到tar,因此我尝试使用--sort
选项。但是结果命令对我来说不会改变校验和问题。 tar的--mtime
选项在这里也无济于事,因为创建日期完全相同。
我对此表示感谢。
答案 0 :(得分:4)
您提供的档案包含pax extended headers。 快速浏览一下它们的结构,就可以发现它们在以下两个方面有所不同:
可用于创建可重现的存档的一种解决方法是强制使用旧的unix ustar格式(而不是pax / posix格式):
tar --format=ustar -cf package.tar folder
另一种选择是在保留pax格式的同时手动设置扩展名并删除atime:
tar --format=pax --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime -cf package.tar folder
现在两个存档的md5sum
应该相同。
答案 1 :(得分:3)
tar文件的头包含several fields,每次重新打包一组文件时,它们都可能不同。例如,上次访问时间和修改时间可能每次都不同。
根据this article,GNU tar可以通过执行以下操作为相同的输入产生相同的输出:
# requires GNU Tar 1.28+
$ tar --sort=name \
--mtime="2018-10-05 00:00Z" \
--owner=0 --group=0 --numeric-owner \
-cf product.tar build