tar 包对于完全相同的内容具有不同的校验和
tar package has different checksum for exactly the same content
在 SUSE 上打包文件夹 Linux Enterprise Server 12 SP3 系统使用 GNU tar 1.30 总是给出不同的 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
选项在这里也没有帮助,因为创建日期完全相同。
感谢您对此提供的任何帮助。
tar 文件的 header 包含 several fields,每次您 re-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
您提供的档案包含 pax extended headers。
快速浏览一下它们的结构就会发现它们在以下两个领域有所不同:
- pax 进程的进程 ID(作为 ustar header 块中扩展 header 的名称的一部分,以及此 ustar header 块的校验和) .
- 扩展header中的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
应该相同。
tar -p --sort=name --no-acls --no-selinux --no-xattrs
在 slackware 14.2 中处理类似情况,使用
GNU tar 1.29。
p 代表保留属性(所有者和时间)并假定为 root 用户。
还可以考虑 untarring with --atime-preserve
(取决于目的)。
在 SUSE 上打包文件夹 Linux Enterprise Server 12 SP3 系统使用 GNU tar 1.30 总是给出不同的 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
选项在这里也没有帮助,因为创建日期完全相同。
感谢您对此提供的任何帮助。
tar 文件的 header 包含 several fields,每次您 re-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
您提供的档案包含 pax extended headers。 快速浏览一下它们的结构就会发现它们在以下两个领域有所不同:
- pax 进程的进程 ID(作为 ustar header 块中扩展 header 的名称的一部分,以及此 ustar header 块的校验和) .
- 扩展header中的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
应该相同。
tar -p --sort=name --no-acls --no-selinux --no-xattrs
在 slackware 14.2 中处理类似情况,使用
GNU tar 1.29。
p 代表保留属性(所有者和时间)并假定为 root 用户。
还可以考虑 untarring with --atime-preserve
(取决于目的)。