Rob*_*ert 3 linux checksum md5 tar opensuse
在使用 GNU tar 1.30 的 SUSE Linux Enterprise Server 12 SP3 系统上打包文件夹总是会提供不同的 md5 校验和,尽管文件内容不会更改。
我运行 tar 来打包我的文件夹,其中包含一个简单的文本文件:
tar cf package.tar folder
Run Code Online (Sandbox Code Playgroud)
尽管如此,尽管内容完全相同,但生成的 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
Run Code Online (Sandbox Code Playgroud)
因为 linux 文件系统似乎以随机顺序将文件传送到 tar,所以我尝试使用该--sort
选项。但是生成的命令不会改变我的校验和问题。tar 的--mtime
选项在这里也无济于事,因为创建日期完全相同。
我很感激这方面的任何帮助。
您提供的档案包含pax 扩展标头。快速浏览一下它们的结构就会发现它们在这两个领域有所不同:
可用于创建可重现存档的解决方法之一是强制使用旧的 unix ustar 格式(而不是 pax/posix 格式):
tar --format=ustar -cf package.tar folder
Run Code Online (Sandbox Code Playgroud)
另一种选择是手动设置扩展名并删除 atime,同时保留 pax 格式:
tar --format=pax --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime -cf package.tar folder
Run Code Online (Sandbox Code Playgroud)
现在这md5sum
两个档案应该是相同的。
tar 文件的标头包含多个字段,每次重新打包一组文件时这些字段可能会有所不同。例如,最后访问时间和修改时间每次可能会不同。
根据这篇文章,通过执行以下操作,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
Run Code Online (Sandbox Code Playgroud)