WeHack BBS
GNU/Linux上的非固实归档/压缩 - 可打印的版本

+- WeHack BBS (https://bbs.wehack.space)
+-- 版块: 计算机技术 (https://bbs.wehack.space/forum-5.html)
+--- 版块: GNU/Linux 讨论区 (https://bbs.wehack.space/forum-6.html)
+--- 主题: GNU/Linux上的非固实归档/压缩 (/thread-249.html)



GNU/Linux上的非固实归档/压缩 - nadebula - 04-24-2021

(在自由/开放的基础之上)前提:能保持文件权限(可用于系统文件备份),并且支持诸如符号链接等特性。
tar是固实归档,处理大量文件(比如TB级的数据)时不够灵活,假设需要提取个别文件,打开TB级的归档文件需要几个小时(还不考虑解压的开销),略过无关文件可能又需要几个小时。假设归档文件损坏(几率随文件大小呈非线性增长),可能会有大量文件无法正常提取。
本人之前误操作覆盖了/home/username下的某个目录的文件,需要从近期的归档(.tar.zst)中恢复被覆盖的部分文件。尽管最终成功恢复,但是耗时巨大。因此希望能有一种非固实的归档/压缩方法。当然最好是能让未来的tar支持非固实归档(即独立压缩/保存各个文件),不过这势必要求一个程序既做归档又做压缩,不太符合Unix哲学。
目前本人找到的一种替代方案是dar,配合-zlzop-1参数可以实现快速压缩,尽管lzop的压缩效率(指性价比)远远比不上zstd。


RE: GNU/Linux上的非固实归档/压缩 - vimacs - 04-24-2021

可以看一下tarlz.
https://www.nongnu.org/lzip/tarlz.html


RE: GNU/Linux上的非固实归档/压缩 - nadebula - 04-24-2021

稍后测试各种GNU/Linux主流桌面环境的归档管理器对这种非固实.tar.lz或者.tlz的支持(官方说可以向后兼容,仍有待测试),由于本人需要面向初学者进行介绍。

近年来主流GNU/Linux发行版的归档管理器有一个好处,通过包管理器安装更多压缩程序之后,可以直接支持这些压缩格式。例如,安装zstd之后可以直接在图形界面打开.tar.zst归档文件(适合于初学者)。当然,由于前述固实归档/压缩不够灵活的原因,对于较大的归档文件(例如100GB或者1TB甚至更大),上述操作会非常耗时。

另有一个问题,LZMA压缩算法的压缩率虽高但是速度是硬伤,哪怕是xz或者lzip的-0级别,其速度和zstd的中上等压缩率级别相比仍然要慢得多。不过这个问题相对次要,提取个别文件时节省的时间显然更多。不排除今后Facebook(lz4和zstd的作者来自Facebook)也推出个类似的“tarlz4”、“tarzstd”之类的程序。


RE: GNU/Linux上的非固实归档/压缩 - vimacs - 04-24-2021

squashfs也可以考虑一下,它本身就是文件系统。


RE: GNU/Linux上的非固实归档/压缩 - nadebula - 04-26-2021

squashfs应该不错,但是不知能否配合诸如zstd等快速压缩方法。
刚刚利用zstd实时压缩/解压了一批文件,压缩后的归档文件(.tar.zst)比未压缩版本(.tar)体积减小20%以上,事实上加速了备份/还原过程,因为传输的数据量减少了,而传输速度与不压缩时相当。
zstd的--fast=5参数能够实现接近于lz4的速度,不过一般--fast=1(或者只写--fast,默认为1)就已经很快了,能够用满硬盘的传输能力。


RE: GNU/Linux上的非固实归档/压缩 - shangyatsen - 05-01-2021

容器镜像上存在类似tar的随机访问的问题,go构建系统给了stargz这种解决方案。


RE: GNU/Linux上的非固实归档/压缩 - nadebula - 05-03-2021

(04-24-2021, 11:12 AM)vimacs 提到: squashfs也可以考虑一下,它本身就是文件系统。

mksquashfs -comp zstd -Xcompression-level 1

实测处理速度超200GB/小时,对于个人的/home目录,其中含有大量不可压缩文件,仍能减少10%左右的体积(别小看这10%,对于我的整个/home目录来说就是几百GB)。挂载和提取文件就不说了,zstd的解压速度相当快。由于我一般不太需要可写挂载,squashfs完全能满足备份要求。