tar 可以创建不同格式的存档。GNU tar、ustar、pax、v7。哪种格式最适合长期存档?这些格式之间有显著差异吗?
我会使用最佳格式进行常规备份,并且我不希望因为格式问题而提取数据。(例如,v7 从实现中消失)
答案1
答案2
v7
、ustar
和格式之间的一些技术比较pax
:
v7
POSIX.1-1988 之前的格式。
- 文件名的最大长度为 99 个字符。(100 个字节减去终止空字节。)
- 链接目标的最大长度为 99 个字符。
- 允许的文件类型:常规文件(typeflag
'\0'
)、目录、硬链接(typeflag1
)、符号链接(typeflag2
)。目录由姓名场地。参考文献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
)、目录(标有 typeflag5
)、硬链接、符号链接、字符设备(3
)、块设备(4
)、FIFO( )。(通过6
允许文件类型的供应商扩展。)A
Z
- 最大限度主要的和次要的设备文件的编号均为 2097151(八进制 7777777)。
- 存储用户和组名以及 UID 和 GID。用户和组名均采用 ASCII 格式,每个最多 32 个字符。
- 文件大小限制、UID/GID 限制和时间戳限制与 v7 格式保持相同。
ustar 与 v7 之前的格式有一些细微的、向后不兼容的差异——分别用于常规文件和目录的类型标志0
和5
。在 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
(组名),均可扩展到无限长度。path
、linkpath
和uname
的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 格式并赞成pax
或ustar
代替。
GNU tar 格式可能被识别为魔法字段(8 字节)ustar<space><space><nul>
,与 ustar 的相比魔法和版本字段ustar<nul>00
。
尽管如此,GNU tar 格式仍然向后兼容 v7 格式。
- GNU tar 的文件名和链接目标的长度不受限制。与
ustar
使用字首字段用于扩展路径,GNU tar 将长文件名存储在 (非 pax) 扩展标头中,该标头具有 typeflagL
。类似地,链接目标通过具有 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
选项。
- 增量备份中的目录(“转储目录”, typeflag
- 对于最终用户来说,
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