跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 管理指南 / 常用任务 / 使用 Snapper 进行系统恢复和快照管理
适用范围 SUSE Linux Enterprise Server 15 SP6

10 使用 Snapper 进行系统恢复和快照管理

Snapper 可用于创建和管理文件系统快照。文件系统快照可用于保留文件系统在某个时间点的状态副本。Snapper 的标准设置旨在实现系统更改的回滚。但是,您也可以使用它来创建用户数据的磁盘备份。Snapper 基于 Btrfs 文件系统或者采用 XFS 或 Ext4 文件系统的精简配置 LVM 卷实现此功能。

Snapper 具有命令行界面和 YaST 界面。Snapper 可让您在以下类型的文件系统上创建和管理文件系统快照:

  • Btrfs:适用于 Linux 的“写入时复制”文件系统,其本身支持子卷的文件系统快照。(子卷是物理分区中可单独挂载的文件系统。)

    您也可以从 Btrfs 快照引导。有关详细信息,请访问 第 10.3 节 “通过从快照引导来执行系统回滚”

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

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

10.1 默认设置

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

提示
提示:在已安装系统中启用 Snapper

如果您在安装期间禁用了 Snapper,以后随时都可启用它。要执行此操作,请运行以下命令创建根文件系统的默认 Snapper 配置:

> sudo snapper -c root create-config /

之后,按第 10.1.4.1 节 “禁用/启用快照”中所述启用不同的快照类型。

要在 Btrfs 根文件系统上使用快照,需按照安装程序的建议配置包含子卷的文件系统,并提供一个大小至少为 16 GB 的分区。

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

注意
注意:快照位置

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

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

10.1.1 默认设置

大于 16 GB 的磁盘
  • 配置文件: /etc/snapper/configs/root

  • USE_SNAPPER=yes

  • TIMELINE_CREATE=no

小于 16 GB 的磁盘
  • 配置文件:未创建

  • USE_SNAPPER=no

  • TIMELINE_CREATE=yes

10.1.2 快照类型

尽管快照本身在技术方面并无区别,但我们根据触发它们的事件将其分成三类:

时间线快照

每小时创建一个快照,且旧的快照会自动删除。默认情况下,会保留过去十天、十个月或十年的首个快照。使用 YaST OS 安装方法(默认)时,将启用时间线快照(根文件系统除外)。

安装快照

每次使用 YaST 或 Zypper 安装一个或多个软件包时,会创建一对快照:一个是在安装开始前(),另一个是在安装完成后()。如果安装了内核等重要的系统组件,快照对会标记为重要 (important=yes)。旧的快照会自动删除。默认情况下,会保留最近十个重要快照和最近十个普通快照(包括管理快照)。安装快照默认为启用状态。

管理快照

每次使用 YaST 管理系统时都会创建一对快照:一个是在 YaST 模块启动之前(),另一个是在该模块关闭之后()。旧的快照会自动删除。默认情况下,会保留最近十个重要快照和最近十个普通快照(包括安装快照)。管理快照默认为启用状态。

10.1.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

第三方产品通常安装到 /opt 下。排除此目录是为了防止在回滚时卸装这些应用程序。

/srv

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

/tmp

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

/usr/local

在手动安装软件时会用到此目录。系统会将该目录排除以免在回滚时卸载这些安装的软件。

/var

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

10.1.4 自定义设置

SUSE Linux Enterprise Server 自带的默认设置经过多方面的考虑,适合多数使用情况。不过,您可以根据自己的需要对创建自动快照以及保留快照的各个方面进行配置。

10.1.4.1 禁用/启用快照

这三种快照类型(时间线、安装、管理)都可以单独启用或禁用。

禁用/启用时间线快照

启用: snapper -c root set-config "TIMELINE_CREATE=yes"

禁用: snapper -c root set-config "TIMELINE_CREATE=no"

使用 YaST OS 安装方法(默认)时,将启用时间线快照(根文件系统除外)。

禁用/启用安装快照

启用:: 安装软件包 snapper-zypp-plugin

禁用:: 卸装 snapper-zypp-plugin 软件包

安装快照默认为启用状态。

禁用/启用管理快照

启用::/etc/sysconfig/yast2 中将 USE_SNAPPER 设置为 yes

禁用::/etc/sysconfig/yast2 中将 USE_SNAPPER 设置为 no

管理快照默认为启用状态。

10.1.4.2 控制安装快照

使用 YaST 或 Zypper 安装软件包时所创建的快照会由 snapper-zypp-plugin 进行处理。何时创建快照由 XML 配置文件 /etc/snapper/zypp-plugin.conf 定义。默认情况下,该文件如下所示:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <snapper-zypp-plugin-conf>
 3  <solvables>
 4   <solvable match="w"1 important="true"2>kernel-*3</solvable>
 5   <solvable match="w" important="true">dracut</solvable>
 6   <solvable match="w" important="true">glibc</solvable>
 7   <solvable match="w" important="true">systemd*</solvable>
 8   <solvable match="w" important="true">udev</solvable>
 9   <solvable match="w">*</solvable>4
10  </solvables>
11 </snapper-zypp-plugin-conf>

1

match 属性定义软件集是 Unix 外壳风格的通配符 (w) 还是 Python 正则表达式 (re)。

2

如果与指定软件集匹配且对应的软件包标记为重要(例如内核软件包),则快照也会标记为重要。

3

用于匹配软件包名称的软件集。根据 match 属性的设置,特殊字符可能会被解析为外壳通配符或是正则表达式。此软件集匹配名称以 kernel- 开头的所有软件包。

4

此行无条件匹配所有软件包。

在这样的快照配置下,只要安装了软件包,就会创建快照对(第 9 行)。如果标记为重要的内核、dracut、glibc、systemd 或 udev 软件包已安装,快照对也会标记为重要(第 4 行到第 8 行)。所有规则都会进行评估。

要禁用某规则,可以删除该规则或通过 XML 注释的方式将其停用。举例来说,如果不希望系统在每次安装软件包时创建快照对,可以将第 9 行注释掉:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <snapper-zypp-plugin-conf>
 3  <solvables>
 4   <solvable match="w" important="true">kernel-*</solvable>
 5   <solvable match="w" important="true">dracut</solvable>
 6   <solvable match="w" important="true">glibc</solvable>
 7   <solvable match="w" important="true">systemd*</solvable>
 8   <solvable match="w" important="true">udev</solvable>
 9   <!-- <solvable match="w">*</solvable> -->
10  </solvables>
11 </snapper-zypp-plugin-conf>

10.1.4.3 创建和挂载新子卷

系统支持在 / 层次下创建新的子卷并永久挂载该卷。此类子卷会从快照中排除。切勿在现有快照中创建此类子卷,因为在回滚之后,您将无法再删除快照。

SUSE Linux Enterprise Server 上配置了 /@/ 子卷,该子卷充当永久子卷(例如 /opt/srv/home 等)的独立根目录。您创建和永久挂载的任何新子卷都需要在这个初始根文件系统中创建。

为此,请运行以下命令。在此示例中,从 /dev/sda2 创建了一个新子卷 /usr/important

> sudo mount /dev/sda2 -o subvol=@ /mnt
> sudo btrfs subvolume create /mnt/usr/important
> sudo umount /mnt

/etc/fstab 中的相应项需类似于:

/dev/sda2 /usr/important btrfs subvol=@/usr/important 0 0
提示
提示:禁用写入时复制 (cow)

子卷可能包含经常更改的文件,例如虚拟化的磁盘映像、数据库文件或日志文件。如果是这样,可考虑对此卷禁用写入时复制功能,以免复制磁盘块。可在 /etc/fstab 中使用 nodatacow 挂载选项来实现此目的:

/dev/sda2 /usr/important btrfs nodatacow,subvol=@/usr/important 0 0

或者,要为单个文件或目录禁用写入时复制功能,请使用命令 chattr +C PATH

10.1.4.4 控制快照存档

快照会占用磁盘空间。为了防止磁盘空间耗尽而导致系统中断,旧的快照会自动删除。默认情况下,将保留最多 10 个重要的安装快照与管理快照,以及最多 10 个普通的安装快照与管理快照。如果这些快照占用的空间超过根文件系统大小的 50%,则会删除其他快照。系统始终会至少保留 4 个重要快照和 2 个普通快照。

有关如何更改这些值的说明,请参考第 10.5.1 节 “管理现有配置”

10.1.4.5 在精简配置的 LVM 卷上使用快照

除了在 Btrfs 文件系统上创建快照之外,Snapper 还支持在 XFS、Ext4 或 Ext3 格式的精简配置 LVM 卷上创建快照(支持在常规 LVM 卷上创建快照)。有关 LVM 卷的详细信息和设置说明,请参考第 11.3 节 “LVM 配置”

要在精简配置的 LVM 卷上使用 Snapper,需要为其创建 Snapper 配置。在 LVM 上,需要使用 --fstype=lvm(FILESYSTEM) 指定文件系统。FILESYSTEM 的有效值为 ext3etx4xfs。示例:

> sudo snapper -c lvm create-config --fstype="lvm(xfs)" /thin_lvm

您可以按照第 10.5.1 节 “管理现有配置”中的说明根据需要调整此配置。

10.2 使用 Snapper 撤消更改

SUSE Linux Enterprise Server 上的 Snapper 预配置为充当撤消 zypper 和 YaST 所做更改的工具。要实现此功能,请对 Snapper 进行配置,让其在每次运行 zypper 和 YaST 前后创建一个快照对。您也可以使用 Snapper 来恢复被意外删除或修改的系统文件。要实现此目的,需要对根分区启用时间线快照 — 有关细节,请参见第 10.1.4.1 节 “禁用/启用快照”

默认情况下,上述的自动快照针对根分区及其子卷所配置。若希望针对 /home 等其他分区生成快照,您可以创建自定义配置。

重要
重要:撤消更改与回滚的比较

通过快照来恢复数据时,必须知道,Snapper 可以处理两种完全不同的情形:

撤消更改

在如下文中所述撤消更改时,系统会对两个快照进行比较,并撤消两个快照之间的更改。借助这种方式可以明确地选择要恢复的文件。

回滚

在如第 10.3 节 “通过从快照引导来执行系统回滚”中所述进行回滚时,系统会重置为创建快照时的状态。

撤消更改时,可以将快照与现有系统进行比较。如果比较后恢复所有发生变化的文件,那么结果会和回滚完全相同。但是,还是建议使用第 10.3 节 “通过从快照引导来执行系统回滚”中介绍的方法进行回滚,因为回滚操作的速度更快,而且您可以在进行回滚前查看系统。

警告
警告:数据一致性

在创建快照时并没有能确保数据一致性的机制。如果在创建快照的同时写入某个文件(例如数据库),将导致文件损坏或写入不完整。恢复此类文件会产生问题。此外,有些系统文件(例如 /etc/mtab)是绝对不能恢复的。因此强烈建议您要始终仔细查看已更改文件及其差异的列表。只恢复您要还原的操作真正包含的文件。

10.2.1 撤消 YaST 和 Zypper 更改

如果在安装时使用 Btrfs 设置根分区,则将自动安装 Snapper(经过预配置,可以回滚 YaST 或 Zypper 所做的更改)。每次启动 YaST 模块或 Zypper 事务时,会创建两个快照:即截获模块启动之前文件系统状态的前快照以及截获模块完成之后状态的后快照

您可以使用 YaST Snapper 模块或 snapper 命令行工具,通过从前快照恢复文件来撤消 YaST 或 Zypper 所做的更改。您也可以使用该工具比较这两张快照,以查看更改了哪些文件。您还可以显示文件的两个版本之间的差异 (diff)。

过程 10.1︰ 使用 YaST 快照程序模块撤消更改
  1. 从 YaST 中的其他部分或通过输入 yast2 snapper 来启动 Snapper 模块。

  2. 务必将当前配置设置为。除非手动添加自己的 Snapper 配置,否则请始终做此设置。

  3. 从列表中选择前后快照对。YaST 和 Zypper 快照对都属于前后类型。在说明列中,YaST 快照标为 zypp(y2base);Zypper 快照标为 zypp(zypper)

    Image
  4. 单击显示更改,会打开一个文件列表显示两张快照之间的差异。

    Image
  5. 查看文件列表。要显示文件的前后版本之间的差异,请从列表中选中该文件。

    Image
  6. 要恢复一个或多个文件,请通过勾选相应的复选框选择相关的文件或目录。单击恢复选定,然后单击以确认该操作。

    Image

    要恢复单一文件,请单击其名称以激活该文件的差异视图。单击从第一个快照恢复,然后单击予以确认。

过程 10.2︰ 使用 snapper 命令撤消更改
  1. 运行 snapper list -t pre-post,获得 YaST 与 Zypper 快照的列表。在说明列中,YaST 快照标为 yast MODULE_NAME;Zypper 快照标为 zypp(zypper)

    > sudo snapper list -t pre-post
    Pre # | Post # | Pre Date                      | Post Date                     | Description
    ------+--------+-------------------------------+-------------------------------+--------------
    311   | 312    | Tue 06 May 2018 14:05:46 CEST | Tue 06 May 2018 14:05:52 CEST | zypp(y2base)
    340   | 341    | Wed 07 May 2018 16:15:10 CEST | Wed 07 May 2018 16:15:16 CEST | zypp(zypper)
    342   | 343    | Wed 07 May 2018 16:20:38 CEST | Wed 07 May 2018 16:20:42 CEST | zypp(y2base)
    344   | 345    | Wed 07 May 2018 16:21:23 CEST | Wed 07 May 2018 16:21:24 CEST | zypp(zypper)
    346   | 347    | Wed 07 May 2018 16:41:06 CEST | Wed 07 May 2018 16:41:10 CEST | zypp(y2base)
    348   | 349    | Wed 07 May 2018 16:44:50 CEST | Wed 07 May 2018 16:44:53 CEST | zypp(y2base)
    350   | 351    | Wed 07 May 2018 16:46:27 CEST | Wed 07 May 2018 16:46:38 CEST | zypp(y2base)
  2. 使用以下命令获得快照对的已更改文件列表:snapper status PRE..POST。文件内容发生了更改会以 c 标记、添加了文件会以 + 标记、删除了文件会以 - 标记。

    > sudo snapper status 350..351
    +..... /usr/share/doc/packages/mikachan-fonts
    +..... /usr/share/doc/packages/mikachan-fonts/COPYING
    +..... /usr/share/doc/packages/mikachan-fonts/dl.html
    c..... /usr/share/fonts/truetype/fonts.dir
    c..... /usr/share/fonts/truetype/fonts.scale
    +..... /usr/share/fonts/truetype/みかちゃん-p.ttf
    +..... /usr/share/fonts/truetype/みかちゃん-pb.ttf
    +..... /usr/share/fonts/truetype/みかちゃん-ps.ttf
    +..... /usr/share/fonts/truetype/みかちゃん.ttf
    c..... /var/cache/fontconfig/7ef2298fde41cc6eeb7af42e48b7d293-x86_64.cache-4
    c..... /var/lib/rpm/Basenames
    c..... /var/lib/rpm/Dirnames
    c..... /var/lib/rpm/Group
    c..... /var/lib/rpm/Installtid
    c..... /var/lib/rpm/Name
    c..... /var/lib/rpm/Packages
    c..... /var/lib/rpm/Providename
    c..... /var/lib/rpm/Requirename
    c..... /var/lib/rpm/Sha1header
    c..... /var/lib/rpm/Sigmd5
  3. 要显示特定文件的差异,请运行 snapper diff PRE..POST FILENAME。如果不指定 FILENAME,将会显示所有文件的差异。

    > sudo snapper diff 350..351 /usr/share/fonts/truetype/fonts.scale
    --- /.snapshots/350/snapshot/usr/share/fonts/truetype/fonts.scale       2014-04-23 15:58:57.000000000 +0200
    +++ /.snapshots/351/snapshot/usr/share/fonts/truetype/fonts.scale       2014-05-07 16:46:31.000000000 +0200
    @@ -1,4 +1,4 @@
    -1174
    +1486
     ds=y:ai=0.2:luximr.ttf -b&h-luxi mono-bold-i-normal--0-0-0-0-c-0-iso10646-1
     ds=y:ai=0.2:luximr.ttf -b&h-luxi mono-bold-i-normal--0-0-0-0-c-0-iso8859-1
    [...]
  4. 要恢复一或多个文件,请运行 snapper -v undochange PRE..POST FILENAMES。如果不指定 FILENAMES,将会恢复所有已更改的文件。

    > sudo snapper -v undochange 350..351
         create:0 modify:13 delete:7
         undoing change...
         deleting /usr/share/doc/packages/mikachan-fonts
         deleting /usr/share/doc/packages/mikachan-fonts/COPYING
         deleting /usr/share/doc/packages/mikachan-fonts/dl.html
         deleting /usr/share/fonts/truetype/みかちゃん-p.ttf
         deleting /usr/share/fonts/truetype/みかちゃん-pb.ttf
         deleting /usr/share/fonts/truetype/みかちゃん-ps.ttf
         deleting /usr/share/fonts/truetype/みかちゃん.ttf
         modifying /usr/share/fonts/truetype/fonts.dir
         modifying /usr/share/fonts/truetype/fonts.scale
         modifying /var/cache/fontconfig/7ef2298fde41cc6eeb7af42e48b7d293-x86_64.cache-4
         modifying /var/lib/rpm/Basenames
         modifying /var/lib/rpm/Dirnames
         modifying /var/lib/rpm/Group
         modifying /var/lib/rpm/Installtid
         modifying /var/lib/rpm/Name
         modifying /var/lib/rpm/Packages
         modifying /var/lib/rpm/Providename
         modifying /var/lib/rpm/Requirename
         modifying /var/lib/rpm/Sha1header
         modifying /var/lib/rpm/Sigmd5
         undoing change done
警告
警告:还原用户添加操作

建议不要使用 Snapper 通过撤消更改的方式来还原用户添加。因为快照中排除了一些目录,文件系统中将保留属于用户的文件。如果使用已删除用户的 ID 创建新用户,该用户将继承原用户的文件。因此,强烈建议您使用 YaST 的用户和组管理工具来删除用户。

10.2.2 使用 Snapper 恢复文件

除了安装和管理快照之外,Snapper 还会创建时间线快照。您可以使用这些备份快照还原意外删除的文件或文件的前一个版本。您也可以使用 Snapper 的差异功能来确定在某个时间点所做的修改。

还原文件功能对于默认情况下不会生成快照的那些子卷或分区上的数据特别有用。例如,要从主目录还原文件,可以为自动生成时间线快照的 /home 创建单独的 Snapper 配置。有关说明,请参见第 10.5 节 “创建并修改 Snapper 配置”

警告
警告:恢复文件与回滚的比较

从根文件系统(由 Snapper 的根配置定义)生成的快照可用于执行系统回滚。进行此类回滚时,建议先从快照引导,然后再执行回滚。有关详细信息,请参见 第 10.3 节 “通过从快照引导来执行系统回滚”

从根文件系统快照还原所有文件(如下文中所述)也可以达到回滚的目的,但不建议这样做。您可以恢复单个文件,例如恢复 /etc 目录中的某个配置文件,但不能恢复快照中所列的全部文件。

此限制仅针对从根文件系统建立的快照。

过程 10.3︰ 使用 YaST Snapper 模块恢复文件
  1. 从 YaST 中的其他部分或通过输入 yast2 snapper 来启动 Snapper 模块。

  2. 选择要从中选择快照的当前配置

  3. 选择要用于恢复文件的时间线快照,并选择显示更改。时间线快照的类型为单一,描述为时间线

  4. 单击文件名从文本框中选择文件。系统会显示快照版本和当前系统之间的差异。勾选复选框来选中要恢复的文件。请对要恢复的所有文件执行此操作。

  5. 单击恢复选定,然后单击以确认该操作。

过程 10.4︰ 使用 snapper 命令恢复文件
  1. 运行以下命令来显示特定配置的一系列时间线快照:

    > sudo snapper -c CONFIG list -t single | grep timeline

    CONFIG 需要替换为现有的 Snapper 配置。使用 snapper list-configs 可显示列表。

  2. 运行以下命令来显示指定快照中发生更改的一系列文件:

    > sudo snapper -c CONFIG status SNAPSHOT_ID..0

    SNAPSHOT_ID 替换为您要用于恢复文件的快照的 ID。

  3. (可选)运行以下命令列出当前文件版本与快照中文件版本的差异:

    > sudo snapper -c CONFIG diff SNAPSHOT_ID..0 FILE NAME

    如果不指定 <FILE NAME>,将会显示所有文件的差异。

  4. 要恢复一个或多个文件,请运行

    > sudo snapper -c CONFIG -v undochange SNAPSHOT_ID..0 FILENAME1 FILENAME2

    如果没有指定文件名,则会恢复所有已更改的文件。

10.3 通过从快照引导来执行系统回滚

SUSE Linux Enterprise Server 上包含的 GRUB 2 版本可以从 Btrfs 快照进行引导。与 Snapper 的回滚功能相结合,就能恢复配置错误的系统。只有针对默认 Snapper 配置 (root) 创建的快照才可引导。

重要
重要:支持的配置

SUSE Linux Enterprise Server 15 SP6 开始,只有在根分区的默认子卷配置未更改过的情况下,才支持系统回滚。

引导快照时,快照中包含的文件系统部分会加载为只读状态;从快照中排除的所有其他文件系统和部分会加载为读写状态,并且可以修改。

重要
重要:撤消更改与回滚的比较

通过快照来恢复数据时,必须知道,Snapper 可以处理两种完全不同的情形:

撤消更改

在如第 10.2 节 “使用 Snapper 撤消更改”中所述撤消更改时,系统会对两个快照进行比较,并还原两个快照之间的更改。通过这种方式可以明确指定不还原所选的文件。

回滚

在如下文所述进行回滚时,系统会重置为生成快照时的状态。

要从可引导快照进行回滚,必须满足以下要求。执行默认安装时,系统会进行相应的设置。

从可引导快照执行回滚的要求
  • 根文件系统必须是 Btrfs。不支持从 LVM 卷快照引导。

  • 根文件系统需要位于单个设备上。要检查是否如此,请运行 sudo /sbin/btrfs filesystem show。它需要报告 Total devices 1。如果列出的设备多于 1 个,则不支持您的设置。

    注意
    注意:从回滚中排除的目录

    /srv 等快照中排除的目录(参见第 10.1.3 节 “从快照中排除的目录” 获取完整列表)可以位于单独的设备上。

  • 系统应能够借助安装的引导加载程序进行引导。

  • 系统只会回滚子卷 / 的内容,无法包含其他子卷。

要从可引导快照进行回滚,请执行以下操作:

  1. 引导系统。在引导菜单中选择可引导快照,然后选择要引导的快照。快照会按日期顺序从近到远一一列出。

  2. 登录系统。仔细检查是否一切运行正常。请注意,您无法对快照包含的任何目录进行写操作。写入其他目录的数据无论您下一步选择什么操作都不会丢失。

  3. 根据您是否要执行回滚,选择下一步操作:

    1. 如果您不想对当前状态的系统执行回滚,请重引导进入当前的系统状态。然后,您便可选择另一个快照,或是启动救援系统。

    2. 要执行回滚,请运行

      > sudo snapper rollback

      然后重引导。在引导屏幕上,选择默认的引导项以重引导至恢复后的系统。系统即会创建回滚前文件系统状态的快照。根的默认子卷将替换为全新的读写快照。有关详细信息,请参见第 10.3.1 节 “回滚后的快照”

      通过 -d 选项添加快照的说明非常实用。例如:

      New file system root since rollback on DATE TIME
提示
提示:回滚到特定的安装状态

如果安装期间未禁用快照,将在初始系统安装结束时创建初始可引导快照。您随时可以通过引导此快照返回到该状态。该快照可通过 after installation 说明识别。

开始对服务包或新的主要版本进行系统升级时,也会创建可引导快照(前提是未禁用快照)。

10.3.1 回滚后的快照

在执行回滚之前,将会创建正在运行的文件系统的快照。快照说明会引用在回滚中恢复的快照的 ID。

对于通过回滚创建的快照,其 Cleanup 属性的值会设为 number。因此,回滚快照会在达到设置的快照数后自动删除。有关细节,请参考第 10.7 节 “快照的自动清理”。如果快照包含重要数据,请在系统去除快照之前从快照中提取数据。

10.3.1.1 回滚快照示例

例如,在全新安装之后,系统上存在以下可用的快照:

# snapper --iso list
Type   | # |     | Cleanup | Description           | Userdata
-------+---+ ... +---------+-----------------------+--------------
single | 0 |     |         | current               |
single | 1 |     |         | first root filesystem |
single | 2 |     | number  | after installation    | important=yes

运行 sudo snapper rollback 之后,将会创建快照 3,它包含执行回滚前系统的状态。快照 4 是新的默认 Btrfs 子卷,因此是重引导之后的系统。

# snapper --iso list
Type   | # |     | Cleanup | Description           | Userdata
-------+---+ ... +---------+-----------------------+--------------
single | 0 |     |         | current               |
single | 1 |     | number  | first root filesystem |
single | 2 |     | number  | after installation    | important=yes
single | 3 |     | number  | rollback backup of #1 | important=yes
single | 4 |     |         |                       |

10.3.2 访问和识别快照引导项

要从快照引导,请重引导计算机并选择从只读的快照启动引导加载程序。一个屏幕即会打开,列出所有可引导的快照。最近的快照列在最前面,最旧的快照列在最后面。使用 导航,然后按 Enter 激活选定的快照。从引导菜单激活快照不会立即重引导计算机,而是打开选定快照的引导加载程序。

引导加载程序:快照
图 10.1︰ 引导加载程序:快照
警告
警告:目前无法使用 UEFI 从 Btrfs 快照引导 Xen

有关更多详细信息,请参见https://www.suse.com/support/kb/doc/?id=000020602

引导加载程序中的每个快照项遵循一种可方便您识别快照的命名模式:

[*]1OS2 (KERNEL3,DATE4TTIME5,DESCRIPTION6)

1

如果快照标记为 important,该项将标有 *

2

操作系统标签。

4

采用 YYYY-MM-DD 格式的日期。

5

采用 HH:MM 格式的时间。

6

此字段包含快照的说明。对于手动创建的快照,这是使用选项 --description 创建的字符串,或自定义字符串(请参见 提示:为引导加载程序快照项设置自定义说明)。对于自动创建的快照,这是调用的工具,例如 zypp(zypper)yast_sw_single。较长的说明可能会被截断,具体视引导屏幕的大小而定。

提示
提示:为引导加载程序快照项设置自定义说明

可以将快照说明字段中的默认字符串替换为自定义字符串。例如,如果自动创建的说明不能提供充分的描述,或者用户提供的说明太长,这种做法将十分有用。要为快照 NUMBER 设置自定义字符串 STRING,请使用以下命令:

> sudo snapper modify --userdata "bootloader=STRING" NUMBER

说明的长度不应超过 25 个字符,超过此大小的任何内容都无法在引导屏幕上正常显示。

10.3.3 限制

不可能实现完整的系统回滚,即将整个系统恢复到生成快照时完全相同的状态。

10.3.3.1 从快照中排除的目录

根文件系统快照并不包含所有目录。请参见第 10.1.3 节 “从快照中排除的目录”了解详情和背后的原因。正因为此,这些目录中的数据并不会恢复,也就造成了以下限制。

执行回滚后,附加产品和第三方软件可能会无法使用

如果应用程序和附加产品将一部分数据安装在从快照中排除的子卷(如 /opt)上,将另一部分数据安装在快照中包含的子卷上,那么回滚后这些应用程序和附加产品可能无法正常运行。要解决此问题,需要重新安装该应用程序或附加产品。

文件访问问题

如果某个应用程序在快照和当前系统之间更改了文件权限和/或所有权,回滚后,该应用程序可能无法访问这些文件。请在回滚后重置受影响的文件的权限和/或所有权。

不兼容的数据格式

如果服务或应用程序在快照和当前系统之间建立了新的数据格式,回滚后,该应用程序可能无法读取受影响的数据文件。

混合了代码和数据的子卷

/srv 这样的子卷可能同时包含代码和数据。回滚可能会导致代码失效。例如,降级 PHP 的版本可能会导致 Web 服务器的 PHP 脚本被破坏。

用户数据

如果回滚操作从系统中删除了用户,这些用户在快照中未包含的目录上所拥有的数据并不会删除。如果使用相同的用户 ID 创建新用户,该用户便会继承原用户的文件。请使用 find 之类的工具找到并去除孤立的文件。

10.3.3.2 不回滚引导加载程序数据

无法回滚引导加载程序,因为引导加载程序的所有阶段必须相互匹配。在进行 /boot 回滚时无法保证这一点。

10.4 在用户主目录中启用 Snapper

您可以为用户的 /home 目录启用快照,以便为以下几个用例提供支持:

  • 个人用户可以管理自己的快照和回滚。

  • 系统用户,例如要跟踪配置文件、文档等数据副本的数据库、系统和网络管理员。

  • Samba 与主目录和 Btrfs 后端进行共享。

每个用户的目录都是 /home 的 Btrfs 子卷。您可以手动设置快照(请参见第 10.4.3 节 “手动启用主目录中的快照”),但更便捷的方式是使用 pam_snapperpam_snapper 软件包用于安装 pam_snapper.so 模块和帮助程序脚本,这些模块和脚本可自动创建用户和配置 Snapper。

pam_snapper 提供与 useradd 命令、可插入身份验证模块 (PAM) 及 Snapper 的集成。默认情况下,它会在用户登录和注销时创建快照;当某些用户在很长一段时间内都处于登录状态时,它还会创建基于时间的快照。您可以使用常规 Snapper 命令和配置文件更改默认值。

10.4.1 安装 pam_snapper 和创建用户

最简单的方法是使用 Btrfs 格式的新 /home 目录且在没有现有用户的情况下开始。安装 pam_snapper:

# zypper in pam_snapper

将下面一行添加到 /etc/pam.d/common-session 中:

session optional pam_snapper.so

使用 /usr/lib/pam_snapper/pam_snapper_useradd.sh 脚本创建新用户和主目录。该脚本默认会执行试运行。请编辑脚本,将 DRYRUN=1 更改为 DRYRUN=0。现在,您便可以创建新用户:

# /usr/lib/pam_snapper/pam_snapper_useradd.sh \
username group passwd=password
Create subvolume '/home/username'
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.

用户首次登录时,/etc/skel 中的文件将会复制到其主目录。列出您的 Snapper 配置,以校验是否已创建用户的配置:

# snapper list --all
Config: home_username, subvolume: /home/username
Type   | # | Pre # | Date | User | Cleanup | Description | Userdata
-------+---+-------+------+------+---------+-------------+---------
single | 0 |       |      | root |         | current     |

一段时间过后,此输出中将会填充快照列表,用户可以使用标准 Snapper 命令对其进行管理。

10.4.2 去除用户

使用 /usr/lib/pam_snapper/pam_snapper_userdel.sh 脚本去除用户。该脚本默认会执行试运行,请编辑脚本,将 DRYRUN=1 更改为 DRYRUN=0。此操作将去除用户、用户的主子卷、Snapper 配置,并会删除所有快照。

# /usr/lib/pam_snapper/pam_snapper_userdel.sh username

10.4.3 手动启用主目录中的快照

使用 Snapper 手动设置用户主目录的步骤如下。/home 必须为 Btrfs 格式,并且目前尚未创建用户。

# btrfs subvol create /home/username
# snapper -c home_username create-config /home/username
# sed -i -e "s/ALLOW_USERS=\"\"/ALLOW_USERS=\"username\"/g" \
/etc/snapper/configs/home_username
# yast users add username=username home=/home/username password=password
# chown username.group /home/username
# chmod 755 /home/username/.snapshots

10.5 创建并修改 Snapper 配置

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

如果根文件系统足够大(大约有 12 GB),安装时将自动对根文件系统 / 启用快照。相应的默认配置命名为 root。该配置可创建和管理 YaST 及 Zypper 快照。有关默认值列表,请参见第 10.5.1.1 节 “配置数据”

注意
注意:启用快照所需的最小根文件系统大小

第 10.1 节 “默认设置”中所述,要启用快照,根文件系统中需要有额外的可用空间。所需空间取决于所安装的软件包数量以及快照中包括的卷更改量,另外还取决于快照频率和存档的快照数。

要在安装期间自动启用快照,需要满足最小根文件系统大小。目前,此大小约为 12 GB。将来,这个值可能会发生变化,具体视基础系统的体系结构和大小而定。它取决于安装媒体内 /control.xml 文件中以下标记的值:

<root_base_size>
<btrfs_increase_percentage>

该值通过下面的公式计算得出:ROOT_BASE_SIZE * (1 + BTRFS_INCREASE_PERCENTAGE/100)

请记住,此值是最小大小。请考虑分给根文件系统更多空间。一般而言,两倍于未启用快照时将使用的大小即可。

您可以为使用 Btrfs 格式化的其他分区或 Btrfs 分区上的现有子卷创建自己的配置。在以下示例中,我们将设置 Snapper 配置,用于备份挂载到 /srv/www 且格式为 Btrfs 的独立分区上存放的 Web 服务器数据。

创建配置后,您可以直接使用 snapper,也可以使用 YaST Snapper 模块,从这些快照恢复文件。在 YaST 中,您需要选择您的当前配置,同时还需要使用全局开关 -c 指定 snapper 的配置(例如 snapper -c myconfig list)。

要创建新的 Snapper 配置,请运行 snapper create-config

> sudo snapper -c www-data1 create-config /srv/www2

1

配置文件的名称。

2

要生成快照的分区或 Btrfs 子卷的挂载点。

此命令将使用合理的默认值(取自 /etc/snapper/config-templates/default)创建新的配置文件 /etc/snapper/configs/www-data。有关如何调整这些值的说明,请参考第 10.5.1 节 “管理现有配置”

提示
提示:配置默认值

新配置的默认值取自 /etc/snapper/config-templates/default。要使用自己的一组默认值,请在相同的目录中创建此文件的副本然后按照需要进行调整。要采用这种方法,请在 create-config 命令中指定 -t 选项:

> sudo snapper -c www-data create-config -t MY_DEFAULTS /srv/www

10.5.1 管理现有配置

snapper 命令有多个子命令可用于管理现有配置。您可以列出、显示这些配置,也可以对它们进行删除和修改:

列出配置

使用 snapper list-configs 子命令可以获取所有现有配置:

> sudo snapper list-configs
Config | Subvolume
-------+----------
root   | /
usr    | /usr
local  | /local
显示配置

使用 snapper -c CONFIG get-config 子命令可以显示指定的配置。请将 CONFIG 替换为 snapper list-configs 显示的配置名称之一。有关配置选项的更多信息,请参见第 10.5.1.1 节 “配置数据”

要显示默认配置,请运行:

> sudo snapper -c root get-config
修改配置

使用 snapper -c CONFIG set-config OPTION=VALUE 子命令可以修改指定配置中的选项。请将 CONFIG 替换为 snapper list-configs 显示的配置名称之一。有关 OPTIONVALUE 的可能值,请参见第 10.5.1.1 节 “配置数据”

删除配置

使用 snapper -c CONFIG delete-config 子命令可以删除配置。请将 CONFIG 替换为 snapper list-configs 显示的配置名称之一。

10.5.1.1 配置数据

每个配置都包含一系列选项,这些选项可以通过命令行进行修改。下面的列表提供了每个选项的细节。要更改某个值,请运行 snapper -c CONFIG set-config "KEY=VALUE"

ALLOW_GROUPSALLOW_USERS

授予普通用户使用快照的权限。有关更多信息,请参见第 10.5.1.2 节 “以普通用户身份使用 Snapper”

默认值为 ""

BACKGROUND_COMPARISON

定义在创建前后快照后是否应在后台对它们进行比较。

默认值为 "yes"

EMPTY_*

为前后快照相同的快照对定义清理算法。有关详细信息,请参见 第 10.7.3 节 “清理无差异的快照对”

FSTYPE

分区的文件系统类型。不更改。

默认值为 "btrfs"

NUMBER_*

定义可在安装和管理快照时使用的清理算法。有关详细信息,请参见第 10.7.1 节 “清理编号快照”

QGROUP / SPACE_LIMIT

将配额支持添加到清理算法。有关详细信息,请参见 第 10.7.5 节 “添加磁盘配额支持”

SUBVOLUME

分区或子卷生成快照的挂载点。不更改。

默认值为 "/"

SYNC_ACL

普通用户如要使用 Snapper(请参见第 10.5.1.2 节 “以普通用户身份使用 Snapper”),他们必须能访问 .snapshot 目录,并且能读取其中的文件。如果 SYNC_ACL 设置为 yes,Snapper 会通过 ACL 自动允许 ALLOW_USERS 和 ALLOW_GROUPS 项指定的用户和组访问这些目录及其中的文件。

默认值为 "no"

TIMELINE_CREATE

如果设置为 yes,便会每小时创建一个快照。有效值:yesno

默认值为 "no"

TIMELINE_CLEANUP / TIMELINE_LIMIT_*

为时间线快照定义清理算法。有关详细信息,请参见 第 10.7.2 节 “清理时间线快照”

10.5.1.2 以普通用户身份使用 Snapper

默认情况下,Snapper 只能由 root 用户使用。但在特定情况下,某些组或用户也需要创建快照或通过还原至快照来撤消更改:

  • 想要建立 /srv/www 快照的网站管理员

  • 想要为自己的主目录生成快照的用户

要实现这些目的,您可以创建用于为用户和/或组授予权限的 Snapper 配置。指定的用户必须能读取并访问相应的 .snapshots 目录。要实现这一点,最简单的方法是将 SYNC_ACL 选项设置为 yes

过程 10.5︰ 让普通用户可以使用 Snapper

此过程中的所有步骤都需要由 root 用户运行。

  1. 如果 Snapper 配置尚不存在,请为用户可在其上使用 Snapper 的分区或子卷创建一个 Snapper 配置。有关说明,请参见第 10.5 节 “创建并修改 Snapper 配置”。示例:

    > sudo snapper --config web_data create /srv/www
  2. /etc/snapper/configs/CONFIG 下创建配置文件,其中“CONFIG”是您在上一步中使用 -c/--config 指定的值(例如 /etc/snapper/configs/web_data)。根据需要进行调整。有关详细信息,请访问 第 10.5.1 节 “管理现有配置”

  3. 设置 ALLOW_USERS 和/或 ALLOW_GROUPS 的值,以分别为用户和/或组授予权限。多个条目需要使用 Space 分隔。例如,要为用户 www_admin 授予权限,可运行:

    > sudo snapper -c web_data set-config "ALLOW_USERS=www_admin" SYNC_ACL="yes"
  4. 此时,指定的用户和/或组便可以使用指定的 Snapper 配置。您可以使用 list 命令对其进行测试,例如:

    www_admin:~ > snapper -c web_data list

10.6 手动创建和管理快照

Snapper 的功能并不仅限于根据配置自动创建和管理快照;您还可以使用命令行工具或 YaST 模块手动创建快照对(前快照和后快照)或单一快照。

所有 Snapper 操作皆针对现有配置执行(有关详细信息,请参见第 10.5 节 “创建并修改 Snapper 配置”)。您可以只为存在配置的分区或卷生成快照。默认情况下使用系统配置 (root)。要为自己的配置创建或管理快照,则需要明确选择您的配置。使用 YaST 中的当前配置下拉框,或在命令行上指定 -c (snapper -c MYCONFIG COMMAND)。

10.6.1 快照元数据

每个快照均由快照本身和特定的元数据组成。创建快照时,您还需要指定元数据。修改快照就意味着更改其元数据——您无法修改其内容。使用 snapper list 可显示现有快照及其元数据:

snapper --config home list

列出配置 home 的快照。要列出默认配置 (root) 的快照,请使用 snapper -c root listsnapper list

snapper list -a

列出所有现有配置的快照。

snapper list -t pre-post

列出默认 (root) 配置的所有前快照和后快照对。

snapper list -t single

列出默认 (root) 配置的所有 single 类型的快照。

每一张快照可以使用以下元数据:

  • 类型:快照类型。有关细节,请参见第 10.6.1.1 节 “快照类型”。不能更改此数据。

  • 编号:快照的唯一编号。不能更改此数据。

  • 前快照编号:指定相应前快照的编号。仅适用于后类型。不能更改此数据。

  • 说明:快照的说明。

  • 用户数据:扩展的说明。您可使用逗号分隔的“键=值”列表格式指定自定义数据:reason=testing, project=foo。此字段也可用于将快照标记为重要 (important=yes) 以及列出创建快照的用户 (user=tux)。

  • 清理算法:快照的清理算法。有关细节,请参见第 10.7 节 “快照的自动清理”

10.6.1.1 快照类型

Snapper 能够分清三种不同类型的快照:前快照、后快照以及单一快照。从物理上讲,这三种快照没有什么不同,但 Snapper 会针对不同类型采用不同的处理方式。

pre

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

post

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

single

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

10.6.1.2 清理算法

Snapper 提供有三种清理旧快照的算法。这些算法在日常的 cron 作业中执行。您可以定义要在 Snapper 配置中保留的不同类型的快照数(有关细节,请参见第 10.5.1 节 “管理现有配置”)。

number

当达到某一快照计数时将删除旧快照。

timeline

删除超过一定时限的旧快照,但会保留若干每小时、每天、每月和每年快照。

empty-pre-post

将删除无差异的前后快照对。

10.6.2 创建快照

要创建快照,请运行 snapper create,或者在 YaST 模块 Snapper 中单击创建。以下示例解释了如何从命令行创建快照。本文档未明确介绍 Snapper 的 YaST 界面,它所提供的功能相同。

提示
提示:快照说明

为了便于日后确定快照的用途,请始终指定有意义的说明。您还可以通过 --userdata 选项指定其他信息。

snapper create --from 17 --description "with package2"

从现有的快照(由 snapper list 返回的快照编号指定)创建独立的快照(单一类型)。(这适用于 Snapper 0.8.4 和更高版本。)

snapper create --description "Snapshot for week 2 2014"

创建默认 (root) 配置的独立快照(单一类型)并附加说明。因为没有指定清理算法,将不会自动删除快照。

snapper --config home create --description "Cleanup in ~tux"

为名为 home 的自定义配置创建独立快照(单一类型)并附加说明。因为没有指定清理算法,将不会自动删除快照。

snapper --config home create --description "Daily data backup" --cleanup-algorithm timeline>

为名为 home 的自定义配置创建独立快照(单一类型)并附加说明。一旦符合为配置中的时间线清理算法指定的条件,便会自动删除快照。

snapper create --type pre --print-number --description "Before the Apache config cleanup" --userdata "important=yes"

创建 pre 类型的快照并列显快照编号。创建用于保存之前之后状态的快照对所需的首个命令。该快照标记为重要。

snapper create --type post --pre-number 30 --description "After the Apache config cleanup" --userdata "important=yes"

创建 post 类型的快照,与快照编号为 30pre 快照配对。创建用于保存之前之后状态的快照对所需的第二个命令。该快照标记为重要。

snapper create --command COMMAND --description "Before and after COMMAND"

运行 COMMAND 前后自动创建快照对。此选项仅在于命令行上使用 snapper 时可用。

10.6.3 修改快照元数据

Snapper 允许您修改说明、清理算法及快照的用户数据。其他元数据均无法更改。以下示例解释了如何从命令行修改快照。使用 YaST 界面会比较简单。

要在命令行上修改快照,您需要知道其编号。使用 snapper list 可以显示所有快照及其编号。

YaST 的 Snapper 模块已列出所有快照。从列表中选择一个快照,然后单击修改

snapper modify --cleanup-algorithm "timeline" 10

修改默认 (root) 配置的第 10 张快照的元数据。清理算法设置为 timeline

snapper --config home modify --description "daily backup" -cleanup-algorithm "timeline" 120

修改名为 home 的自定义配置的第 120 张快照的元数据。将设置新的说明并取消设置清理算法。

10.6.4 删除快照

要使用 YaST 的 Snapper 模块删除快照,请从列表中选择快照,然后单击删除

要使用命令行工具删除快照,需要知道其编号。运行 snapper list 命令可以获取该编号。要删除快照,请运行 snapper delete NUMBER

不允许删除当前的默认子卷快照。

使用 Snapper 删除快照时,在后台运行的 Btrfs 进程将会回收释放的空间。因此,可用空间的可见性与可用性会延迟。如果您希望通过删除快照释放的空间立即可供使用,请将选项 --sync 与 delete 命令使用。

提示
提示:删除快照对

每次删除 pre 快照时,也应删除与其对应的 post 快照(反之亦然)。

snapper delete 65

删除默认 (root) 配置的第 65 张快照。

snapper -c home delete 89 90

删除名为 home 的自定义配置的第 89 个和第 90 个快照。

snapper delete --sync 23

删除默认 (root) 配置的快照 23,并使释放的空间立即可用。

提示
提示:删除未参照的快照

有时,虽然 Btrfs 快照存在,但却缺少包含 Snapper 元数据的 XML 文件。这种情况表示快照对 Snapper 不可见,需要手动将其删除:

btrfs subvolume delete /.snapshots/SNAPSHOTNUMBER/snapshot
rm -rf /.snapshots/SNAPSHOTNUMBER
提示
提示:旧快照占用的磁盘空间更多

如果您要删除快照以释放硬盘上的空间,请务必先删除旧快照。快照生成的时间越长,其占用的空间就越大。

也可以通过日常的 cron 作业自动删除快照。有关细节,请参考第 10.6.1.2 节 “清理算法”

10.7 快照的自动清理

快照会占用磁盘空间,随着时间的推移,快照占用的磁盘空间可能会变得非常多。为了防止磁盘上的空间耗尽,Snapper 提供了用于自动删除旧快照的算法。这些算法根据时间线快照和编号快照(管理快照与安装快照对)而有所不同。您可以指定要为每种类型保留的快照数。

此外,您也可以选择指定一个磁盘空间配额,定义快照可占用的最大磁盘空间大小。系统还可以自动删除前快照与后快照没有任何不同的快照对。

清理算法始终绑定到单个 Snapper 配置,因此您需要为每个配置指定算法。要防止自动删除特定的快照,请参见 可以防止删除快照吗?

默认设置 (root) 配置为清理编号快照以及空的前快照与后快照对。已启用配额支持 - 快照占用的空间不可超过根分区可用磁盘空间的 50%。时间线快照默认处于禁用状态,因此,时间线清理算法也处于禁用状态。

10.7.1 清理编号快照

编号快照(管理快照与安装快照对)的清理由 Snapper 配置的以下参数控制。

NUMBER_CLEANUP

启用或禁用安装快照与管理快照对的清理。如果启用该参数,则当快照总数超过 NUMBER_LIMIT 和/或 NUMBER_LIMIT_IMPORTANT 指定的数字以及 NUMBER_MIN_AGE 指定的时限时,系统会删除快照对。有效值:yes(启用)、no(禁用)。

默认值为 "yes"

用于更改或设置值的示例命令:

> sudo snapper -c CONFIG set-config "NUMBER_CLEANUP=no"
NUMBER_LIMIT / NUMBER_LIMIT_IMPORTANT

定义要保留多少个普通和/或重要安装快照与管理快照对。如果 NUMBER_CLEANUP 设置为 "no",则会忽略此参数。

NUMBER_LIMIT 的默认值为 "2-10"NUMBER_LIMIT_IMPORTANT 的默认值为 "4-10"。该清理算法会删除超出指定最大值的快照,而不考虑快照和文件系统空间。这些算法还会删除超过最小值的快照,直到达到快照和文件系统的限制。

用于更改或设置值的示例命令:

> sudo snapper -c CONFIG set-config "NUMBER_LIMIT=10"
重要
重要:范围值与常量值的比较

如果启用配额支持(请参见第 10.7.5 节 “添加磁盘配额支持”),则需要将限制指定为一个最小值至最大值范围,例如 2-10。如果禁用配额支持,则需要提供常量值,例如 10,否则清理将会失败并显示错误。

NUMBER_MIN_AGE

定义快照在自动删除前必须保留的最小时限(以秒为单位)。保留时间小于此处指定值的快照不会删除,不管这样的快照有多少。

默认值为 "1800"

用于更改或设置值的示例命令:

> sudo snapper -c CONFIG set-config "NUMBER_MIN_AGE=864000"
注意
注意:限制和时限

系统始终会评估 NUMBER_LIMITNUMBER_LIMIT_IMPORTANTNUMBER_MIN_AGE。只有同时符合全部条件才会删除快照。

如果您希望始终保留 NUMBER_LIMIT* 所定义数量的快照,而不考虑它们的时限,可将 NUMBER_MIN_AGE 设置为 0

下面的示例显示了保留最近 10 个重要和 10 个普通快照(不论保留期限)的配置:

NUMBER_CLEANUP=yes
NUMBER_LIMIT_IMPORTANT=10
NUMBER_LIMIT=10
NUMBER_MIN_AGE=0

如果不想保留超过特定时限的快照,可将 NUMBER_LIMIT* 设置为 0,并用 NUMBER_MIN_AGE 指定时限。

下面的示例显示了只保留十天以内的快照的配置:

NUMBER_CLEANUP=yes
NUMBER_LIMIT_IMPORTANT=0
NUMBER_LIMIT=0
NUMBER_MIN_AGE=864000

10.7.2 清理时间线快照

时间线快照的清理由 Snapper 配置的以下参数控制。

TIMELINE_CLEANUP

启用或禁用时间线快照的清理。如果启用该参数,则当快照总数超过 TIMELINE_LIMIT_* 指定的数字以及 TIMELINE_MIN_AGE 指定的时限时,将删除快照。有效值:yesno

默认值为 "yes"

用于更改或设置值的示例命令:

> sudo snapper -c CONFIG set-config "TIMELINE_CLEANUP=yes"
TIMELINE_LIMIT_DAILY, TIMELINE_LIMIT_HOURLY, TIMELINE_LIMIT_MONTHLY, TIMELINE_LIMIT_WEEKLY, TIMELINE_LIMIT_YEARLY

快照保留的时长,分别以小时、天、月、周和年为单位。

每项的默认值均为 "10",但 TIMELINE_LIMIT_WEEKLY 除外,该参数默认设置为 "0"

TIMELINE_MIN_AGE

定义快照在自动删除前必须保留的最小时限(以秒为单位)。

默认值为 "1800"

例 10.1︰ 时间线配置示例
TIMELINE_CLEANUP="yes"
TIMELINE_CREATE="yes"
TIMELINE_LIMIT_DAILY="7"
TIMELINE_LIMIT_HOURLY="24"
TIMELINE_LIMIT_MONTHLY="12"
TIMELINE_LIMIT_WEEKLY="4"
TIMELINE_LIMIT_YEARLY="2"
TIMELINE_MIN_AGE="1800"

此示例配置能够实现按小时生成将自动清理的快照。TIMELINE_MIN_AGETIMELINE_LIMIT_* 始终会一起评估。在本示例中,快照删除前的最小保留时限设置为 30 分钟(1800 秒)。因为我们会每小时创建一次快照,所以确保了只会保留最近的快照。如果 TIMELINE_LIMIT_DAILY 设置为非零值,则表示还会保留当天的首张快照。

保留的快照
  • 每小时:创建的最后 24 个快照。

  • 每天:保留最近 7 天内每天创建的首个快照。

  • 每月:保留最近 12 个月内每月最后一天创建的首个快照。

  • 每周:保留最近 4 周内每周最后一天创建的首个快照。

  • 每年:保留最近 2 年内每年最后一天创建的首个快照。

10.7.3 清理无差异的快照对

第 10.1.2 节 “快照类型”中所述,每当您运行 YaST 模块或执行 Zypper 时,将在启动时创建一个前快照,在退出时创建一个后快照。如果您未进行过任何更改,则前快照与后快照没有差异。在 Snapper 配置中设置以下参数可自动删除此类快照对:

EMPTY_PRE_POST_CLEANUP

如果设置为 yes,系统会删除前后快照相同的快照对。

默认值为 "yes"

EMPTY_PRE_POST_MIN_AGE

定义前后快照相同的快照对在自动删除之前必须保留的最短时限(以秒为单位)。

默认值为 "1800"

10.7.4 清理手动创建的快照

Snapper 未针对手动创建的快照提供自定义清理算法。但是,您可以向手动创建的快照指派 number 或 timeline 清理算法。如此,该快照将加入您所指定的算法的清理队列。可以在创建快照时或通过修改现有快照来指定清理算法:

snapper create --description "Test" --cleanup-algorithm number

为默认 (root) 配置创建独立快照(单一类型)并指派 number 清理算法。

snapper modify --cleanup-algorithm "timeline" 25

使用数字 25 修改快照,并指派 timeline 清理算法。

10.7.5 添加磁盘配额支持

除了上述 number 和/或 timeline 清理算法外,Snapper 还支持配额。您可以定义允许快照占用的可用空间百分比。此百分比值始终适用于相应 Snapper 配置中定义的 Btrfs 子卷。

Btrfs 配额将应用到子卷,而非应用到用户。除了使用 Btrfs 配额之外,还可以将磁盘空间配额应用到用户和组(例如,使用 quota 命令)。

如果在安装期间启用了 Snapper,则会自动启用配额支持。如果您是在安装后的某个时间手动启用 Snapper 的,则可以通过运行 snapper setup-quota 来启用配额支持。这需要您具有有效的配置(有关详细信息,请参见第 10.5 节 “创建并修改 Snapper 配置”)。

配额支持由 Snapper 配置的以下参数控制。

QGROUP

Snapper 使用的 Btrfs 配额组。如果未设置,请运行 snapper setup-quota。如果已设置,则仅在您熟悉 man 8 btrfs-qgroup 的情况下才可对其进行更改。此值是使用 snapper setup-quota 设置的,请勿更改。

SPACE_LIMIT

允许快照使用的空间限制,以 1 (100%) 的分数表示。有效值范围为 0 到 1(0.1 = 10%,0.2 = 20%...)。

需遵守以下限制和指导原则:

  • 只能在已激活现有 number 和/或 timeline 清理算法的前提下才能激活配额。如果未激活任何清理算法,则无法应用配额限制。

  • 启用配额支持后,Snapper 将根据需要执行两轮清理。第一轮清理将应用针对编号快照和时间线快照指定的规则。仅当完成这一轮清理后超出配额时,在第二轮清理中才会应用配额特定的规则。

  • 即使启用了配额支持,Snapper 也始终会保留 NUMBER_LIMIT*TIMELINE_LIMIT* 值所指定数量的快照,而不考虑是否会超出配额。因此,建议为 NUMBER_LIMIT*TIMELINE_LIMIT* 指定范围值 (MIN-MAX),以确保配额可以生效。

    例如,如果设置了 NUMBER_LIMIT=5-20,Snapper 将执行第一轮清理,并将常规的编号快照数量减至 20 个。如果这 20 个快照超出配额,Snapper 将在第二轮清理中删除最旧的快照,直到符合配额限制。系统始终会至少保留 5 个快照,不管这些快照占用了多少空间。

10.8 显示快照使用的独占磁盘空间

快照会共享数据以有效利用存储空间,因此,使用 dudf 等普通命令无法准确度量已用的磁盘空间。想要在启用了配额的 Btrfs 上释放磁盘空间,需要知道每个快照使用的独占磁盘空间量,而不是共享的空间量。Snapper 0.6 和更高版本会在 Used Space 列中报告每个快照使用的磁盘空间:

# snapper --iso list
  # | Type   | Pre # | Date                | User | Used Space | Cleanup | Description           | Userdata     
----+--------+-------+---------------------+------+------------+---------+-----------------------+--------------
 0  | single |       |                     | root |            |         | current               |              
 1* | single |       | 2019-07-22 13:08:38 | root |  16.00 KiB |         | first root filesystem |              
 2  | single |       | 2019-07-22 14:21:05 | root |  14.23 MiB | number  | after installation    | important=yes
 3  | pre    |       | 2019-07-22 14:26:03 | root | 144.00 KiB | number  | zypp(zypper)          | important=no 
 4  | post   |     3 | 2019-07-22 14:26:04 | root | 112.00 KiB | number  |                       | important=no 
 5  | pre    |       | 2019-07-23 08:19:36 | root | 128.00 KiB | number  | zypp(zypper)          | important=no 
 6  | post   |     5 | 2019-07-23 08:19:43 | root |  80.00 KiB | number  |                       | important=no 
 7  | pre    |       | 2019-07-23 08:20:50 | root | 256.00 KiB | number  | yast sw_single        |              
 8  | pre    |       | 2019-07-23 08:23:22 | root | 112.00 KiB | number  | zypp(ruby.ruby2.5)    | important=no 
 9  | post   |     8 | 2019-07-23 08:23:35 | root |  64.00 KiB | number  |                       | important=no 
10  | post   |     7 | 2019-07-23 08:24:05 | root |  16.00 KiB | number  |                       |

btrfs 命令提供快照已使用空间的另一种视图:

# btrfs qgroup show -p /
qgroupid         rfer         excl parent  
--------         ----         ---- ------  
0/5          16.00KiB     16.00KiB ---     
[...]    
0/272         3.09GiB     14.23MiB 1/0     
0/273         3.11GiB    144.00KiB 1/0     
0/274         3.11GiB    112.00KiB 1/0     
0/275         3.11GiB    128.00KiB 1/0     
0/276         3.11GiB     80.00KiB 1/0     
0/277         3.11GiB    256.00KiB 1/0     
0/278         3.11GiB    112.00KiB 1/0     
0/279         3.12GiB     64.00KiB 1/0     
0/280         3.12GiB     16.00KiB 1/0     
1/0           3.33GiB    222.95MiB ---

qgroupid 列显示每个子卷的标识号,并指派 qgroup 级别/ID 的组合。

rfer 列显示子卷中引用的数据总量。

excl 列显示每个子卷中的独占数据。

parent 列显示子卷的父 qgroup。

最后一个项目 1/0 显示父 qgroup 的总计。在上面的示例中,如果去除所有子卷,将释放 222.95 MiB 空间。运行以下命令查看与每个子卷关联的快照:

# btrfs subvolume list -st /
ID	gen	top level	path	
--	---	---------	----	
267	298	266		@/.snapshots/1/snapshot
272	159	266		@/.snapshots/2/snapshot
273	170	266		@/.snapshots/3/snapshot
274	171	266		@/.snapshots/4/snapshot
275	287	266		@/.snapshots/5/snapshot
276	288	266		@/.snapshots/6/snapshot
277	292	266		@/.snapshots/7/snapshot
278	296	266		@/.snapshots/8/snapshot
279	297	266		@/.snapshots/9/snapshot
280	298	266		@/.snapshots/10/snapshot

将一个服务包升级到另一个服务包会导致快照占用系统子卷上的大量磁盘空间。因此对于不再需要的快照,建议手动删除。有关详细信息,请参见 第 10.6.4 节 “删除快照”

10.9 常见问题解答

问: 为何 Snapper 从不显示 /var/log/tmp 和其他目录中的更改?

因为我们将特定目录排除在了快照之外。详细的列表和具体原因请参见第 10.1.3 节 “从快照中排除的目录”。为了将路径从快照中排除,我们为该路径创建了子卷。

问: 我可以从引导加载程序引导快照吗?

可以。有关细节,请参考第 10.3 节 “通过从快照引导来执行系统回滚”

问: 可以防止删除快照吗?

目前,Snapper 尚无防止手动删除快照的功能。不过,您可以防止清理算法自动删除快照。系统不会为手动创建的快照(请参见第 10.6.2 节 “创建快照”)指派清理算法,除非您使用 --cleanup-algorithm 来指定。自动创建的快照始终会被指派 numbertimeline 算法。要从一个或多个快照去除此类指派,请执行以下操作:

  1. 列出所有可用快照:

    > sudo snapper list -a
  2. 记住您要防止删除的快照数。

  3. 运行以下命令并将数字占位符替换为您记住的数字:

    > sudo snapper modify --cleanup-algorithm "" #1 #2 #n
  4. 再次运行 snapper list -a 检查结果。在 Cleanup 列中,您修改的快照所对应的项现在应该为空。

问: 何处能获得有关 Snapper 的详细信息?

请访问 Snapper 的主页,网址为:http://snapper.io/