切换主题
使用 SquashFS 备份与恢复服务器数据
数据无价。 在现代服务器运维中,数据备份是每一位用户的必修课。如果服务器上承载着不可复现的珍贵数据,那么即便只有万分之一的可能,您也必须为天灾、人祸、乃至「物理上云」的最坏情况做好准备。
而无论是执行备份还是服务迁移,选择一种高效的归档格式都至关重要。与使用 rsync 等工具处理海量的零散文件相比,单个归档文件在管理和传输上显然更为便捷高效。
本文将详细介绍如何使用 Squashfs 工具,来实现服务器数据的高效归档与备份。
为什么选择 Squashfs?
Squashfs 可能对于 Linux 高手来说已经并不陌生,但是对于大多数平常在用 Windows 的用户而言,当提到压缩与归档格式的时候,第一反应往往是 zip、7z 或者 zip 这一类常见格式。因此在正式开工之前,请允许我使用比较大的篇幅来介绍一下,我们为什么要选择 Squashfs 格式。
我们首先理清一下我们的需求:
- 我们想要对服务器的数据进行备份,而且在我们需要的时候原样恢复回去。
- 我们希望备份文件尽可能小,以节省存储空间和传输时间。
- 我们希望备份和恢复的过程尽可能简单高效。
- 虽然对于备份数据而言一般都是冷备份(除非真的发生故障,否则一般都不会去访问),但有时又想从里面拿出一点东西来用。
如果你认为如上需求和你的备份理念相符,那么恭喜你 —— Squashfs 很可能是一个非常适合你的选择。
Squashfs 是一款专为 Linux 设计,随 Linux 而生的只读压缩文件系统。它于 Linux 2.6.29 内核中被正式引入主线,并在 Linux 4.14 之后进一步完善成现在的样子。现在这个格式已经被广泛应用于各种 Linux 发行版的 Live CD、嵌入式系统(如 OpenWrt)以及容器镜像中。
Squashfs 之所以适合备份,有以下几个原因:
- 高压缩比:Squashfs 支持 Gzip、LZMA、LZO、LZ4、XZ 和 Zstd 等多种压缩算法,可以根据需求选择合适的压缩方式,从而在压缩率和速度之间取得平衡。除此之外,Squashfs 块级压缩的特性还方便了重复数据的去重,从而进一步提升压缩效果。
- 只读特性:作为只读文件系统(可以通过 OverlayFS 等方式来实现读写,但是对于备份数据而言超纲了),Squashfs 可以保证备份数据的一致性。而且尤其需要强调的是,Squashfs 能够做到在创建归档文件的同时完整保留文件的元数据(包括权限、时间戳、符号链接等),最大限度保持原样,这对于服务器数据的备份和恢复尤为重要。
- 随机访问:Squashfs 支持通过 mount 挂载的方式直接随机访问文件,这意味着即使在一个大型的归档文件中,也可以快速定位并提取单个文件,而不需要解压整个归档。
- 支持广泛:作为随 Linux 内核成长的文件系统,Squashfs 在 Linux 中能够做到不额外安装任何软件即可通过内核挂载读取数据,而在 Windows 等平台上,你也可以通过第三方工具(如 7-Zip 及其衍生)来访问 Squashfs 文件。
接下来我们将 Squashfs 与常见的归档格式进行对比:
tar和他的动物朋友们:tar本身属于流式归档,并不具备压缩功能。通常需要配合gzip、bzip2、xz等压缩工具使用。但是压缩后的文件格式不支持随机访问,需要解压整个归档才能访问其中的文件。7z/zip/rar:这三个都是 Windows 上非常流行的压缩格式,但是和 POSIX 系统下的 Linux 生态相比,显得相当水土不服——这些格式都无法完整保留 Linux 文件的元数据(尤其是权限和链接),这对于服务器核心数据的备份来说是不可接受的。此外,可以认为这些格式的随机访问能力和他们的数据去重能力不可兼得:标准 ZIP 格式不支持数据去重,而 7z 和 RAR 格式启用了固实压缩后就失去了随机访问能力。
创建归档
虽然 Squashfs 可以在现代 Linux 内核中直接挂载使用,但是创建 Squashfs 归档文件则需要借助 mksquashfs 工具。这个工具通常包含在 squashfs-tools 软件包中,可以通过包管理器安装:
bash
sudo apt update && sudo apt install squashfs-toolsmksquashfs 的基本用法非常简单,你如果想快速创建一个 Squashfs 归档文件,只需要指定源目录和目标文件名即可:
bash
# 备份 /etc 目录到 etc.squashfs
mksquashfs /etc etc.squashfs通过查看 manpage ,我们可以知道:在 Debian 13 中如果不加任何参数,mksquashfs 会使用 gzip 进行 9 级压缩,默认分块大小为 128KB,并且保留所有文件扩展元数据。
在归档完成后,mksquashfs 会输出一大串信息,详细给出包括重复文件数、符号链接与硬连接数、块大小、乃至 uid 和 gid 个数等信息,十分详细: 
而对于这里的冷备份需求,我们可以牺牲一点时间来换取更高的压缩比,你可以在如上的 manpage 中找到更多可选参数(注意对于一些老 Linux 版本,通常不支持使用一些比较新的压缩算法)。
通常而言,对于归档需求,我会建议换成比 gzip 压缩表现更好的 zstd 算法,把压缩比拉到最高的 22,然后把块大小调大到 mksquashfs 支持的最大值 1M(压缩表现更好,但是会牺牲一些随机读取性能),同时显性要求保留元数据,反映在命令上就是这样:
bash
mksquashfs /etc etc.squashfs -xattrs -comp zstd -Xcompression-level 22 -b 1M特别的,如果你想要排除掉目录里的某些文件或子目录,可以使用 -e 参数指定排除列表。例如,下面的命令会排除 /etc 目录下的 shadow 和 passwd 文件:
bash
mksquashfs /etc etc.squashfs -xattrs -comp zstd -Xcompression-level 22 -b 1M -e shadow passwd解压与管理归档
创建好的 Squashfs 归档文件可以通过多种方式进行解压和管理。如果你只是想要对归档文件进行管理,最常见的方法是使用 unsquashfs 工具,它同样包含在 squashfs-tools 软件包中。
你同样可以在 manpage 中找到 unsquashfs 的使用说明,如下仅介绍一些常见的用法:
列出归档内容(不解压)
使用 -l (list) 选项:
bash
unsquashfs -l etc.squashfs它会像 ls -R 命令一样,递归地列出镜像中的所有文件、权限和目录结构。

如果你想像 ls -lR 一样显示文件权限与所有者,请使用 -ll 选项:

你可以在后面追加路径参数,来限制只列出某个子目录下的内容,例如:
bash
unsquashfs -ll etc.squashfs alternatives/解压归档内容
使用 -d (destination) 选项指定解压目录:
bash
mkdir ./etc_backup
unsquashfs -d ./etc_backup etc.squashfs
你也可以只解压归档中的某个子目录或文件,例如:
bash
unsquashfs -d ./alternatives_backup etc.squashfs alternatives/
直接挂载
解压并不是 SquashFS 的主要用法。它真正的强大之处在于直接挂载,无需解压即可访问。 你可以使用 mount 命令将 Squashfs 归档文件挂载到一个目录中:
bash
mkdir /mnt/etc
sudo mount -o loop etc.squashfs /mnt/etc
现在,你可以像访问普通目录一样访问里面的文件,但所有文件都是只读的:

在你完成访问后,记得卸载挂载点:
bash
sudo umount /mnt/etc在其他系统上访问
如上所述,你可以使用 7-Zip 等第三方工具在 Windows 上访问 Squashfs 文件。他可能并没有被加入默认文件关联中,所以你需要手动打开 7-Zip,然后通过它的界面打开 Squashfs 文件进行浏览和提取。在此不再赘述。