本文由用户 abc1763613206 撰写,并已加入 VPS.Town 优秀原创文章激励计划,未经允许不得转载。
本文已通过 VPS.Town 社区文章投稿及奖励规则 (试行稿) 审核。
数据无价。 在现代服务器运维中,数据备份是每一位用户的必修课。如果服务器上承载着不可复现的珍贵数据,那么即便只有万分之一的可能,您也必须为天灾、人祸、乃至「物理上云」的最坏情况做好准备。
而无论是执行备份还是服务迁移,选择一种高效的归档格式都至关重要。与使用 rsync 等工具处理海量的零散文件相比,单个归档文件在管理和传输上显然更为便捷高效。
本文将详细介绍如何使用 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 与常见的归档格式进行对比:
tar 和他的动物朋友们:tar 本身属于流式归档,并不具备压缩功能。通常需要配合 gzip、bzip2、xz 等压缩工具使用。但是压缩后的文件格式不支持随机访问,需要解压整个归档才能访问其中的文件。7z / zip / rar:这三个都是 Windows 上非常流行的压缩格式,但是和 POSIX 系统下的 Linux 生态相比,显得相当水土不服——这些格式都无法完整保留 Linux 文件的元数据(尤其是权限和链接),这对于服务器核心数据的备份来说是不可接受的。此外,可以认为这些格式的随机访问能力和他们的数据去重能力不可兼得:标准 ZIP 格式不支持数据去重,而 7z 和 RAR 格式启用了固实压缩后就失去了随机访问能力。虽然 Squashfs 可以在现代 Linux 内核中直接挂载使用,但是创建 Squashfs 归档文件则需要借助 mksquashfs 工具。这个工具通常包含在 squashfs-tools 软件包中,可以通过包管理器安装:
mksquashfs 的基本用法非常简单,你如果想快速创建一个 Squashfs 归档文件,只需要指定源目录和目标文件名即可:
通过查看 manpage ,我们可以知道:在 Debian 13 中如果不加任何参数,mksquashfs 会使用 gzip 进行 9 级压缩,默认分块大小为 128KB,并且保留所有文件扩展元数据。
在归档完成后,mksquashfs 会输出一大串信息,详细给出包括重复文件数、符号链接与硬连接数、块大小、乃至 uid 和 gid 个数等信息,十分详细: 
而对于这里的冷备份需求,我们可以牺牲一点时间来换取更高的压缩比,你可以在如上的 manpage 中找到更多可选参数(注意对于一些老 Linux 版本,通常不支持使用一些比较新的压缩算法)。
通常而言,对于归档需求,我会建议换成比 gzip 压缩表现更好的 zstd 算法,把压缩比拉到最高的 22,然后把块大小调大到 mksquashfs 支持的最大值 1M(压缩表现更好,但是会牺牲一些随机读取性能),同时显性要求保留元数据,反映在命令上就是这样:
特别的,如果你想要排除掉目录里的某些文件或子目录,可以使用 -e 参数指定排除列表。例如,下面的命令会排除 /etc 目录下的 shadow 和 passwd 文件:
创建好的 Squashfs 归档文件可以通过多种方式进行解压和管理。如果你只是想要对归档文件进行管理,最常见的方法是使用 unsquashfs 工具,它同样包含在 squashfs-tools 软件包中。
你同样可以在 manpage 中找到 unsquashfs 的使用说明,如下仅介绍一些常见的用法:
使用 -l (list) 选项:
它会像 ls -R 命令一样,递归地列出镜像中的所有文件、权限和目录结构。

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

你可以在后面追加路径参数,来限制只列出某个子目录下的内容,例如:
使用 -d (destination) 选项指定解压目录:

你也可以只解压归档中的某个子目录或文件,例如:

解压并不是 SquashFS 的主要用法。它真正的强大之处在于直接挂载,无需解压即可访问。 你可以使用 mount 命令将 Squashfs 归档文件挂载到一个目录中:

现在,你可以像访问普通目录一样访问里面的文件,但所有文件都是只读的:

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