Tarball 简史
tar 的全称是 Tape ARchive(磁带归档)。
上世纪 70 年代末,硬盘空间极其昂贵且容量极小。为了备份数据,工程师们使用磁带机作为存储介质。
tar 最初的设计目标不是为了"压缩"文件,而是为了"打包"。它将文件系统中的多个文件、目录及其权限信息按顺序连接起来,形成一个连续的比特流,直接写入磁带。
它最早出现在 1979 年发布的 Version 7 Unix 中,取代了更早期的 tp 实用程序。
"Tarball" 这个昵称大约在 90 年代随着 GNU/Linux 的流行而走红。
当工程师把一堆零散的文件通过 tar 命令整合成一个巨大的、单一的文件时,就像是把一堆乱七八糟的毛线缠绕成了一个毛线球。
在开源软件早期,源码分发几乎全靠 Tarball。开发者们常说:"我把 Tarball 发给你。" 这个称呼就一直用到了今天。
早期的 tar 只是单纯的堆叠文件,并不减小体积。随着算法的发展,tar 开始与其他压缩工具"联姻":
| 年代 | 组合 | 后缀 | 特点 |
|---|---|---|---|
| 80 年代 | tar + compress |
.tar.Z | 最早的压缩尝试,现已少见 |
| 90 年代 | tar + gzip |
.tar.gz / .tgz | 经典 平衡了速度与压缩比 |
| 2000s | tar + bzip2 |
.tar.bz2 | 压缩率更高,但速度较慢 |
| 现代 | tar + xz |
.tar.xz | 极高压缩率 常用于 Linux 内核分发 |
# 不同时代的打包命令对比 # 80s — compress tar cf - sources | compress > archive.tar.Z # 90s — gzip(经典组合) tar czf archive.tar.gz sources/ # 2000s — bzip2 tar cjf archive.tar.bz2 sources/ # Modern — xz tar cJf archive.tar.xz sources/ # GNU tar 自动识别(-a 参数,90s 引入) tar caf archive.tar.xz sources/
早期不同 Unix 厂商的 tar 格式略有差异。POSIX.1-1988 定义了统一的 tar 头部格式,确保了跨系统的兼容性。这份标准至今仍是 tar 格式的基石。
GNU 项目重新编写了 tar(即 gtar)。它引入了自动识别压缩格式(-a 参数)和增量备份等功能,至今仍是 Linux 发行版默认预装的版本。
Windows 世界 ZIP/RAR 更流行;云原生时代 Docker Image 用分层 tar 打包。但 Tarball 依然是 Linux 源码分发和服务器备份的工业标准,从未被真正取代。
保留元数据
完美保留 Unix/Linux 的文件权限、所有者、符号链接等关键信息,这是早期 ZIP 做不到的。
流式处理
最初为磁带设计,天然支持"流"。一边打包一边传输,一边解压一边安装。
极其稳定
40 年前的 tar 包,今天的计算机依然能打开。这种向前兼容性是技术界的奇迹。
tar 文件的结尾通常有两个连续的 512 字节全零数据块。这在早期是用来告诉磁带机:
"嘿,到头了,别再转了。"