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

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

tar 可以创建不同格式的存档。GNU tar、ustar、pax、v7。哪种格式最适合长期存档?这些格式之间有显著差异吗?

我会使用最佳格式进行常规备份,并且我不希望因为格式问题而提取数据。(例如,v7 从实现中消失)

答案1

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

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

您可以创建POSIX.1-2001例如使用 GNU tar 归档,--format pax或者使用单独的pax存档器

答案2

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

v7

POSIX.1-1988 之前的格式。

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

乌斯塔尔

ustar 扩展了 v7 格式的标头块,解压后,ustar tarball 的大小与 v7 tarball 相同。没有理由偏爱 v7 格式,除非您故意删除 ustar 会存档的信息。

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

ustar 与 v7 之前的格式有一些细微的、向后不兼容的差异——分别用于常规文件和目录的类型标志05。在 v7 中類型標識用于指示的字段链接仅限,而不包括其他文件类型。

帕克斯

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

pax 是 ustar 格式的超集 – 如果删除所有扩展头,pax tarball 与 ustar 就没有任何区别了。

你可以阅读pax 格式可以扩展什么。但与 ustar 相比,总结如下:

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

注意:POSIX 不强制要求使用文件名模式来存储扩展头文件,因此实现可以自由地制定任何所需的名称模式。例如,在 GNU tar 中,名称模式通过以下方式控制--pax-option=exthdr.name=选项. 如果你打算做一个确定性 tarball(在tar/pax实施中),要小心这一点。

gnu 和 oldgnu 格式

根据GNU tar 手册,GNU tar 基于 POSIX.1ustar标准的早期草案。但 GNU 扩展tar使其与ustar格式不兼容。如果你想制作一个可移植的档案,你应该避免使用 GNU tar 格式并赞成paxustar代替。

GNU tar 格式可能被识别为魔法字段(8 字节)ustar<space><space><nul>,与 ustar 的相比魔法版本字段ustar<nul>00

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

  • GNU tar 的文件名和链接目标的长度不受限制。与ustar使用字首字段用于扩展路径,GNU tar 将长文件名存储在 (非 pax) 扩展标头中,该标头具有 typeflag L。类似地,链接目标通过具有 typeflag 的扩展标头进行扩展K
  • GNU tar 格式将 atime(访问时间)和 ctime(状态修改时间)与 mtime 一起存储在附加标头字段中,这在 v7 格式中已经可用。
  • 与 ustar 相比,GNU tar 格式支持更多文件类型(参考文献2):
    • 增量备份中的目录(“转储目录”, typeflag D)。请参阅 GNU tar--incremental选项。
    • 多卷档案的连续文件数据 (typeflag M)。请参阅 GNU tar--multi-volume选项。
    • 稀疏文件(typeflag S)。
    • 卷标头 (typeflag V),或存档卷的标签。请参阅 GNU tar--label选项。
  • 对于最终用户来说,oldgnu(GNU tar <= 1.12)和(GNU tar >= 1.13.12)格式之间的差异很小,但根据gnu手册创建.c消息从源代码来看,至少有两点区别:
    • oldgnu格式将始终以空字节终止字符串文件名、用户名和组名。(这意味着在使用扩展头之前,文件名最多有 99 个字符。)
    • GNU 1.13.12 及更高版本可以尝试“挤压”用户ID时光网开发主要未成年人字段以有符号的大端二进制数输出,如果字段太大,则无法在字段中以 ASCII 八进制表示。这会将最大 UID 和 GID 限制推至 [-2^56, 2^56-1],将设备主编号和次编号推至 [-2^56, 2^56-1]。(源代码中的表示保留了一些位,以防止与 ASCII 表示冲突。)

答案3

pax 符合 POSIX 标准...话虽如此,我仅有的使用 tar、tar+gz 和 tar+bz2

答案4

tar.gz 是相当标准的。

tar 将所有文件存档为一个文件,如 .iso,但它不会压缩这些文件。

gzip (gz) 将压缩 tar 文件。

执行此操作的 *nix 命令行是:

tar -pczf name-of-new-archive.tar.gz /path/of/the/directory

相关内容