> For AI agents: the complete documentation index is available at https://docs.vps.town/llms.txt, the full documentation bundle is available at https://docs.vps.town/llms-full.txt.

:::tip 温馨提示

本文由用户 `abc1763613206` 撰写，并已加入 `VPS.Town 优秀原创文章激励计划`，未经允许不得转载。

本文已通过 [VPS.Town 社区文章投稿及奖励规则 (试行稿)](https://docs.vps.town/kb/community.md) 格式审核，投稿内容真实性由原作者负责。

:::

:::details 📖 本文目录

[](#为什么选择-squashfs)[](#创建归档)[](#解压与管理归档)[](#列出归档内容不解压)[](#解压归档内容)[](#直接挂载)[](#在其他系统上访问)
:::

# 使用 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-tools
```

`mksquashfs` 的基本用法非常简单，你如果想快速创建一个 Squashfs 归档文件，只需要指定源目录和目标文件名即可：

```bash
# 备份 /etc 目录到 etc.squashfs
mksquashfs /etc etc.squashfs
```

通过查看 [manpage](https://manpages.debian.org/trixie/squashfs-tools/mksquashfs.1.en.html) ，我们可以知道：在 Debian 13 中如果不加任何参数，`mksquashfs` 会使用 `gzip` 进行 9 级压缩，默认分块大小为 128KB，并且保留所有文件扩展元数据。

在归档完成后，`mksquashfs` 会输出一大串信息，详细给出包括重复文件数、符号链接与硬连接数、块大小、乃至 `uid` 和 `gid` 个数等信息，十分详细：
![image-20251104003449907](/assets/images/squashfs-server-backup-guide/image-20251104003449907.png)

而对于这里的冷备份需求，我们可以牺牲一点时间来换取更高的压缩比，你可以在如上的 [manpage](https://manpages.debian.org/trixie/squashfs-tools/mksquashfs.1.en.html) 中找到更多可选参数（注意对于一些老 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](https://manpages.debian.org/trixie/squashfs-tools/unsquashfs.1.en.html) 中找到 `unsquashfs` 的使用说明，如下仅介绍一些常见的用法：

### 列出归档内容（不解压）

使用 `-l` (list) 选项：

```bash
unsquashfs -l etc.squashfs
```

它会像 `ls -R` 命令一样，递归地列出镜像中的所有文件、权限和目录结构。

![image-20251104005754057](/assets/images/squashfs-server-backup-guide/image-20251104005754057.png)

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

![image-20251104005900938](/assets/images/squashfs-server-backup-guide/image-20251104005900938.png)

你可以在后面追加路径参数，来限制只列出某个子目录下的内容，例如：

```bash
unsquashfs -ll etc.squashfs alternatives/
```

### 解压归档内容

使用 `-d` (destination) 选项指定解压目录：

```bash
mkdir ./etc_backup
unsquashfs -d ./etc_backup etc.squashfs
```

![image-20251104010210898](/assets/images/squashfs-server-backup-guide/image-20251104010210898.png)

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

```bash
unsquashfs -d ./alternatives_backup etc.squashfs alternatives/
```

![image-20251104010305910](/assets/images/squashfs-server-backup-guide/image-20251104010305910.png)

### 直接挂载

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

```bash
mkdir /mnt/etc
sudo mount -o loop etc.squashfs /mnt/etc
```

![image-20251104010457857](/assets/images/squashfs-server-backup-guide/image-20251104010457857.png)

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

![image-20251104010611062](/assets/images/squashfs-server-backup-guide/image-20251104010611062.png)

在你完成访问后，记得卸载挂载点：

```bash
sudo umount /mnt/etc
```

### 在其他系统上访问

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