tar包的完全相同的内容具有不同的校验和

时间:2018-10-05 15:00:04

标签: linux md5 tar checksum opensuse

使用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选项在这里也无济于事,因为创建日期完全相同。

我对此表示感谢。

2 个答案:

答案 0 :(得分:4)

您提供的档案包含pax extended headers。 快速浏览一下它们的结构,就可以发现它们在以下两个方面有所不同:

  1. pax进程的进程ID(作为ustar标头块中扩展标头的名称的一部分,因此是此ustar标头块的校验和)。
  2. 扩展标头中的atime(访问时间)。

可用于创建可重现的存档的一种解决方法是强制使用旧的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