Snapper 的基本概念
SUSE Linux Enterprise Server 16.0

Snapper 的基本概念

出版日期:2025 年 12 月 11 日
内容

本文介绍了 Snapper 的基本概念。Snapper 是用于创建和管理 Btrfs 文件系统快照的一款工具。

原因

本文概述了 Snapper、该工具支持的界面和主要用途,并介绍了 SUSE Linux Enterprise Server 中快照的默认设置。

工作量

了解 Snapper 及其默认设置最多需要 20 分钟时间。

要求
  • rootsudo 特权

  • 需要安装 Snapper。SUSE Linux Enterprise Server 上默认会提供该工具。

  • 大小至少为 16 GB 的根分区 (/)。根分区的大小因产品而异。我们强烈建议使用 50 GB 或更大空间的根分区。

注意
注意

本文是 Snapper 相关系列文章的第一篇。在后续文章中,我们将介绍常见使用情形,例如撤消更改、回滚系统、手动创建和管理快照、自动清理快照等。每篇文章都以前几篇文章介绍的知识为基础,帮助您逐步加深对 Snapper 工具的了解。

1 Btrfs 子卷和快照的基本概念

Btrfs 子卷是物理分区中可单独挂载的文件系统。Btrfs 文件系统上默认会设置子卷。Btrfs 中的快照是一种可与其他子卷共享数据的子卷。它们是使用 Btrfs 的写入时复制功能创建的,因而创建速度快,并且占用的磁盘空间极少。快照可用于捕获文件系统在特定时间的状态,并在需要时回滚到以前的某个状态。

Btrfs 子卷自身具有独立的文件和目录层次结构。与在块级别运行的 LVM 逻辑卷不同,Btrfs 子卷基于文件区块运行。快照也被视为子卷,用于容纳原始子卷的初始内容。子卷显示为目录,可以像对任何其他目录一样操作,包括将其重命名或移动。

子卷的主要用途之一是在快照中明确包含或排除。使用快照回滚系统时,需要确保在回滚期间不会丢失或重写数据(例如用户的主目录、Web 和 FTP 服务器内容或日志文件)。可以通过从快照中排除某些 Btrfs 子卷来实现此目的。有关详细信息和排除的子卷列表,请参见第 3.3 节 “从快照中排除的子卷”

2 什么是 Snapper?

Snapper 是一款可帮助您创建和管理文件系统快照的工具。文件系统快照可用于保留文件系统在某个时间点的状态副本。Snapper 可以创建和比较快照,从一个快照还原到另一个快照,并支持自动快照时间线。Snapper 从不修改快照的内容。

Snapper 的标准设置旨在实现系统更改的回滚。但是,您也可以使用它来创建用户数据的磁盘备份。Snapper 之所以具有此功能,是因为它使用了两种类型的文件系统:

  • Btrfs:适用于 Linux 的“写入时复制”文件系统,其本身支持子卷的文件系统快照。

  • 采用 XFS 或 Ext4 格式的精简配置 LVM 卷。

注意
注意

您也可以从 Btrfs 快照引导。

2.1 Snapper 有哪些功能?

Snapper 提供了命令行界面,供您创建、删除和比较快照,以及撤消在快照之间所做的更改。

您可以使用 Snapper 执行以下任务:

  • 撤消 zypper 所做的系统更改。

  • 通过先前的快照恢复文件。

  • 从快照引导以执行系统回滚。

  • 在正在运行的系统中手动创建和管理快照。

  • 自动执行快照清理。

2.2 快照类型

快照可依据两个维度进行分类:快照触发事件与快照创建时间。

基于触发事件的快照类型

尽管从技术层面看,快照本身并无差异,但可根据触发快照创建的事件,将其分为三类。

安装快照

每当安装一个或多个软件包时,会以如下方式创建快照:

  • Snapper 中始终存在快照 0 single。如 Description 列所示,该快照始终指向系统当前状态,记录的是安装过程刚结束时的系统状态。

  • 系统会自动创建根分区 (/) 的快照 1 single,并命名为 first root filesystem。此快照在第一组系统更新或配置完成后创建。

  • 系统会自动创建快照 2 single,并命名为 after installation。该快照在安装过程临近结束时创建,并标记为 important,记录的是所有初始设置完成后的系统状态。

旧的快照会自动删除。默认情况下,会保留最近 10 个重要快照和最近 10 个常规快照(包括管理快照)。安装快照默认为启用状态。要手动禁用安装快照,卸载软件包 snapper-zypp-plugin 即可。

管理快照

每当对系统进行更改时,都会创建一对快照:一个在系统更改之前(前快照)创建,另一个在系统更改之后(后快照)创建。旧的快照会自动删除。默认情况下,会保留最近 10 个重要快照和最近 10 个常规快照(包括管理快照)。管理快照默认为启用状态。

时间线快照

每小时创建一个快照。默认情况下,除根文件系统外,时间线快照均处于启用状态。时间线快照的默认创建周期为每小时、每天、每周、每月、每年。如要修改这些周期,用户必须直接修改 Snapper 的 systemd 定时器,因为 Snapper 自身无法配置该参数。旧的快照会自动删除。默认情况下,会保留过去十天、十个月或十年的首个快照。

重要
重要:安装快照与管理快照的例外情况

安装快照和管理快照不适用于事务型系统。

注意
注意

时间线快照与管理快照可分别独立启用或禁用。

基于创建时间的快照类型

在管理快照与安装快照中,Snapper 可识别三种不同类型:前快照、后快照和独立快照。这些快照在物理层面无差异,但 Snapper 对它们的处理方式不同。

pre

修改的文件系统快照。每个 pre 快照对应于一个 post 快照。例如,用于自动创建快照场景。

post

修改的文件系统快照。每个 post 快照对应于一个 pre 快照。例如,用于自动创建快照场景。

single

独立的快照。例如,用于每小时自动创建的快照。此为创建快照时的默认类型。

以下是根分区大于 16 GB 的系统刚完成全新安装后的快照列表:

# | Type   | Pre # | Date                     | User | Used Space | Cleanup | Description           | Userdata     
-----+--------+-------+--------------------------+------+------------+---------+-----------------------+--------------
0  | single |       |                          | root |            |         | current               |              
1  | single |       | Thu Mar 24 12:14:34 2022 | root |  32.44 MiB |         | first root filesystem |              
2  | single |       | Thu Mar 24 12:25:55 2022 | root | 280.40 MiB | number  | after installation    | important=yes
45 | pre    |       | Mon Apr 25 17:58:45 2022 | root |  27.52 MiB | number  | zypp(zypper)          | important=yes
46 | post   |    45 | Mon Apr 25 18:00:07 2022 | root |  39.04 MiB | number  |                       | important=yes

2.3 创建快照

创建快照时,快照与原始点都会指向文件系统中的同一个块。因此一开始时快照并不占用额外的磁盘空间。但如果修改了原始文件系统中的数据,则会复制已更改的数据块,同时将旧的数据块作为快照保留。因此,快照就将占用与已修改数据相同的空间。所以久而久之,分配给快照的空间便会不断增长。因而,从包含快照的 Btrfs 文件系统删除文件可能无法释放磁盘空间。

注意
注意:快照位置

快照始终存放在创建快照的那个分区或子卷中,而无法将快照存储到其他文件系统中。

因此,包含快照的分区需大于不包含快照的分区。确切的空间大小在很大程度上取决于要保留的快照数量以及数据修改量。按照以往经验,应为分区分配两倍于一般情况下使用的空间。为了防止磁盘上的空间耗尽,系统会自动清理旧快照。

3 Snapper 的默认设置

本章介绍 Snapper 的默认设置。

Snapper 设置为系统更改的撤消和恢复工具。默认情况下,SUSE Linux Enterprise Server 的根分区 (/) 使用 Btrfs 格式。如果根分区 (/) 足够大(约为 16 GB 以上),创建快照功能便会自动启用。默认情况下,在除 / 以外的分区上会禁用快照。

重要
重要

我们不建议在使用快照安装系统后手动激活快照。如果在安装系统后手动启用 Snapper,会导致 Snapper 采用不同于此处所述的设置。

提示
提示:检查根分区大小

根分区的大小因产品而异。要确定根分区占用的磁盘空间,请运行以下命令:

> df -h

3.1 Snapper 的默认设置

如果满足以下要求,SUSE Linux Enterprise Server 上的 Snapper 默认将在系统安装过程中自动配置:

  • 根分区大小 > 16 GB

  • 根分区文件系统为 Btrfs

Snapper 仅会为根分区创建快照,并通过子卷来排除某些目录。有关排除的子卷的列表,请参见第 3.3 节 “从快照中排除的子卷”有关快照类型、创建时间和场景的详细信息,请参见第 2.2 节 “快照类型”

为了避免根分区上的空间耗尽,Snapper 提供了自动清理快照的算法。用于时间线快照和编号快照(管理快照与安装快照对)的算法有所不同。可以根据以下条件配置清理行为:

  • 数量限制:系统可以设置为当快照达到指定数量时自动删除旧快照。

  • 期限限制:如果旧快照超过指定期限,则可以删除这些快照,同时每个时间段(每小时、每天、每月、每年)仍保留一定数量的快照。

  • Prepost 快照对:可以自动删除没有差异的 prepost 快照对。

编号快照(包括管理和安装快照对)的清理通过参数来控制,例如 NUMBER_CLEANUPNUMBER_LIMITNUMBER_LIMIT_IMPORTANTNUMBER_MIN_AGENUMBER_LIMIT 的默认值为 2-10,NUMBER_LIMIT_IMPORTANT 的默认值为 4-10,表示仅保留最新的快照。

对于时间线快照,则根据要为每种类型(每小时、每天、每周、每月、每年)保留的快照数量来执行清理。例如,过去 24 小时的快照、过去 7 天的第一个每日快照、过去 12 个月当月最后一天创建的第一个快照,等等。参数包括 TIMELINE_CLEANUPTIMELINE_MIN_AGE 和间隔参数(例如 TIMELINE_LIMIT_DAILYTIMELINE_LIMIT_HOURLY 等)。

您可以随时回滚到现有快照,只需从相应的快照引导,然后将其启用。

注意
注意:自动和手动禁用 Snapper

如果根分区空间小于 16 GB,则默认会禁用上述自动创建快照的功能。在这种情况下,您可以手动创建快照。请时刻留意可用的磁盘空间。

要在根分区足够大的情况下禁用自动创建快照的功能,请在安装过程中的分区设置步骤中手动禁用快照。

3.2 根分区上的 Snapper

当 Snapper 配置为在根分区上运行时,默认会排除每个 Btrfs 子卷。

每个分区或 Btrfs 子卷都有一个专用的配置文件用于定义 Snapper 的默认行为。这些配置文件位于 /etc/snapper/configs/ 下。

警告
警告:在已安装系统中启用 Snapper

如果您在安装期间禁用了 Snapper,可在稍后启用它。不过,在安装后启用 Snapper 会导致子卷布局和变量等方面出现变化。我们强烈建议在开始安装之前就确定系统中是否需要快照。

3.3 从快照中排除的子卷

快照的主要使用情形是将系统回滚到以前的状态。因此,对某些子卷(目录)禁用了截取快照功能。

以下列表包含从快照中排除的目录。您的系统中不一定包含以下所有目录,具体取决于您的产品和体系结构。

/boot/grub2/i386-pc/boot/grub2/x86_64-efi/boot/grub2/powerpc-ieee1275/boot/grub2/s390x-emu

不能回滚引导加载程序配置。上面列出的目录是架构专属目录。前两个目录位于 AMD64/Intel 64 计算机上,后两个目录分别位于 IBM POWER 和 IBM Z 上。

/home

如果 /home 不在独立的分区中,则会将该目录排除,以免在回滚时丢失用户创建的数据。

/opt/usr/local

手动安装第三方产品时,会使用这些目录。Snapper 会将这些目录排除,以免在回滚时卸装这些安装的内容。

/srv

包含 Web 和 FTP 服务器的数据。排除此目录是为了防止在回滚时发生数据丢失。

/tmp

包含临时文件和缓存的所有目录都会排除在快照范围之外。

/var

此目录包含许多变量文件(包括日志、暂时缓存、/var/opt 中的第三方产品),是存储虚拟机映像和数据库的默认位置。因此,创建此子卷是为了从快照中排除所有这些变量数据,且已对此子卷禁用“写入时复制”。

/run

此目录包含应用程序运行时数据,并会从快照中排除,以缩减快照的大小并避免包含潜在的敏感信息。

提示
提示

子卷列表因产品而异。要了解 / 下创建了哪些子卷,从而确定从默认快照行为中排除了哪些目录,请运行以下命令:

> sudo btrfs subvolume list /
注意
注意:为什么会存在空间限制?

创建快照时,不会创建物理数据副本。快照仅包含指向相应数据块的指针。只要快照与当前系统保持一致,便几乎不会占用任何额外的磁盘空间(它包含的元数据除外)。但是,如果系统上有文件被修改,原始数据将记录在快照中。随着时间的推移,会累积更多更改,并且快照不再与实时系统保持一致,快照的大小就会相应地增加。

为防止磁盘被塞满(因此导致系统无法运行),我们建议使用最小的根文件系统大小。所需的大小取决于系统使用情况:

  • 快照的创建频率

  • 快照保留的时长

  • 系统上更改发生的速率

总而言之,快照越多,它们的保留时间越长,系统更改地越频繁,根分区就需要越多的空间。

4 更多信息

有关 Btrfs 文件系统的详细信息,请访问 https://documentation.suse.com/sles/15-SP5/html/SLES-all/cha-filesystems.html#sec-filesystems-major-btrfshttps://wiki.archlinux.org/title/btrfs

有关 LVM 卷的详细信息,请访问 https://documentation.suse.com/sles/15-SP5/html/SLES-all/part-lvm.html