使用 SquashFS 来代替传统的 tar 打包归档
“廉颇老矣,尚能饭否”
.tar.gz
/.tar.xz
/.zip
/.7z
这些格式了。tar
本身就是“上古时期”为磁带机设计的工具,核心设计并不适合现代存储。 .tar.gz
/.tar.xz
这类打包(tar
)再压缩的格式,压缩完之后想随机读取个里面的小文件都不行,继续追加文件也做不到。而.zip
/.7z
这两虽然支持随机读取了,但是它们无法完整保留文件系统的元数据(比如 文件权限、扩展属性)和硬链接,使得其在 Linux / macOS 下近似是半残废的。登场吧,SquashFS
SquashFS
。SquashFS
是在学生时代折腾路由器固件时,OpenWrt 的固件文件名中就带有这个,当时只是简单的了解下。
SquashFS
是一个只读的压缩文件系统。我们平时经常接触它,只是没意识到——许多 Linux 发行版的 LiveCD、嵌入式设备(路由器固件)和软件打包(如 Snap)都在使用它。- 文件元数据完整保留:权限、软硬链接、扩展属性(包括 ACLs(Access Control Lists) 和 SELinux 上下文(security.selinux))都能完美保留。
- 原生支持随机读取:可以直接挂载(mount),像操作普通硬盘一样访问其中的任意文件,无需解压整个归档。
- 高压缩率和灵活性:支持多种压缩算法(zlib, lz4, xz, zstd),可以根据需求在压缩率和速度之间做权衡。
上手操作
mksquashfs
和 unsquashfs
创建归档
# 将 /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
mksquashfs /etc etc.squashfs
读取/解压
- 挂载(最佳方式,推荐)
# 创建挂载点 mkdir /mnt/etc # 挂载归档 sudo mount -t squashfs -o loop etc.squashfs /mnt/etc # 现在你可以像浏览普通文件夹一样访问 /mnt/etc 了 ls /mnt/etc
- 不挂载,只查看
tar -tf
或 zcat | 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 兼容
SquashFS
文件。如果使用 WSL2,那就跟在原生 Linux 下没任何区别,直接命令 mount
就完事了。macOS 兼容
brew install squashfs
原有 tar 包转换 SquashFS
.tar
包转换成 SquashFS
可以直接用管道命令cat your_archive.tar | mksquashfs - your_archive.squashfs -tar
总结
tar
了,用SquashFS
就完事。

Kenvix喵的活动日报
对于非流式的归档任务,几乎没有理由使用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