跳转到内容跳转到页面导航:上一页 [访问键 p]/下一页 [访问键 n]
适用于 openSUSE Leap 15.6

3 使用 Snapper 进行系统恢复和快照管理 编辑源文件

摘要

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

Snapper 具有命令行界面和 YaST 界面。Snapper 允许您创建和管理以下文件系统类型的快照

  • Btrfs,一种针对 Linux 的写时复制文件系统,它原生支持子卷的文件系统快照。(子卷是物理分区内的可单独挂载的文件系统。)

    您还可以从 Btrfs 快照启动。有关更多信息,请参阅 第 3.3 节,“通过从快照启动进行系统回滚”

  • 使用 XFS 或 Ext4 格式化的稀疏 LVM 卷。

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

3.1 默认设置 编辑源文件

openSUSE Leap 上,Snapper 被设置为用于系统更改的撤消和恢复工具。默认情况下,openSUSE Leap 的根分区 (/) 采用 Btrfs 格式。如果根分区 (/) 足够大(大于大约 16 GB),则会自动启用快照。默认情况下,快照在除 / 以外的其他分区上被禁用。

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

如果您在安装期间禁用了 Snapper,则可以稍后随时启用它。为此,通过运行以下命令为根文件系统创建一个默认的 Snapper 配置

> sudo snapper -c root create-config /

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

在 Btrfs 根文件系统上,快照需要一个配置为安装程序建议的子卷的文件系统,以及至少 16 GB 的分区大小。

创建快照时,快照和原始数据都指向文件系统中的相同块。因此,最初快照不会占用额外的磁盘空间。如果原始文件系统中的数据被修改,则更改的数据块将被复制,而旧的数据块将保留用于快照。因此,快照占用的空间与修改的数据量相同。因此,随着时间的推移,快照分配的空间不断增长。因此,从包含快照的 Btrfs 文件系统中删除文件可能 不会 释放磁盘空间。

Note
注意:快照位置

快照始终位于拍摄快照的分区或子卷上。无法将快照存储在不同的分区或子卷上。

因此,包含快照的分区需要大于不包含快照的分区。确切的量取决于您保留的快照数量和数据修改量。作为经验法则,为分区提供比平时多两倍的空间。为了防止磁盘空间不足,旧快照会自动清理。有关详细信息,请参阅 第 3.1.4.4 节,“控制快照归档”

3.1.1 默认设置 编辑源文件

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

  • USE_SNAPPER=yes

  • TIMELINE_CREATE=no

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

  • USE_SNAPPER=no

  • TIMELINE_CREATE=yes

3.1.2 快照类型 编辑源文件

虽然快照本身在技术上没有区别,但我们根据触发它们的事件来区分三种类型的快照

时间线快照

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

安装快照

每当使用 YaST 或 Zypper 安装一个或多个软件包时,都会创建一个快照对:一个在安装开始之前(“Pre”)和一个在安装完成后(“Post”)。如果安装了重要的系统组件(例如内核),则快照对将被标记为重要 (important=yes)。旧快照会自动删除。默认情况下,保留最后十个重要的快照和最后十个“常规”(包括管理快照)快照。安装快照默认启用。

管理快照

每当您使用 YaST 管理系统时,都会创建一个快照对:一个在 YaST 模块启动时(“Pre”)和一个在模块关闭时(“Post”)。旧快照会自动删除。默认情况下,保留最后十个重要的快照和最后十个“常规”快照(包括安装快照)。管理快照默认启用。

3.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 中的第三方产品以及虚拟机和数据库的默认位置。因此,此子卷被创建以将所有这些变量数据排除在快照之外,并且禁用了 Copy-On-Write。

3.1.4 自定义设置 编辑源文件

openSUSE Leap 具有合理的默认设置,对于大多数用例应该足够。但是,可以根据您的需要配置自动拍摄快照和快照保留的所有方面。

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

管理快照默认启用。

3.1.4.2 控制安装快照 编辑源文件

通过 snapper-zypp-plugin 处理使用 YaST 或 Zypper 安装软件包时拍摄快照对。一个 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 shell 样式的通配符 (w) 还是 Python 正则表达式 (re)。

2

如果给定的模式匹配并且相应的软件包被标记为重要(例如,内核软件包),则快照对也标记为重要。

3

模式以匹配软件包名称。根据 match 属性的设置,特殊字符将被解释为 shell 通配符或正则表达式。此模式匹配所有以 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>

3.1.4.3 创建和挂载新的子卷 编辑源文件

支持在 / 层次结构下创建新的子卷并永久挂载它。这样的子卷将从快照中排除。您需要确保不在现有的快照中创建它,因为在回滚后您将无法再删除快照。

openSUSE Leap 配置了 /@/ 子卷,它充当永久子卷(例如 /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
Tip
提示:禁用写时复制 (cow)

一个子卷可能包含不断更改的文件,例如虚拟磁盘镜像、数据库文件或日志文件。如果是这样,请考虑为此卷禁用写时复制功能,以避免磁盘块的重复。使用 nodatacow 挂载选项在 /etc/fstab 中执行此操作

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

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

3.1.4.4 控制快照归档 编辑源文件

快照会占用磁盘空间。为了防止磁盘空间耗尽从而导致系统宕机,旧快照会被自动删除。默认情况下,最多保留十个重要的安装和管理快照和十个常规的安装和管理快照。如果这些快照占用根文件系统大小的 50% 以上,则会删除额外的快照。始终保留至少四个重要快照和两个常规快照。

有关如何更改这些值,请参阅 第 3.5.1 节,“管理现有配置”

3.1.4.5 在稀疏配置的 LVM 卷上使用 Snapper 编辑源文件

除了在 Btrfs 文件系统上的快照外,Snapper 还支持在稀疏配置的 LVM 卷上创建快照(不支持在常规 LVM 卷上的快照),这些卷的格式为 XFS、Ext4 或 Ext3。有关 LVM 卷的更多信息和设置说明,请参阅 第 5.3 节,“LVM 配置”

要在稀疏配置的 LVM 卷上使用 Snapper,需要为其创建一个 Snapper 配置。在 LVM 上,需要使用 --fstype=lvm(FILESYSTEM) 指定文件系统。 ext3etx4xfsFILESYSTEM 的有效值。例如

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

您可以根据需要调整此配置,如 第 3.5.1 节,“管理现有配置” 中所述。

3.2 使用 Snapper 撤销更改 编辑源文件

openSUSE Leap 上,Snapper 预配置为一种工具,可让您撤销由 zypper 和 YaST 制作的更改。为此,Snapper 配置为在每次运行 zypper 和 YaST 时创建一对快照。Snapper 还允许您恢复意外删除或修改的系统文件。为此,需要启用根分区的时间线快照——请参阅 第 3.1.4.1 节,“禁用/启用快照” 以获取详细信息。

默认情况下,如上所述的自动快照配置为根分区及其子卷。要使其他分区(例如 /home)上的快照可用,可以创建自定义配置。

Important
重要提示:撤销更改与回滚

在使用快照恢复数据时,重要的是要知道 Snapper 可以处理两种根本不同的场景

撤销更改

在撤销更改(如下所述)时,正在比较两个快照,并且这两个快照之间的更改将被撤销。使用此方法还可以显式选择要恢复的文件。

回滚

在执行回滚(如 第 3.3 节,“从快照启动系统进行回滚” 中所述)时,系统将重置为创建快照时的状态。

在撤销更改时,也可以将快照与当前系统进行比较。在从这种比较中恢复 *所有* 文件时,这将产生与执行回滚相同的结果。但是,应优先使用 第 3.3 节,“从快照启动系统进行回滚” 中描述的方法进行回滚,因为它速度更快,并且允许您在执行回滚之前查看系统。

Warning
警告:数据一致性

在创建快照时,没有机制来确保数据一致性。每当文件(例如数据库)在创建快照的同时被写入时,将导致文件损坏或部分写入。恢复此类文件会导致问题。此外,某些系统文件(例如 /etc/mtab)绝不能恢复。因此,强烈建议 *始终* 仔细查看已更改文件的列表及其差异。仅恢复真正属于您想要撤销的操作的文件。

3.2.1 撤销 YaST 和 Zypper 更改 编辑源文件

如果在安装期间使用 Btrfs 设置了根分区,则 Snapper(预配置为回滚 YaST 或 Zypper 更改)将自动安装。每次启动 YaST 模块或 Zypper 事务时,都会创建两个快照:一个“预快照”捕获文件系统在模块启动之前的状态,另一个“后快照”在模块完成后捕获。

使用 YaST Snapper 模块或 snapper 命令行工具,可以通过从“预快照”恢复文件来撤销 YaST/Zypper 制作的更改。比较两个快照,该工具还允许您查看哪些文件已被更改。您还可以显示文件的两个版本之间的差异(diff)。

过程 3.1:使用 YaST Snapper 模块撤销更改
  1. 从 YaST 的“杂项”部分或通过输入 yast2 snapper 启动“Snapper”模块。

  2. 确保“当前配置”设置为“root”。除非您手动添加了自己的 Snapper 配置,否则始终如此。

  3. 从列表中选择一对预快照和后快照。YaST 和 Zypper 快照对的类型都是“预 & 后”。YaST 快照在“描述”列中标记为 zypp(y2base);Zypper 快照标记为 zypp(zypper)

  4. 单击“显示更改”以打开不同于两个快照的文件列表。

  5. 查看文件列表。要显示文件预版本和后版本之间的“diff”,请从列表中选择它。

  6. 要恢复一个或多个文件,请通过激活相应的复选框选择相关文件或目录。单击“恢复所选”并单击“是”确认该操作。

    要恢复单个文件,请通过单击其名称激活其 diff 视图。单击“从第一个恢复”并使用“是”确认您的选择。

过程 3.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. 要显示特定文件的 diff,请运行 snapper diff PRE..POST FILENAME。如果您未指定 FILENAME,将显示所有文件的 diff。

    > 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
Warning
警告:撤销用户添加

不建议通过使用 Snapper 撤销更改来撤销用户添加。由于某些目录从快照中排除,属于这些用户的的文件将保留在文件系统中。如果创建了与已删除用户具有相同用户 ID 的用户,则该用户将继承这些文件。因此,强烈建议使用 YaST“用户和组管理”工具来删除用户。

3.2.2 使用 Snapper 恢复文件 编辑源文件

除了安装和管理快照外,Snapper 还会创建时间线快照。您可以使用这些备份快照来恢复意外删除的文件或恢复文件的先前版本。通过使用 Snapper 的 diff 功能,您还可以确定在特定时间点进行了哪些修改。

能够恢复文件对于驻留在子卷或默认情况下不进行快照的分区上的数据尤其重要。要能够从主目录恢复文件,例如,为 /home 创建一个执行自动时间线快照的单独 Snapper 配置。有关说明,请参阅 第 3.5 节,“创建和修改 Snapper 配置”

Warning
警告:恢复文件与回滚

从根文件系统(由 Snapper 的根配置定义)拍摄的快照可用于执行系统回滚。执行此类回滚的推荐方法是从快照启动然后执行回滚。有关详细信息,请参阅 第 3.3 节,“从快照启动系统进行回滚”

也可以通过按照如下所述恢复根文件系统快照中的所有文件来执行回滚。但是,不建议这样做。您可以恢复单个文件,例如 /etc 目录中的配置文件,但不能恢复快照中的完整文件列表。

此限制仅适用于从根文件系统拍摄的快照。

过程 3.3:使用 YaST Snapper 模块恢复文件
  1. 从 YaST 的“杂项”部分或通过输入 yast2 snapper 启动“Snapper”模块。

  2. 选择要选择快照的“当前配置”。

  3. 选择要恢复文件的快照时间线,然后选择“显示更改”。时间线快照的类型为“单个”,描述值为“时间线”。

  4. 通过单击文件名从文本框中选择一个文件。显示快照版本与当前系统之间的差异。激活复选框以选择要恢复的文件。对您想要恢复的所有文件执行此操作。

  5. 单击“恢复所选”并单击“是”确认该操作。

过程 3.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

    如果您未指定文件名,将恢复所有更改的文件。

3.3 从快照启动系统进行回滚 编辑源文件

包含在 openSUSE Leap 中的 GRUB 2 版本可以从 Btrfs 快照启动。结合 Snapper 的回滚功能,这使得恢复配置错误的系统成为可能。只有为默认 Snapper 配置(root)创建的快照才能启动。

Important
重要提示:支持的配置

截至 openSUSE Leap 15.6,只有在根分区的默认子卷配置未更改的情况下才支持系统回滚。

在启动快照时,快照中包含的文件系统部分以只读方式挂载;所有其他文件系统和从快照中排除的部分以读写方式挂载,可以对其进行修改。

Important
重要提示:撤销更改与回滚

在使用快照恢复数据时,重要的是要知道 Snapper 可以处理两种根本不同的场景

撤销更改

第 3.2 节,“使用 Snapper 撤销更改” 中所述,在撤销更改时,正在比较两个快照,并且这两个快照之间的更改将被撤销。使用此方法还可以显式排除选定的文件不被恢复。

回滚

在执行以下所述的回滚时,系统将重置为创建快照时的状态。

要从可启动快照进行回滚,必须满足以下要求。在执行默认安装时,系统将相应设置。

从可启动快照回滚的要求
  • 根文件系统需要是 Btrfs。不支持从 LVM 卷快照启动。

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

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

    /srv 这样的目录被排除在快照之外(请参阅 第 3.1.3 节,“从快照中排除的目录”,了解完整列表)可能驻留在单独的设备上。

  • 系统需要通过安装的引导加载程序可引导。

  • 只有子卷 / 的内容将被回滚。包含其他子卷是不可能的。

要从可引导的快照执行回滚,请按以下步骤操作

  1. 启动系统。在引导菜单中选择 可引导的快照 并选择您想要引导的快照。快照列表按日期列出——最新的快照列在最前面。

  2. 登录系统。仔细检查一切是否按预期工作。请注意,您无法写入属于快照的任何目录。写入其他目录的数据将 不会丢失,无论您接下来做什么。

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

    1. 如果系统处于您不想执行回滚的状态,请重新启动以引导到当前系统状态。然后,您可以选择另一个快照,或启动救援系统。

    2. 要执行回滚,请运行

      > sudo snapper rollback

      并在之后重新启动。在引导屏幕上,选择默认引导项以重新启动到恢复的系统。将创建文件系统状态在回滚之前的快照。根的默认子卷将被替换为新的读写快照。有关详细信息,请参阅 第 3.3.1 节,“回滚后的快照”

      使用 -d 选项为快照添加描述很有用。

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

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

在启动到服务包或新主要版本的系统升级时,也会创建可引导的快照(前提是未禁用快照)。

3.3.1 回滚后的快照 编辑源文件

在执行回滚之前,会创建正在运行的文件系统的快照。该描述引用了回滚中恢复的快照的 ID。

由回滚创建的快照会为其 Cleanup 属性接收值 number。因此,当达到快照的设置数量时,回滚快照会自动删除。有关详细信息,请参阅 第 3.7 节,“自动快照清理”。如果快照包含重要数据,请在删除之前从快照中提取数据。

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

3.3.2 访问和识别快照引导条目 编辑源文件

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

Boot loader: snapshots
图 3.1: 引导加载程序:快照
Warning
警告:目前使用 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。长描述可能会被截断,具体取决于引导屏幕的大小。

Tip
提示:设置引导加载程序快照条目的自定义描述

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

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

描述不应超过 25 个字符——超过此大小的内容在引导屏幕上将无法读取。

3.3.3 限制 编辑源文件

将整个系统回滚,将整个系统恢复到拍摄快照时的完全相同状态,是不可能的。

3.3.3.1 从快照中排除的目录 编辑源文件

根文件系统快照不包含所有目录。有关详细信息和原因,请参阅 第 3.1.3 节,“从快照中排除的目录”。因此,来自这些目录的数据不会恢复,从而导致以下限制。

回滚后,插件和第三方软件可能无法使用

将数据安装到从快照中排除的子卷(例如 /opt)中的应用程序和插件,如果应用程序的其他部分也安装在包含在快照中的子卷上,则回滚后可能无法工作。重新安装应用程序或插件以解决此问题。

文件访问问题

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

不兼容的数据格式

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

包含代码和数据的子卷

/srv 这样的子卷可能包含代码和数据的混合。回滚可能会导致非功能代码。例如,PHP 版本的降级可能会导致 Web 服务器的 PHP 脚本损坏。

用户数据

如果回滚从系统中删除用户,则在从快照中排除的目录中拥有的这些用户的数据不会被删除。如果创建了具有相同用户 ID 的用户,该用户将继承这些文件。使用 find 等工具查找并删除孤立文件。

3.3.3.2 无法回滚引导加载程序数据 编辑源文件

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

3.4 在用户主目录中启用 Snapper 编辑源文件

您可以为用户的 /home 目录启用快照,这支持多种用例

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

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

  • 使用 Btrfs 后端的 Samba 共享和主目录。

每个用户的目录都是 /home 的 Btrfs 子卷。可以手动设置此设置(请参阅 第 3.4.3 节,“手动在主目录中启用快照”)。但是,更方便的方法是使用 pam_snapperpam_snapper 包安装 pam_snapper.so 模块和辅助脚本,这些脚本可自动执行用户创建和 Snapper 配置。

pam_snapper 提供与 useradd 命令、可插拔身份验证模块 (PAM) 和 Snapper 的集成。默认情况下,它在用户登录和注销时创建快照,并且在某些用户长时间登录时创建基于时间的快照。您可以使用正常的 Snapper 命令和配置文件更改默认设置。

3.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 命令来管理这些快照。

3.4.2 删除用户 编辑源文件

使用 /usr/lib/pam_snapper/pam_snapper_userdel.sh 脚本删除用户。默认情况下,它执行模拟运行,因此请将其编辑为将 DRYRUN=1 更改为 DRYRUN=0。这将删除用户、用户的主目录子卷、Snapper 配置并删除所有快照。

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

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

3.5 创建和修改 Snapper 配置 编辑源文件

Snapper 的行为由针对每个分区或 `Btrfs` 子卷的配置文件定义。这些配置文件位于 `/etc/snapper/configs/` 下。

如果根文件系统足够大(大约 12 GB),则在安装时会自动为根文件系统 `/` 启用快照。相应的默认配置名为 `root`。它创建并管理 YaST 和 Zypper 快照。有关默认值的列表,请参阅 第 3.5.1.1 节,“配置数据”

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

第 3.1 节,“默认设置” 中所述,启用快照需要在根文件系统中增加额外的可用空间。数量取决于已安装的软件包数量以及对包含在快照中的卷所做的更改数量。快照频率和存档的快照数量也很重要。

在安装过程中自动启用快照所需的最小根文件系统大小。目前此大小约为 12 GB。此值将来可能会更改,具体取决于架构和基本系统的大小。它取决于安装介质中 `/control.xml` 文件中的以下标签的值

<root_base_size>
<btrfs_increase_percentage>

使用以下公式计算:ROOT_BASE_SIZE * (1 + BTRFS_INCREASE_PERCENTAGE/100)

请记住,此值是最小大小。请考虑为根文件系统使用更多空间。作为经验法则,将不启用快照时使用的空间大小翻倍。

您可以为格式化为 `Btrfs` 的其他分区或 `Btrfs` 分区上的现有子卷创建自己的配置。在以下示例中,我们将为驻留在单独的、格式化为 `Btrfs` 的分区上的 Web 服务器数据设置 Snapper 配置,该分区挂载在 `/srv/www`。

创建配置后,您可以使用 `snapper` 本身或 YaST 的 `Snapper` 模块从这些快照中恢复文件。在 YaST 中,您需要选择您的 `Current Configuration`(当前配置),而对于 `snapper`,您需要使用全局开关 `-c` 指定您的配置(例如,`snapper -c myconfig list`)。

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

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

1

配置文件的名称。

2

要拍摄快照的分区或 `Btrfs` 子卷的挂载点。

此命令将在 `/etc/snapper/configs/www-data` 创建一个新的配置文件,并具有合理的默认值(从 `/etc/snapper/config-templates/default` 取得)。有关如何调整这些默认值的说明,请参阅 第 3.5.1 节,“管理现有配置”

Tip
提示:配置默认值

新配置的默认值来自 `/etc/snapper/config-templates/default`。要使用您自己的默认值,请将此文件复制到同一目录并根据需要进行调整。要使用它,请使用 `create-config` 命令指定 `-t` 选项

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

3.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` 显示的配置名称之一。有关配置选项的更多信息,请参阅 第 3.5.1.1 节,“配置数据”

要显示默认配置,请运行

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

使用子命令 `snapper -c CONFIG set-config OPTION=VALUE` 修改指定配置中的选项。将 `CONFIG` 替换为 `snapper list-configs` 显示的配置名称之一。`OPTION` 和 `VALUE` 的可能值在 第 3.5.1.1 节,“配置数据” 中列出。

删除配置

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

3.5.1.1 配置数据 编辑源文件

每个配置都包含可以从命令行修改的选项列表。以下列表提供了每个选项的详细信息。要更改值,请运行 `snapper -c CONFIG set-config "KEY=VALUE"`。

`ALLOW_GROUPS`, `ALLOW_USERS`

授予普通用户使用快照的权限。有关更多信息,请参阅 第 3.5.1.2 节,“作为普通用户使用 Snapper”

默认值为 `""`。

BACKGROUND_COMPARISON

定义是否应在创建后在后台比较创建前和创建后的快照。

默认值为 `"yes"`。

EMPTY_*

定义清理具有相同创建前和创建后快照的快照对的算法。有关详细信息,请参阅 第 3.7.3 节,“清理没有差异的快照对”

FSTYPE

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

默认值为 `"btrfs"`。

NUMBER_*

定义清理编号快照和管理快照的算法。有关详细信息,请参阅 第 3.7.1 节,“清理编号快照”

`QGROUP` / `SPACE_LIMIT`

为清理算法添加配额支持。有关详细信息,请参阅 第 3.7.5 节,“添加磁盘配额支持”

SUBVOLUME

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

默认值为 `"/"`。

SYNC_ACL

如果 Snapper 由普通用户使用(请参阅 第 3.5.1.2 节,“作为普通用户使用 Snapper”),则用户必须能够访问 `.snapshot` 目录并读取其中的文件。如果将 SYNC_ACL 设置为 `"yes"`,Snapper 会自动使用 ACL 为来自 ALLOW_USERS 或 ALLOW_GROUPS 条目的用户和组使它们可访问。

默认值为 `"no"`。

TIMELINE_CREATE

如果设置为 `"yes"`,则会创建每小时快照。有效值为 `"yes"`、`"no"`。

默认值为 `"no"`。

`TIMELINE_CLEANUP` / `TIMELINE_LIMIT_*`

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

3.5.1.2 作为普通用户使用 Snapper 编辑源文件

默认情况下,Snapper 只能由 `root` 使用。但是,在某些情况下,某些组或用户需要能够创建快照或通过恢复到快照来撤消更改

  • 想要拍摄 `/srv/www` 快照的网站管理员

  • 想要拍摄其主目录快照的用户

为这些目的,您可以创建 Snapper 配置,授予用户和/或组权限。相应的 `.snapshots` 目录需要可读且可由指定的用户访问。实现此目的的最简单方法是将 SYNC_ACL 选项设置为 `"yes"`。

过程 3.5: 启用普通用户使用 Snapper

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

  1. 如果 Snapper 配置尚不存在,请为用户应该能够使用 Snapper 的分区或子卷创建一个。有关说明,请参阅 第 3.5 节,“创建和修改 Snapper 配置”。示例

    > sudo snapper --config web_data create /srv/www
  2. 配置文件在 `/etc/snapper/configs/CONFIG` 下创建,其中 CONFIG 是您在之前的步骤中用 `-c/--config` 指定的值(例如 `/etc/snapper/configs/web_data`)。根据您的需要进行调整。有关更多信息,请参阅 第 3.5.1 节,“管理现有配置”

  3. 为 `ALLOW_USERS` 和/或 `ALLOW_GROUPS` 设置值,以分别授予用户和/或组权限。多个条目需要用空格分隔。例如,要授予用户 `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

3.6 手动创建和管理快照 编辑源文件

Snapper 不仅限于通过配置自动创建和管理快照;您还可以使用命令行工具或 YaST 模块手动创建快照对(“创建前和创建后”)或单个快照。

所有 Snapper 操作都针对现有配置执行(有关详细信息,请参阅 第 3.5 节,“创建和修改 Snapper 配置”)。您只能对存在配置的分区或卷拍摄快照。默认情况下,使用系统配置 (`root`)。要创建或管理自己的配置的快照,您需要显式选择它。在 YaST 中使用 `Current Configuration`(当前配置)下拉框,或在命令行上指定 `-c`(`snapper -c MYCONFIG COMMAND`)。

3.6.1 快照元数据 编辑源文件

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

snapper --config home list

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

snapper list -a

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

snapper list -t pre-post

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

snapper list -t single

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

每个快照的可用元数据如下:

  • 类型:快照类型,有关详细信息,请参阅 第 3.6.1.1 节,“快照类型”。此数据无法更改。

  • 编号:快照的唯一编号。此数据无法更改。

  • 创建前编号:指定相应的创建前快照的编号。仅适用于类型为 post 的快照。此数据无法更改。

  • 描述:快照的描述。

  • 用户数据:扩展描述,您可以在其中以逗号分隔的键=值列表的形式指定自定义数据:`reason=testing, project=foo`。此字段还用于将快照标记为重要 (`important=yes`) 并列出创建快照的用户 (user=tux)。

  • 清理算法:快照的清理算法,有关详细信息,请参阅 第 3.7 节,“自动快照清理”

3.6.1.1 快照类型 编辑源文件

Snapper 知道三种不同类型的快照:创建前、创建后和单个。在物理上它们没有区别,但 Snapper 对它们的处理方式不同。

创建前

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

post

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

single

独立快照。例如,这用于自动每小时快照。在创建快照时,这是默认类型。

3.6.1.2 清理算法 编辑源代码

Snapper 提供了三种清理旧快照的算法。这些算法在每日 cron 任务中执行。可以在 Snapper 配置中定义要保留的不同类型快照的数量(有关详细信息,请参阅 第 3.5.1 节,“管理现有配置”)。

number

当达到某个快照计数时,删除旧快照。

timeline

删除超过某个年龄的旧快照,但保留若干小时、每日、每月和每年的快照。

empty-pre-post

删除差异为空的 pre/post 快照对。

3.6.2 创建快照 编辑源代码

要创建快照,请运行 snapper create 或在 YaST 模块 Snapper 中单击 创建。以下示例说明如何从命令行创建快照。YaST 的 Snapper 界面未在此处明确描述,但提供等效的功能。

Tip
提示:快照描述

始终指定有意义的描述,以便以后能够识别其用途。您还可以通过 --userdata 选项指定其他信息。

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

从现有快照创建独立快照(类型 single),该快照由 snapper list 中的快照编号指定。(适用于 Snapper 版本 0.8.4 及更高版本。)

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

为默认 (root) 配置创建一个独立快照(类型 single),并附带描述。由于未指定清理算法,因此快照将永远不会自动删除。

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

为名为 home 的自定义配置创建一个独立快照(类型 single),并附带描述。由于未指定清理算法,因此快照将永远不会自动删除。

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

为名为 home 的自定义配置创建一个独立快照(类型 single),并附带描述。当快照满足配置中时间线清理算法的条件时,快照将自动删除。

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 的快照,与 pre 快照编号 30 配对。创建用于保存“之前”和“之后”状态的快照对的第二个命令。该快照被标记为重要。

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

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

3.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 的元数据。设置新的描述并取消设置清理算法。

3.6.4 删除快照 编辑源代码

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

要使用命令行工具删除快照,需要知道它的编号。通过运行 snapper list 获取它。要删除快照,请运行 snapper delete NUMBER

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

在使用 Snapper 删除快照时,释放的空间将由在后台运行的 Btrfs 进程声明。因此,可见性和可用空间的延迟。如果您需要通过删除快照释放的空间立即可用,请使用 --sync 选项与 delete 命令。

Tip
提示:删除快照对

删除 pre 快照时,应始终删除其对应的 post 快照(反之亦然)。

snapper delete 65

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

snapper -c home delete 89 90

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

snapper delete --sync 23

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

Tip
提示:删除未引用的快照

有时 Btrfs 快照存在,但包含 Snapper 元数据的 XML 文件丢失。在这种情况下,快照对 Snapper 不可见,需要手动删除。

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

如果您删除快照以释放硬盘上的空间,请确保首先删除旧快照。快照越旧,占用的磁盘空间越多。

快照也会由每日 cron 任务自动删除。有关详细信息,请参阅 第 3.6.1.2 节,“清理算法”

3.7 自动快照清理 编辑源代码

快照占用磁盘空间,随着时间的推移,快照占用的磁盘空间量可能会变得很大。为了防止磁盘空间不足,Snapper 提供了自动删除旧快照的算法。这些算法区分时间线快照和编号快照(管理加安装快照对)。您可以指定要保留每种类型快照的数量。

此外,您可以选择性地指定磁盘空间配额,定义快照可以占用的最大磁盘空间量。也可以自动删除不不同的 pre 和 post 快照对。

清理算法始终绑定到单个 Snapper 配置,因此需要为每个配置配置算法。要防止某些快照被自动删除,请参阅 可以保护快照免于删除吗?

默认设置 (root) 配置为对编号快照和空 pre 和 post 快照对进行清理。启用了配额支持——快照不得占用根分区可用磁盘空间的 50% 以上。默认情况下禁用时间线快照,因此时间线清理算法也已禁用。

3.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",则忽略。

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

示例命令进行更改或设置

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

如果启用了配额支持(请参阅 第 3.7.5 节,“添加磁盘配额支持”),则需要将限制指定为最小值-最大值范围,例如 2-10。如果禁用了配额支持,则需要提供常量值,例如 10,否则清理将因错误而失败。

NUMBER_MIN_AGE

定义快照在可以自动删除之前必须具有的最小年龄(以秒为单位)。小于此处指定值的快照将不会被删除,无论存在多少个。

默认值为 "1800"

示例命令进行更改或设置

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

NUMBER_LIMITNUMBER_LIMIT_IMPORTANTNUMBER_MIN_AGE 始终进行评估。仅当 所有 条件都满足时,才会删除快照。

如果您始终想保留使用 NUMBER_LIMIT* 定义的快照数量,而不管其年龄如何,请将 NUMBER_MIN_AGE 设置为 0

以下示例显示了一种配置,以保留最后 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

3.7.2 清理时间线快照 编辑源代码

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

TIMELINE_CLEANUP

启用或禁用时间线快照的清理。如果启用,当总快照计数超过由 TIMELINE_LIMIT_* TIMELINE_MIN_AGE 指定的年龄时,将删除快照。有效值:yesno

默认值为 `"yes"`。

示例命令进行更改或设置

> sudo snapper -c CONFIG set-config "TIMELINE_CLEANUP=yes"
TIMELINE_LIMIT_DAILYTIMELINE_LIMIT_HOURLYTIMELINE_LIMIT_MONTHLYTIMELINE_LIMIT_WEEKLYTIMELINE_LIMIT_YEARLY

要保留的小时、天、月、周和年的快照数量。

每个条目的默认值为 "10",除了 TIMELINE_LIMIT_WEEKLY,默认设置为 "0"

TIMELINE_MIN_AGE

定义快照在可以自动删除之前必须具有的最小年龄(以秒为单位)。

默认值为 "1800"

示例 3.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 个快照。

  • 每日:已创建的最后七天第一天每日快照保留。

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

  • 每周:已创建的最后 4 周最后一天的快照保留。

  • 每年:已创建的最后 2 年最后一天的快照保留。

3.7.3 清理不不同的快照对 编辑源代码

第 3.1.2 节,“快照类型” 所述,每当您运行 YaST 模块或执行 Zypper 时,都会在启动时创建 pre 快照,并在退出时创建 post 快照。如果您没有进行任何更改,则 pre 和 post 快照之间将没有差异。可以通过在 Snapper 配置中设置以下参数自动删除此类“”快照对

EMPTY_PRE_POST_CLEANUP

如果设置为 yes,则不不同的 pre 和 post 快照对将被删除。

默认值为 `"yes"`。

EMPTY_PRE_POST_MIN_AGE

定义不不同的 pre 和 post 快照对在可以自动删除之前必须具有的最小年龄(以秒为单位)。

默认值为 "1800"

3.7.4 清理手动创建的快照 编辑源文件

Snapper 不为手动创建的快照提供自定义清理算法。但是,您可以将数字或时间线清理算法分配给手动创建的快照。如果这样做,该快照将加入您指定的算法的“清理队列”。您可以在创建快照时,或者通过修改现有快照来指定清理算法

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

为默认(根)配置创建一个独立快照(类型为 single),并分配 `number` 清理算法。

snapper modify --cleanup-algorithm "timeline" 25

修改编号为 25 的快照,并分配 `timeline` 清理算法。

3.7.5 添加磁盘配额支持 编辑源文件

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

Btrfs 配额应用于子卷,而不是用户。您可以为用户和组(例如,使用 `quota` 命令)应用磁盘空间配额,以及使用 Btrfs 配额。

如果 Snapper 在安装期间已启用,则会自动启用配额支持。如果您稍后手动启用 Snapper,则可以通过运行 `snapper setup-quota` 来启用配额支持。这需要有效的配置(有关更多信息,请参阅 第 3.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%,...)。

适用以下限制和指南

  • 配额仅在现有数字和/或时间线清理算法的基础上激活。如果未激活清理算法,则不应用配额限制。

  • 启用配额支持后,如果需要,Snapper 将执行两次清理运行。第一次运行将应用为数字和时间线快照指定的规则。只有在第一次运行后超过配额,才会应用配额特定的规则进行第二次运行。

  • 即使启用了配额支持,Snapper 也会始终保留使用 `NUMBER_LIMIT*` 和 `TIMELINE_LIMIT*` 值指定的快照数量,即使超过配额也是如此。因此,建议为 `NUMBER_LIMIT*` 和 `TIMELINE_LIMIT*` 指定范围值(`MIN-MAX`)以确保可以应用配额。

    例如,如果设置了 `NUMBER_LIMIT=5-20`,Snapper 将执行第一次清理运行,并将常规编号快照的数量减少到 20。如果这 20 个快照超过了配额,Snapper 将在第二次运行中删除最旧的快照,直到满足配额。无论它们占用多少空间,都始终保留至少五个快照。

3.8 显示快照使用的独占磁盘空间 编辑源文件

为了高效利用存储空间,快照共享数据,因此使用普通的 `du` 和 `df` 命令将无法准确测量使用的磁盘空间。当您想要释放启用配额的 Btrfs 上的磁盘空间时,您需要知道每个快照使用的独占磁盘空间,而不是共享空间。Snapper 0.6 及更高版本在“已用空间”列中报告每个快照使用的磁盘空间

# 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

从一个服务包升级到另一个服务包会导致快照占用系统子卷上的大量磁盘空间。建议在不再需要这些快照后手动删除它们。有关详细信息,请参阅 第 3.6.4 节,“删除快照”

3.9 常见问题解答 编辑源文件

问: 为什么 Snapper 从未显示 `/var/log`、`/tmp` 和其他目录中的更改?

对于某些目录,我们决定将它们从快照中排除。有关列表和原因,请参阅 第 3.1.3 节,“从快照中排除的目录”。要从快照中排除路径,我们为该路径创建一个子卷。

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

是的——请参阅 第 3.3 节,“通过从快照启动进行系统回滚” 以获取详细信息。

问: 是否可以保护快照免于删除?

目前 Snapper 不提供防止手动删除快照的手段。但是,您可以防止清理算法自动删除快照。手动创建的快照(请参阅 第 3.6.2 节,“创建快照”)除非您使用 `--cleanup-algorithm` 指定,否则不会分配清理算法。自动创建的快照始终分配 `number` 或 `timeline` 算法。要从一个或多个快照中删除此类分配,请按以下步骤操作

  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/

打印此页面