Tar

功能

tar 格式的功能很简单: 将多个文件打包成一个文件。

Linux 的 tar 命令可用于打包、解包 tar 文件,也经常能看到 tar.gztar.bz 等后缀的压缩文件。 其实 tar 本身并不提供压缩功能,.tar.gz 文件是通过 tar 将多个文件打包成 .tar 文件, 再调用 gzip 命令将单个 .tar 文件压缩为 .tar.gz 。 只不过 tar 命令为了使用上的便利,提供了 -g 选项用于自动调用 gzip

文件格式

../_images/tar-format.svg

tar 是一种古老的格式, 它被设计之初,是用于将多个文件归档为单文件,从而能够写入到磁带上。 磁带并没有文件系统的概念,tar 模拟了文件系统部分功能。

tar 最小存储单元是 512 字节,内部每个文件开始的 512 字节存放文件元信息,如文件名、文件长度、权限等, tar 末尾有两个块内容存放全 0 ,标识此tar归档已经结束。

tar 中存储的文件元信息并不是统一管理,而是跟随被归档文件,所以很适合于顺序读取以及追加写入。 如果tar中存在多个同名文件,解压的时候,以最后的文件内容为准,这也让 tar 很适合作为备份的格式。

重要

实际归档的时候,如果文件名+路径大于100字符,会导致 header 中元信息存不下,出现扩展 header, 最直接的影响就是浪费了512字节,如果文件大小只有 1K,却因为文件名太长而导致有 1K 的 header,空间利用率就很低。

tar 是一种入门级的归档格式,如果有兴趣,推荐按照规范实现一个 tar 的解压缩程序。

注解

tar 格式还定义了稀疏存储模式, 特别适合于存储像 coredump 这类大部分内容都是 0 的文件。

tar + gzip

Linux 上 tar.* 的压缩方式都是将所有文件打包到单个 tar,然后使用某种算法压缩。

理论上压缩过后的文件要支持增量写入、顺序读写是比较困难的。 如果所采用的压缩算法支持增量压缩,那么压缩包就也可以支持增量写入, 但是顺序读写还是比较困难。