默认情况下使用并行 bzip2 和 gzip 的最佳方法是什么?

elm*_*cha 41 gzip tar bzip2

Bzip2 和 gzip 仅使用一个内核,尽管许多计算机具有不止一个内核。但是有像 lbzip2、pbzip2 和 pigz 这样的程序,它们使用所有可用的内核并承诺与 bzip2 和 gzip 兼容。

那么默认情况下使用这些程序的最佳方法是什么,以便tar cfa file.tar.bz2 directory使用 lbzip2/pbzip2 而不是 bzip2?我当然不想破坏任何东西。

elm*_*cha 34

您可以将 bzip2、bunzip2 和 bzcat 符号链接到 lbzip2,将 gzip、gunzip、gzcat 和 zcat 符号链接到 pigz:

sudo apt-get install lbzip2 pigz
cd /usr/local/bin
ln -s /usr/bin/lbzip2 bzip2
ln -s /usr/bin/lbzip2 bunzip2
ln -s /usr/bin/lbzip2 bzcat
ln -s /usr/bin/pigz gzip
ln -s /usr/bin/pigz gunzip
ln -s /usr/bin/pigz gzcat
ln -s /usr/bin/pigz zcat
Run Code Online (Sandbox Code Playgroud)

我选择了 lbzip2 而不是 pbzip2,因为 /usr/share/doc/lbzip2/README.gz 看起来比 /usr/share/doc/pbzip2/README.gz“更好”。此外,tar 手册谈到了 lbzip2

编辑:

包含在 Precise Pangolin 中的 pigz-2.1.6 拒绝解压缩带有未知后缀的文件(例如 initramfs-*.img)。这在 Quantal 附带的 pigz-2.2.4 中已修复。所以你可能要等到 Quantal,手动安装Quantal 包,或者先不要链接 gunzip/gzcat/zcat。

  • 这很有效,因为 /usr/local/bin/ 在大多数人的 $PATH 中出现在 /bin/ 之前。如果有东西直接调用 /bin/gunzip 或者有人在他们的 $PATH 中先有 /bin,他们就不会使用 pigz。为了使他们也可以使用此功能,您可以使用 [dpk-divert](http://www.debian-administration.org/articles/118) 并对所有二进制文件执行类似的操作 `sudo dpkg-divert --divert /bin/gunzip.orig --rename /bin/gunzip; sudo ln -s /usr/bin/pigz /bin/gunzip` 但有可能 pigz 不是 100% 兼容所有 gzip 标志,所以要小心。 (7认同)

Bas*_*ing 34

符号链接的想法非常好。
另一个可行的解决方案是别名tar

alias tar='tar --use-compress-program=pbzip2'
Run Code Online (Sandbox Code Playgroud)

或分别

alias tar='tar --use-compress-program=pigz'
Run Code Online (Sandbox Code Playgroud)

它创建了另一种默认值。


小智 14

符号链接答案确实不正确。它会将整个系统的默认 gzip(或 bzip2)替换为 pigz(或 pbzip2)。虽然并行实现与单进程版本非常相似,但命令行选项的细微差异可能会破坏依赖于这些差异的核心系统进程。

--use-compress-program选项是一个更好的选择。

第二个选项(很像别名)是设置 GNU tar 支持的 TAR_OPTIONS 环境变量:

export TAR_OPTIONS="--use-compress-program=pbzip2"
tar czf myfile.tar.bz2 mysubdir/
Run Code Online (Sandbox Code Playgroud)

  • 自 2011 年以来,我一直在使用符号链接,并且没有看到任何损坏(除了编辑中提到的情况)。如果没有发现和报告这种细微的差异,我们将永远停留在非平行版本上。如果您使用 TAR_OPTIONS="--use-compress-program=pbzip2" 似乎您无法区分 bzip2 和 gzip。 (7认同)

小智 5

一个有趣的选择是重新编译 tar 以默认使用多线程。复制自此stackoverflow 答案

用替换重新编译

如果从源代码构建 tar,则可以使用参数重新编译

--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip
Run Code Online (Sandbox Code Playgroud)

使用这些选项重新编译 tar 后,您可以检查 tar 帮助的输出:

$ tar --help | grep "lbzip2\|plzip\|pigz"
  -j, --bzip2                filter the archive through lbzip2
      --lzip                 filter the archive through plzip
  -z, --gzip, --gunzip, --ungzip   filter the archive through pigz
Run Code Online (Sandbox Code Playgroud)