为什么 tar 存档格式切换到 xz 压缩以替换 bzip2 而 gzip 呢?

225 gzip history bzip2 xz

越来越多的tar存档使用xz基于 LZMA2的格式进行压缩,而不是传统的bzip2(bz2)压缩。事实上,kernel.org2013 年 12 月 27日晚发布了“再见 bzip2公告,表明内核源代码将从此时起以 tar.gz 和 tar.xz 格式发布 - 并在网站主页上发布直接提供的是在tar.xz.

是否有任何具体原因可以解释为什么会发生这种情况以及gzip在这种情况下的相关性是什么?

der*_*ert 217

对于通过 Internet 分发档案,以下事项通常是优先事项:

  1. 压缩比(即压缩器使数据有多小);
  2. 解压时间(CPU要求);
  3. 解压内存要求;和
  4. 兼容性(解压程序有多广泛)

压缩内存和 CPU 要求不是很重要,因为您可以使用大型快速机器来实现,而且您只需要做一次。

与 bzip2 相比,xz 具有更好的压缩率和更低(更好)的解压时间。然而,在通常使用的压缩设置下,它需要更多的内存来解压缩[1],并且不太普遍。Gzip 使用的内存比两者都少。

因此,同时发布了 gzip 和 xz 格式的档案,允许您选择:

  • 需要在内存非常有限(<32 MB)的机器上解压:gzip。鉴于,在谈论内核源代码时不太可能。
  • 需要解压最少可用的工具:gzip
  • 想要节省下载时间和/或带宽:xz

没有真正的因素组合可以让您选择 bzip2。所以它被逐步淘汰。

我在博客文章中查看了压缩比较。我没有试图复制结果,我怀疑其中一些已经改变了(大多数情况下,我预计xz已经有所改进,因为它是最新的。)

(在某些特定情况下,良好的 bzip2 实现可能比 xz 更可取:bzip2 可以比 xz 更好地压缩包含大量零和基因组 DNA 序列的文件。较新版本的 xz 现在具有(可选)块模式,允许数据恢复在损坏点和并行压缩以及 [理论上] 解压缩之后。以前,只有 bzip2 提供这些。[2]然而,这些都与内核分发无关)


1:在存档大小中,xz -3约为bzip -9. 然后 xz 使用更少的内存来解压缩。但是xz -9(例如,用于 Linux 内核 tarball)使用的不仅仅是bzip -9. (甚至xz -0需要更多gzip -9)。

2:F21 系统范围更改:lbzip2 作为默认的 bzip2 实现

  • @illuminÉ 在不牺牲压缩比的情况下无法提供弹性。这是一个正交问题,虽然存在像 Parchive 这样的工具,但用于分发内核的 TCP 错误处理也能完成这项工作。 (2认同)
  • @illuminÉ 容错(假设您的意思类似于 par2)通常不是通过 Internet 分发档案的问题。下载被认为足够可靠(如果它已损坏,您可以重新下载)。经常使用加密哈希和签名,它们可以检测损坏和篡改。有些压缩器可以提供更大的容错能力,但以压缩比为代价。似乎没有人认为对 HTTP 或 FTP 下载进行权衡是值得的。 (2认同)

Mar*_*rco 47

首先,这个问题与tar. Tar 只是创建一个未压缩的存档,然后在稍后应用压缩。

众所周知,与 LZMA2 和 bzip2 相比,Gzip 的速度相对较快。如果速度很重要,gzip(尤其是多线程实现pigz)通常是压缩速度和压缩比之间的良好折衷。尽管如果速度是一个问题,还有其他选择(例如 LZ4)。

但是,如果需要高压缩比,LZMA2bzip2几乎在每个方面都可以胜任。压缩速度通常较慢,但它解压得更快,并以更高的内存使用为代价提供更好的压缩率。

bzip2除了向后兼容之外,没有太多理由再使用了。此外,LZMA2 在设计时考虑了多线程,并且默认情况下许多实现使用多核 CPU(不幸的是,xz在 Linux 上还没有这样做)。这是有道理的,因为时钟速度不会再增加,但内核数量会增加。

有多线程bzip2实现(例如pbzip),但默认情况下通常不会安装它们。另请注意,与 LZMA2 相比,如果文件是使用单线程压缩的,则多线程bzip2仅在压缩时才真正得到回报,而解压缩使用单线程bzip2bzip2如果文件是使用并行bzip2版本压缩的,则并行变体只能利用多核 CPU ,但通常情况并非如此。

  • 好吧,有些焦油可以使用 `z` 选项。 (4认同)
  • @Marco我相信lbzip2允许并行解压缩文件,即使它们是用非并行实现压缩的(例如库存bzip2)。这就是为什么我使用 lbzip2 而不是 pbzip2。(自从你发表评论以来,这可能已经发生了变化。) (2认同)

小智 21

LZMA2 是一个块压缩系统,而 gzip 不是。这意味着 LZMA2 适合多线程。此外,如果存档中发生损坏,您通常可以使用 LZMA2 从后续块中恢复数据,但您不能使用 gzip 执行此操作。实际上,您会在损坏的块之后使用 gzip 丢失整个存档。使用 LZMA2 存档,您只会丢失受损坏块影响的文件。这在具有多个文件的较大档案中可能很重要。

  • 这确实是一个非常有用和重要的区别! (3认同)

Sly*_*lyx 20

简短回答: xz 在压缩比方面更有效。因此它节省了磁盘空间并优化了通过网络的传输。
您可以查看此Quick Benchmark,以便通过实际测试发现差异。