使用 SquashFS 来代替传统的 tar 打包归档

status
Published
type
Post
slug
replace-tar-with-squashfs-for-archiving
date
Jun 10, 2025
tags
Script
Shell
Linux
summary
文章推荐使用 SquashFS 作为现代文件打包归档的替代方案,因为它解决了传统格式(如tar.gz、zip、7z)在文件元数据保留、随机读取和增量追加方面的不足。SquashFS 是一个只读的压缩文件系统,广泛应用于 Linux LiveCD、嵌入式设备和软件打包,并提供了完整的元数据保留、原生随机读取和高压缩率等优点。

“廉颇老矣,尚能饭否”

日常管理服务器/ HomeLab 虚拟机的过程中,无论是整理文件还是备份系统,我们经常需要将一些文件打包归档。而一提到归档,最常见的莫过于 .tar.gz/.tar.xz/.zip/.7z 这些格式了。
但是这些格式在现在来说多少有些“古老”了,tar 本身就是“上古时期”为磁带机设计的工具,核心设计并不适合现代存储。 .tar.gz/.tar.xz 这类打包(tar)再压缩的格式,压缩完之后想随机读取个里面的小文件都不行,继续追加文件也做不到。而.zip/.7z 这两虽然支持随机读取了,但是它们无法完整保留文件系统的元数据(比如 文件权限、扩展属性)和硬链接,使得其在 Linux / macOS 下近似是半残废的。

登场吧,SquashFS

上面提到了一些传统的打包归档格式的不足,那么现在该用什么呢,答案是 SquashFS
最早接触到SquashFS是在学生时代折腾路由器固件时,OpenWrt 的固件文件名中就带有这个,当时只是简单的了解下。
notion image
SquashFS 是一个只读的压缩文件系统。我们平时经常接触它,只是没意识到——许多 Linux 发行版的 LiveCD、嵌入式设备(路由器固件)和软件打包(如 Snap)都在使用它。
天生为“挂载”而生,拥有如下优点:
  • 文件元数据完整保留:权限、软硬链接、扩展属性(包括 ACLs(Access Control Lists) 和 SELinux 上下文(security.selinux))都能完美保留。
  • 原生支持随机读取:可以直接挂载(mount),像操作普通硬盘一样访问其中的任意文件,无需解压整个归档。
  • 高压缩率和灵活性:支持多种压缩算法(zlib, lz4, xz, zstd),可以根据需求在压缩率和速度之间做权衡。

上手操作

两个主要命令:mksquashfsunsquashfs

创建归档

例:将 /etc 使用 zstd 最高压缩率使劲压
# 将 /etc 目录打包为 etc.squashfs # -comp zstd: 使用 zstd 算法压缩 # -Xcompression-level 22: zstd 最高压缩等级(1-22),越大压得越狠 # -b 1M: 设置块大小为 1MB,这是最大值,有助于提高压缩率 # -xattrs: 保留所有扩展属性(如 ACLs, SELinux contexts) mksquashfs /etc etc.squashfs -comp zstd -Xcompression-level 22 -b 1M -xattrs
如果图省事,直接采用默认 gzip(zlib) 算法和配置,保留除扩展属性外的所有元数据。命令可以简化为:
mksquashfs /etc etc.squashfs

读取/解压

  • 挂载(最佳方式,推荐)
# 创建挂载点 mkdir /mnt/etc # 挂载归档 sudo mount -t squashfs -o loop etc.squashfs /mnt/etc # 现在你可以像浏览普通文件夹一样访问 /mnt/etc 了 ls /mnt/etc
  • 不挂载,只查看
类似 tar -tfzcat | tar -t
unsquashfs -l etc.squashfs # 只列出特定子目录的内容 unsquashfs -l etc.squashfs /config
  • 不挂载,解压特定文件
类似 tar -xf
# 把归档里的 passwd 文件,解压到当前目录的 extracted 文件夹里 unsquashfs -f -d extracted etc.squashfs passwd
  • 不挂载,全部解压
# 会在当前目录下生成一个 squashfs-root 目录 unsquashfs etc.squashfs # ⁠-d <目录>:指定解压目标目录(替代默认的 ⁠squashfs-root)。 unsquashfs -d etc_output etc.squashfs

Windows 兼容

在 Windows 系统上,装个 7-ZipNanaZip 就可以直接打开和提取 SquashFS 文件。如果使用 WSL2,那就跟在原生 Linux 下没任何区别,直接命令 mount 就完事了。

macOS 兼容

brew install squashfs

原有 tar 包转换 SquashFS

现有的 .tar 包转换成 SquashFS 可以直接用管道命令
cat your_archive.tar | mksquashfs - your_archive.squashfs -tar

总结

对于非流式的打包归档任务,别再守着老旧的 tar 了,用SquashFS 就完事。
 

参考:TelegramTelegramKenvix喵的活动日报