openSUSE:Snapper 教程

跳转到:导航搜索

简介

Snapper 是一个文件系统快照管理工具。

本文档假定您将使用 SnapperBtrfs 文件系统。

在全新安装 openSUSE 时,默认情况下在 root 上使用 Btrfs,即 /。 如果您在 openSUSE 安装过程中选择分离 /home 选项,则默认情况下 /home 将在 XFS 下。

如果您决定在全新 openSUSE 安装期间使用 BtrfsSnapper(默认设置),它将自动为您配置 SnapperSnapper 的自动配置意味着当您使用 YaST2 和/或 Zypper 时,将自动拍摄快照。 请阅读 软件要求 部分了解注意事项。

您可以将 EXT3EXT4 文件系统转换为 Btrfs 以利用 Snapper。 在 EXT4 文件系统上使用 Snapper 强烈 不建议。

重要细节

Snapper 配置为在 root 上运行时,即 /,默认行为是排除每个 Btrfs 子卷。 这与 SUSE Enterprise 上的行为相同。 这意味着,如果您有子卷 /srvSnapper 不会拍摄 /srv 中的任何内容的快照,除非您明确告知它这样做。 这也意味着,如果您在任何时候将子卷添加到 /,它将被排除在 Snapper 的默认快照行为之外。

除非另有说明,请始终以 root 用户身份使用 SnapperYaST2

YaST2 带有名为 yast2-snapperSnapper 模块,可用于检查和操作快照。 但是,它没有更改 Snapper 配置的能力。 必须在终端中完成此操作。

如果根分区 (/) 足够大(大约大于 16 GB),则会自动启用快照。

警告: 请记住,如果磁盘小于 16 GB,所有 Snapper 功能和自动快照都将禁用,以防止 / 分区已满。 禁用功能包括 / 分区的自动配置。 有关详细信息,请参阅 https://bugzilla.opensuse.org/show_bug.cgi?id=1085378

Snapper 磁盘大于 16 GB 和小于 16 GB 的默认方面

  • 磁盘 < 16 GB (例如 VirtualBox VDI 固定大小的磁盘默认是 8Gb,这对于在部署到真实机器之前在 (open-)SUSE 上进行测试平台来说是可以的)。
磁盘 > 16 GB 磁盘 < 16 GB
1. 自动创建 Config /etc/snapper/configs/root (0 single)。 1. 自动创建 Config /etc/snapper/configs/root (0 single) 失败。 应该由 Snappercreate-config / 命令手动创建。
2. 自动拍摄根分区 (/) 的快照 1 single,名称为 'first root filesystem' 2. 未自动拍摄快照 1 single原因: 1。 用户可以手动使用任何名称创建它。
3. 自动拍摄快照 2 single 'After installation'important=yes 3. 未自动创建 single 2 快照。 原因: 1
4. /etc/sysconfig/yast2 配置中的默认 USE_SNAPPER=yes 参数。 管理快照 创建已启用 4. /etc/sysconfig/yast2 配置中的默认 USE_SNAPPER=no 参数。 管理快照 创建已禁用
5. /etc/snapper/configs/root 中的默认 TIMELINE_CREATE=yes。 这意味着 时间线快照 创建已启用 5. /etc/snapper/configs/root 中的默认 TIMELINE_CREATE=no时间线快照 创建已禁用


要查看在 / 下创建了哪些子卷,从而查看哪些目录(子卷)被排除在默认快照行为之外

# btrfs subvolume list /

要让 Snapper 拍摄子卷的快照,您可以手动通过 snapper 程序一次性完成,或者创建一个新的 Snapper 配置文件。 更多信息请参阅教程。

软件要求

您始终需要此软件包

 snapper

如果您使用 YaST2 安装、更新或删除软件包,并希望 Snapper 在您使用此工具时自动拍摄快照

 yast2-snapper

如果您使用 Zypper 安装、更新或删除软件包,并希望 Snapper 在您使用此工具时自动拍摄快照

 snapper-zypp-plugin

如果您使用 DNF 安装、更新或删除软件包,并希望 Snapper 在您使用此工具时自动拍摄快照

 python3-dnf-plugin-snapper

如果您希望拥有高级 Btrfs 快照引导菜单管理功能

 grub2-snapper-plugin

警告:上述软件包并非始终默认安装。 安装的内容取决于您在 openSUSE 安装过程中所做的选择。 在更改系统之前,请确保已安装适当的(通常意味着全部)上述软件包,否则您可能会对 Snapper 未自动创建您认为它会创建的快照感到惊讶。

Snapper 基本用法

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

所有 Snapper 操作都针对现有的配置执行。 您只能为存在配置的分区或卷拍摄快照。 默认情况下使用系统配置(root)。 如果要创建或管理自己的配置的快照,则需要显式选择它。 在 YaST 中使用“当前配置”下拉框,或在命令行中指定 -c(snapper -c MYCONFIG COMMAND)。


列出默认配置(root)的所有快照

 # snapper list

 # snapper ls

显示快照之间更改的文件和目录

对于快照 2122 之间更改的文件/目录

 # snapper status 21..22

您还可以显示从快照 41 回到 39 之间更改的文件和目录

 # snapper status 41..39

输出由状态字符串编码,后跟文件名。 状态字符串的字符按列为

  1. "+" 表示文件已创建,或 "-" 表示文件已删除,或 "c" 表示文件内容已更改,或 "t" 表示文件类型已更改(例如,从普通文件到目录);
  2. "p" 表示权限已更改;
  3. "u" 表示用户所有权已更改;
  4. "g" 表示组所有权已更改;
  5. "x" 表示扩展属性信息已更改;
  6. "a" 表示 ACL 信息已更改;
  7. "." 在任何列中表示没有更改。

显示快照之间的差异(diff)(实际文件差异)

对于快照 7172 之间的差异

 # snapper diff 71..72

您还可以使用此命令显示特定文件的差异。 例如,要仅显示快照 7172 的文件 /etc/zypp/zypp.conf 的差异,您将执行以下操作

 # snapper diff 71..72 /etc/zypp/zypp.conf

清理算法

除非您有充分的理由这样做,否则应始终在拍摄快照时指定清理算法,否则除非您手动执行,否则快照将永远不会被删除。 您可以通过将以下内容添加到您的 snapper 命令来执行此操作

 --cleanup-algorithm <number|timeline|empty-pre-post>

以下命令假定您将使用默认系统配置(root)拍摄快照。 如上所述,如果您想使用非默认配置,请将以下内容添加到快照命令

 -c MYCONFIG

拍摄类型为 pre 的快照并打印快照编号。 需要的第一个命令才能拍摄用于保存“之前”和“之后”状态的快照对。

 # snapper create --type pre --print-number --description "Before the Apache config cleanup" --cleanup-algorithm number

拍摄与 pre 快照编号 30 配对的类型为 post 的快照。 需要的第二个命令才能拍摄用于保存“之前”和“之后”状态的快照对。

 # snapper create --type post --pre-number 30 --description "After the Apache config cleanup" --cleanup-algorithm number

拍摄一个独立快照(类型为 single),用于默认(root)配置,并附带描述。 由于未指定 cleanup-algorithm,因此快照将永远不会自动删除。

 # snapper create --description "Snapshot for week 2 2022"

注意: 有关更多详细信息,请访问 Leap 的参考指南

自动快照清理机制

为了防止磁盘空间耗尽,Snapper 会定期清理快照。 默认情况下,此周期 = 1 天

自动快照清理任务可以通过 Systemd 定时器 调度器 (snapper-cleanup.timersnapper-cleanup.service Systemd 单元) 进行管理。

默认情况下,使用 Systemd 定时器 机制。 自 Snapper 版本 0.5.3 以来,cron 机制已被弃用。

所有清理机制都基于存储在 /etc/snapper/configs/ 目录中的特定分区配置文件中这些指令的状态(布尔值:yes/no

  • NUMBER_CLEANUP=布尔值
  • TIMELINE_CLEANUP=布尔值
  • EMPTY_PRE_POST_CLEANUP=布尔值

注意: 有关更多配置选项以根据您的需要修改清理算法,请访问 Leap 的 参考指南 和/或查看 snapper-configs(5) manpage

 man snapper-configs

删除快照

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

 # snapper delete 65

如果您想改为删除所有快照,首先以 root 用户身份执行 snapper list,然后在以下命令中将 100000 替换为前一个 snapper list 命令输出的最高快照编号

 # snapper delete 1-100000 (snapper delete number1-number2)

当前挂载的快照在此过程中被自动忽略。

Snapper 教程

以下教程假定您使用 YaST(默认安装程序)安装了 openSUSE,并为您的 / root 和 /home 文件系统选择了 Btrfs。 默认情况下在 / root 上使用 Btrfs,但在 /home 上不使用。 如果您的 /home 未使用 Btrfs,则本教程仍然适用,只需在涉及到配置或使用 /home 上的 Snapper 时不要遵循说明即可。

首先让我们检查 YaST 如何配置 Snapper

# snapper list-configs
Config | Subvolume
-------+----------
root   | /  

如您所见,YaST 为您的根文件系统创建了一个名为“root”的 snapper 配置。 您可以查看现有的快照

# snapper list
 # | Type   | Pre # | Date                            | User | Used Space | Cleanup  | Description | Userdata
---+--------+-------+---------------------------------+------+------------+----------+-------------+---------
0  | single |       |                                 | root |            |          | current     |
1  | single |       | Wed 19 Jan 2022 02:05:18 AM -03 | root |  31.41 MiB | timeline | timeline    |

快照 #0 始终指当前系统。 根据您的系统运行时间以及您是否已经使用过 YaSTZypper,可能已经存在其他几个快照。

现在我们想尝试将 Snapper 作为 YaST 的撤销工具。 首先我们运行 YaST

# yast2 system_settings

YaST 中启用 SysReq。 完成 YaST 后,您应该看到两个新的快照

# snapper list
 # | Type   | Pre # | Date                            | User | Used Space  | Cleanup  | Description          | Userdata
---+--------+-------+---------------------------------+------+-------------+----------+----------------------+---------
0  | single |       |                                 | root |             |          | current              |
1  | single |       | Wed 19 Jan 2022 02:05:18 AM -03 | root |  31.41 MiB  | timeline | timeline             |
2  | pre    |       | Wed 19 Jan 2022 02:15:03 AM -03 | root |  305.79 KiB | number   | yast system_settings |         
3  | post   | 2     | Wed 19 Jan 2022 02:15:57 AM -03 | root |  520.01 KiB | number   |                      |

快照类型

现在是时候解释快照类型了。 SnapperYaST 运行之前和之后拍摄快照,这些快照分别称为 prepostpost 快照知道哪个 pre 快照属于它。 通过拥有 prepost 快照,我们可以看到在 YaST 运行时文件系统发生了哪些更改。 单个快照与其它快照没有特殊关系。

  • 时间线快照
  • 安装快照
  • 管理快照

注意: 更多详细信息请访问 Leap 参考指南

查看 YaST 期间的更改

使用 snapper,很容易查看 YaST 运行时发生了什么更改。为此,您需要传递“pre”和“post”快照的编号

# snapper status 2..3
c..... /etc/sysctl.conf

c”表示文件的内容已更改。

我们还可以查看文件的差异

# snapper diff 2..3
--- /.snapshots/2/snapshot/etc/sysctl.conf      2022-01-20 12:08:17.180364836 -0300
+++ /.snapshots/3/snapshot/etc/sysctl.conf      2022-01-20 13:06:37.149600689 -0300
@@ -17,7 +17,7 @@
 # See sysctl.conf(5) and sysctl(8) for more information
 #
 ####
-kernel.sysrq = 0
+kernel.sysrq = 1
 net.ipv4.ip_forward = 0
 net.ipv4.tcp_syncookies = 1
 net.ipv6.conf.all.forwarding = 0

因此,如果您不喜欢 YaST 所做的更改并想撤销它,请调用

# snapper undochange 2..3
create:0 modify:1 delete:0
undoing change...
undoing change done

但请注意,snapper 不会像 YaST 那样将更改告知内核,因此您必须自行完成或重新启动。

将 /home 添加到 Snapper

在安装期间,YaST 不会为 /home 设置 snapper 配置。我们可以手动进行设置

# snapper -c home create-config /home

每当您想对 /home 使用 snapper 时,都必须提供 -c home 选项。

现在您可以查看自上次每小时快照以来哪些文件已更改

# snapper -c home list
Type   | # | Pre # | Date                         | Cleanup  | Description | Userdata
-------+---+-------+------------------------------+----------+-------------+---------
single | 0 |       |                              |          | current     |         
single | 1 |       | Tue 22 Nov 2011 11:30:01 CET | timeline | timeline    |         
# snapper -c home status 1..0
comparing snapshots... done
+... /home/tux/just-married.jpg

“+”号表示该文件是新的。


手动创建快照

如果您想手动创建快照,请使用

# snapper -c home create --description "before the big cleanup"

YaST Snapper GUI

最后,yast2-snapper 为 snapper 提供了 YaST UI。

故障排除

在大多数情况下,用户在使用 Snapper 时遇到的问题,通常是因为用户在不了解 Snapper 工作原理的情况下尝试执行某些操作(例如,不正确地创建或删除子卷配置)。要跟踪它,应该深入一级,以达到细节。

让我们尝试为 /foo/bar btrfs 子卷创建 Snapper 的配置。

 snapper -c foo create-config /foo

当执行此命令时,实际会发生什么?

  1. 创建配置文件 /etc/snapper/configs/foo
  2. 将存储 /foo 子卷快照的文件夹:/foo/.snapshots/,将被创建。
  3. 通过更改 SNAPPER_CONFIGS 参数,更新配置文件 /etc/sysconfig/snapperSNAPPER_CONFIGS="foo"

相应地,当用户执行

 snapper -c bar create-config /bar

在创建 /foo 子卷的配置后,Snapper 的算法相同

  1. 创建配置文件 /etc/snapper/configs/bar
  2. 将存储 /bar 子卷快照的文件夹:/bar/.snapshots/,将被创建。
  3. 通过更改 SNAPPER_CONFIGS 参数,更新配置文件 /etc/sysconfig/snapperSNAPPER_CONFIGS="foo bar"

依此类推。

因此,当

 snapper -c foo delete-config

用于删除 /foo 子卷的配置时

  1. 删除配置文件 /etc/snapper/configs/foo
  2. 将存储 /foo 子卷快照的文件夹:/foo/.snapshots/,将被删除。
  3. 通过更改 SNAPPER_CONFIGS 参数,更新配置文件 /etc/sysconfig/snapperSNAPPER_CONFIGS="bar"(删除 foo 记录)。

警告 1:还要记住,快照清理脚本会解析 SNAPPER_CONFIGS 参数的状态(请参阅 4.5 自动快照清理机制 段落)。如果它包含孤立记录,快照清理脚本将无法工作。这有磁盘空间耗尽的风险!

警告 2:如果您手动执行某些操作(例如,您手动删除 /etc/snapper/configs/foo 而不是使用 snapper -c foo delete-config 命令),请不要忘记手动删除 SNAPPER_CONFIGS 参数中的 foo 记录,并手动删除文件夹 /foo/.snapshots/。因为,如果您执行某些操作不完整,Snapper 将无法正常工作并显示错误消息。并且快照清理脚本将无法正常工作。这有磁盘空间耗尽的风险!

总结:使用 Snapper 工具管理您的 btrfs 子卷,而不是手动方式。这将为您节省大量的精力。但是,如果您遇到 btrfs 子卷管理问题,请了解其机制。这可能有助于您跟踪问题的本质并轻松解决它。

当然,不要忘记检查 Snapper 的日志以获取有用的故障排除信息!

日志

可以在 /var/log/snapper.log 中找到 Snapper 日志,如果您遇到问题,请检查此文件,因为它可能包含有用的故障排除信息。

交换文件

Btrfs 在内核 5.0 中获得了交换文件支持,但是当您使用 snapper - 或 btrfs - 对 / 进行快照时,会发生问题。即使在文件上禁用了 COW,交换文件也会阻止快照过程。您可能会在日志中看到类似 quota rescan or sync failed 的消息,或者如果您尝试手动进行快照,snapper 将显示类似 ERROR: cannot snapshot '@': Text file busy 的错误消息。在这种情况下,您需要关闭交换并删除交换文件。解决此问题的一种方法是创建一个新的子卷并将交换文件放在那里。这需要您修改 /etc/fstab

Snapper 视频

Snapper 快速概述 (4 分钟)

Greg Kroah-Hartman & SUSE Linux Enterprise 产品经理演示 Snapper (~7 分钟)

Snapper、Btrfs 和 LVM 演示文稿 (22 分钟)