我想知道的是 tar 在开始将数据传递给 gzip 之前在做什么?我可以让它跳过这一步吗?
我正在编写一个脚本,在我的 Synology NAS 盒子(运行 DSM 6.2.1-23824 Update 1,tar 版本 1.28)上运行,以压缩虚拟机 HDD 映像的副本。源文件作为稀疏文件存储在 btrfs 文件系统上。我正在寻找一点压缩,最好保持稀疏性,并尽可能提高速度。
虽然我一次只处理 1 个文件,但首先使用 tar 的原因是使用它的--sparse
标志,因为 gzip 无法将文件解压缩为稀疏文件。我尝试运行的中心命令是:
GZIP=-1 nice -n 19 tar --keep-old-files --sparse -czf $destDir/$vmFolder/$file.tar.gz $file 2>>$log
然而,随着硬盘镜像的大小(从2GB到120GB),tar 启动时有很多分钟,它会以最快的速度疯狂地读取源代码,但 gzip 没有得到任何可以使用的东西。此过程持续的时间长度与源文件的大小成比例。
我尝试解决该问题的方法:
- 如果我只使用 gzip,输出会立即开始,但我会丢失稀疏信息。
如果我使用管道,如下所示,它会做同样的事情。
nice -n 19 tar --keep-old-files --sparse -cf - $file | nice -n 19 gzip --fast > $destDir/$vmFolder/$file.tar.gz 2>>$log
诚然,NAS 盒只有 Intel Atom D2700,但 tar 操作不应该是 CPU 密集型的。我可以理解 gzip 是 CPU 密集型的,这将是一个限制因素,特别是对于旧的 Atom CPU。我希望使用lz4
orlzop
但 Synology 操作系统似乎没有它们,只有 gzip、7z 和 xz。
请注意,作为脚本的一部分,它可以并行运行任意数量的命令,只要我喜欢使用这个信号量脚本作为利用 CPU 所有核心的模板,即使使用单线程 gzip。
编辑:在没有选项的情况下测试我的脚本--sparse
,但仍然使用tar
,没有这个问题,并且数据立即流向 gzip。