【问题标题】:tar package has different checksum for exactly the same contenttar 包对完全相同的内容有不同的校验和
【发布时间】:2019-03-11 03:03:31
【问题描述】:

使用 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 选项在这里也没有帮助,因为创建日期完全相同。

感谢您对此提供的任何帮助。

【问题讨论】:

  • ...文件的最后访问时间?也许?
  • 可以更改权限吗?查看this 以了解 TAR 标头包含的内容。
  • 这两个文件的文件大小是否相同?
  • 你能解压这两个不同的档案并比较文件夹内容吗?
  • @DaBler 文件大小和文件夹内容对于文件的两个版本完全相同。

标签: linux md5 tar checksum opensuse


【解决方案1】:

您提供的档案包含pax extended headers。 快速浏览一下它们的结构就会发现它们在这两个领域有所不同:

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

可用于创建可重现存档的解决方法之一是强制执行旧的 unix ustar 格式(而不是 pax/posix 格式):

tar --format=ustar -cf package.tar folder

另一种选择是手动设置扩展名,删除atime,同时保留pax格式:

tar --format=pax --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime -cf package.tar folder

现在md5sum 对于两个存档应该是相同的。

【讨论】:

    【解决方案2】:

    tar 文件的标头包含 several fields,每次您重新 tar 一组文件时可能会有所不同。例如上次访问时间和修改时间可能每次都不同。

    根据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
    

    【讨论】:

    • 感谢您的意见迈克尔。不幸的是,它对我不起作用。似乎其他标头信息仍在影响 tars 校验和。我还尝试在 tarring 之前触摸所有文件 touch --no-dereference -t "201810050000" 。仅供参考,我意识到我的文件夹包含指向文件夹内位置的符号链接。所以恕我直言,不应该有所作为。
    • 在这种情况下,您必须在两个不同的 tar 之间执行 binary diff 以查看有什么不同。很可能有一些文件元数据被收集起来并放入您不想要的 tar 中。一旦你发现哪里有不同,你可以使用tar spec 找出不同的字段。
    【解决方案3】:

    tar -p --sort=name --no-acls --no-selinux --no-xattrs 在 slackware 14.2 中的类似情况下工作,使用 GNU 焦油 1.29。
    p 代表保留属性(所有者和时间),假定为 root 用户。
    还可以考虑使用--atime-preserve 解压缩(取决于目的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      相关资源
      最近更新 更多