我应该使用哪种 tar 文件格式?

Gle*_*dyr 8 backup archive format tar

tar 可以创建不同格式的存档。GNU tar、ustar、pax、v7。什么是最好的长时间存档?这些格式是否存在显着差异?

我会使用最好的格式进行一般备份,我不希望我可以提取数据,因为格式问题。(例如,v7 从实现中消失)

Exp*_*r09 11

v7ustar和格式之间的一些技术比较pax

\n

v7

\n

POSIX.1-1988 之前的格式。

\n
    \n
  • 文件名的最大长度为 99 个字符。(100 字节减去终止空字节。)
  • \n
  • 链接目标的最大长度为 99 个字符。
  • \n
  • 允许的文件类型:常规文件 (typeflag \'\\0\')、目录、硬链接 (typeflag 1)、符号链接 (typeflag 2)。目录由名称字段中的尾部斜杠标识。参考文献1
  • \n
  • 最大文件大小为 8589934591 字节 (8 GiB - 1)。
  • \n
  • 存储数字用户 ID 和组 ID。不存储用户名和组名。最大 UID 和 GID 为 2097151(八进制 7777777)。
  • \n
  • 存储修改时间。格式中允许的最大时间戳为 2242-03-16 12:56:31 UTC(自纪元以来的 8589934591 秒),但是由于32 位系统中存在2038 年问题, tar 读取器可能无法识别它们。
  • \n
\n

乌斯塔

\n

ustar 从 v7 格式扩展了标头块,未压缩时,ustar tarball 的大小与 v7 tarball 相同。没有什么大理由更喜欢 v7 格式,除非你故意剥离 ustar 存档的信息。

\n
    \n
  • 如果路径可以完美分割为 155 字节前缀、斜杠和 100 字节名称部分,则文件名的最大长度为 256 个 ASCII 字符。ustar 提供了额外的前缀字段来存储路径的附加组成部分,但这些字段必须在目录分隔符上分割,因此不允许文件名超过 100 字节,目录名也不能超过 155 字节。
  • \n
  • 链接目标的最大长度为 100 个字符。(即不再需要终止空字节。)
  • \n
  • 允许的文件类型:常规文件(typeflag\'\\0\'0)、目录(用 typeflag 标记5)、硬链接、符号链接、字符设备 ( 3)、块设备 ( 4)、FIFO ( 6)。(允许使用文件类型的供应商扩展名AZ
  • \n
  • 设备文件的最大编号和编号均为 2097151(八进制 7777777)。
  • \n
  • 存储用户名和组名以及 UID 和 GID。用户名和组名采用 ASCII 格式,每个名称最多 32 个字符。
  • \n
  • 文件大小限制、UID/GID 限制和时间戳限制与 v7 格式相同。
  • \n
\n

ustar 与预标准 v7 格式 \xe2\x80\x930以及5常规文件和目录的类型标志 和 存在细微的、向后不兼容的差异。在 v7 中,typeflag字段仅用于指示链接,而不指示其他文件类型。

\n

帕克斯

\n

pax 通过(可选)扩展标头块扩展了 ustar 格式,当通过旧的 tar 程序提取时,这些扩展标头看起来像常规文本文件。扩展标头在内部通过类型标志x(文件扩展标头)和g(全局扩展标头)进行标识。它们的无限扩展性还意味着 pax tarball 通常会比 ustar 更大。\n它有利于归档,但对于软件分发格式来说有点臃肿。

\n

pax 是 ustar 格式 \xe2\x80\x93 的超集,如果删除所有扩展标头,pax tarball 就与 ustar 没有什么不同。

\n

您可以阅读本文以了解可以以 pax 格式扩展的内容。但与ustar相比,总结一下:

\n
    \n
  • 文件名和路径名的长度不受限制(通过path=扩展标头中的关键字)。
  • \n
  • 链接目标的长度可以无限(linkpath=关键字)
  • \n
  • size(文件大小)、uid(用户 ID)、uname(用户名)、gid(组 ID)、gname(组名)都可以扩展到无限长度。
  • \n
  • pathlinkpathuname的UTF-8 编码gname
  • \n
  • 时间戳允许亚秒精度和可能无限的长度,但由于其格式为“自纪元以来的秒数”,仍然无法存储闰秒。秒的小数部分采用十进制。
  • \n
  • 文件访问时间 ( atime) 可以与修改时间 ( ) 一起存储mtime
  • \n
\n

注意:POSIX 不强制要求使用文件名模式来存储扩展标头,因此实现可以自由地创建他们想要的任何名称模式。例如,在 GNU tar 中,名称模式是通过--pax-option=exthdr.name=选项控制的。如果您计划制作确定性 tarball(在tar/pax实现中),请注意这一点。

\n

gnu 和 oldgnu 格式

\n

根据GNU tar手册,GNU tar是基于POSIX.1ustar标准的早期草案。但 GNU 扩展使其tarustar格式不兼容。如果你想制作一个可移植的存档,你应该避免使用 GNU tar 格式,而倾向于使用paxor ustar

\n

与 ustar 的magicversion字段相比, GNU tar 格式可以用的magic字段(8 个字节)来识别。ustar<space><space><nul>ustar<nul>00

\n

尽管如此,GNU tar 格式仍向后兼容 v7 格式。

\n
    \n
  • GNU tar 对文件名和链接目标的长度没有限制。ustar与使用前缀字段扩展路径不同,GNU tar 将长文件名存储在(非 pax)扩展头中,该头具有 typeflag L。类似地,链接目标通过带有 typeflag 的扩展标头进行扩展K
  • \n
  • GNU tar 格式将 atime(访问时间)和 ctime(状态修改时间)与 mtime 一起存储在附加头字段中,mtime 已在 v7 格式中提供。
  • \n
  • 与 ustar 相比,GNU tar 格式支持其他文件类型(参考 2):\n
      \n
    • 增量备份中的目录(“dumpdir”、typeflag D)。请参阅 GNU tar--incremental选项。
    • \n
    • 多卷存档的连续文件数据(typeflag M)。请参阅 GNU tar--multi-volume选项。
    • \n
    • 稀疏文件(typeflag S)。
    • \n
    • 卷标头 ( typeflag V),或存档卷的标签。请参阅 GNU tar--label选项。
    • \n
    \n
  • \n
  • oldgnu(GNU tar <= 1.12) 和(GNU tar >= 1.13.12) 格式之间的差异gnu对于最终用户来说很小,但根据源代码中的手册create.cNEWS,至少有两个差异: \n
      \n
    • oldgnuformat 将始终以空字节终止字符串文件名、用户名和组名。(这意味着在使用扩展标头之前,文件名最多包含 99 个字符。)
    • \n
    • GNU 1.13.12 及更高版本可以尝试通过以有符号的大端二进制数输出来“压缩” uidgidmtimedevmajordevminor字段(如果它们太大而无法在字段中以 ASCII 八进制表示) 。这会将最大 UID 和 GID 限制推至 [-2^56, 2^56-1],并将设备主设备号和次设备号推至 [-2^56, 2^56-1]。(源代码中的表示保留了一些位,以防止与 ASCII 表示发生冲突。)
    • \n
    \n
  • \n
\n

  • 闰秒与“自纪元以来的秒数”无关。 (2认同)

Sta*_*cek 7

GNU tar 手册实际上有一整节专门介绍tar 存档格式。格式ustarpax基于 POSIX 标准,并且gnu非常普遍。我会避开其他人。

我的建议是选择pax,那就是POSIX.1-2001。GNU tar 将使其成为未来的默认设置,甚至旧的ustar实现也可以解压缩它。它也是限制最少的格式。

您可以创建POSIX.1-2001归档文件,例如使用 GNU tar 通过指定--format pax或使用单独的pax 归档程序

  • 矛盾的是,通常用于 BSD 和 Linux 的 Keith Muller 的 pax(1) 实用程序实际上并不支持 POSIX-2001 `pax` 格式!同时,BSD pax(1) 确实支持 POSIX.1-1988 `ustar` 和 `cpio`,而 GNU 和 BSD tar(1) 确实支持 POSIX-2001 `pax` 格式。 (2认同)