对于非流式的归档任务,几乎没有理由使用tar打包压缩,tar.gz tar.xz tar.zst 等格式不仅不支持随机读,甚至也不像未压缩的tar一样支持追加。使用这个给上世纪的磁带机设计的格式完全没有任何好处。当然,使用 zip 7z rar也不行,因为这些格式不能完整保留文件系统的元数据,也不支持硬链接,不能用于系统备份、归档。
我个人比较推荐的做法是使用 squashfs。例如,创建最高压缩率的zstd归档算法的squashfs:
mksquashfs /etc etc.squashfs -xattrs -comp zstd -Xcompression-level 22 -b 1M

-xattrs 参数在 mksquashfs 中用于保留扩展属性,包括ACL(Access Control Lists)和SELinux 上下文(security.selinux)以及其他命名空间下的扩展属性。至于软链接、硬链接和权限属性,默认就完整保留,不需要额外参数。因此也可以简化到 mksquashfs /etc etc.squashfs 表示使用 zlib 压缩算法,默认压缩率,保留上述特殊扩展属性以外的全部元数据。-b 1M 指定块大小1M,这是squashfs的最大值。

显然,squashfs格式天生就是为挂载而生的,要读取 etc.squashfs 的文件,只需挂载它到某个目录:
sudo mount -t squashfs -o loop etc.squashfs /mnt/etc

只列出文件(等效于 tar -tf 或 zcat | tar -t):
unsquashfs -l etc.squashfs
unsquashfs -l etc.squashfs /profile.d # 列出 profile.d 文件夹

解压特定文件(等效于 tar -x 某文件):
unsquashfs -f -d extracted etc.squashfs passwd

解压整个 squashfs(不挂载):
unsquashfs etc.squashfs


对于Windows,可以使用 7zip NanaZip 等软件打开squashfs包,也可以直接在WSL2内用上述命令挂载。

EroFS就不推荐了,mkfs.erofs 目前坑比较多,用起来很复杂,不像 squashfs 安装轻松简单。

#Linux
 
 
Back to Top