openSUSE:Snapper 教程
简介
Snapper 是一个文件系统快照管理工具。
本文档假定您将使用 Snapper 与 Btrfs 文件系统。
在全新安装 openSUSE 时,默认情况下在 root 上使用 Btrfs,即 /。 如果您在 openSUSE 安装过程中选择分离 /home 选项,则默认情况下 /home 将在 XFS 下。
如果您决定在全新 openSUSE 安装期间使用 Btrfs 和 Snapper(默认设置),它将自动为您配置 Snapper。 Snapper 的自动配置意味着当您使用 YaST2 和/或 Zypper 时,将自动拍摄快照。 请阅读 软件要求 部分了解注意事项。
您可以将 EXT3 和 EXT4 文件系统转换为 Btrfs 以利用 Snapper。 在 EXT4 文件系统上使用 Snapper 强烈 不建议。
重要细节
当 Snapper 配置为在 root 上运行时,即 /,默认行为是排除每个 Btrfs 子卷。 这与 SUSE Enterprise 上的行为相同。 这意味着,如果您有子卷 /srv,Snapper 不会拍摄 /srv 中的任何内容的快照,除非您明确告知它这样做。 这也意味着,如果您在任何时候将子卷添加到 /,它将被排除在 Snapper 的默认快照行为之外。
除非另有说明,请始终以 root 用户身份使用 Snapper 或 YaST2。
YaST2 带有名为 yast2-snapper 的 Snapper 模块,可用于检查和操作快照。 但是,它没有更改 Snapper 配置的能力。 必须在终端中完成此操作。
如果根分区 (/) 足够大(大约大于 16 GB),则会自动启用快照。
警告: 请记住,如果磁盘小于 16 GB,所有 Snapper 功能和自动快照都将禁用,以防止 / 分区已满。 禁用功能包括 / 分区的自动配置。 有关详细信息,请参阅 https://bugzilla.opensuse.org/show_bug.cgi?id=1085378。
Snapper 磁盘大于 16 GB 和小于 16 GB 的默认方面
- 磁盘 > 16 GB (参见 https://doc.opensuse.net.cn/documentation/leap/reference/html/book-opensuse-reference/cha-snapper.html#sec-snapper-setup)
- 磁盘 < 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) 失败。 应该由 Snapper 的 create-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
显示快照之间更改的文件和目录
对于快照 21 和 22 之间更改的文件/目录
# snapper status 21..22
您还可以显示从快照 41 回到 39 之间更改的文件和目录
# snapper status 41..39
输出由状态字符串编码,后跟文件名。 状态字符串的字符按列为
- "+" 表示文件已创建,或 "-" 表示文件已删除,或 "c" 表示文件内容已更改,或 "t" 表示文件类型已更改(例如,从普通文件到目录);
- "p" 表示权限已更改;
- "u" 表示用户所有权已更改;
- "g" 表示组所有权已更改;
- "x" 表示扩展属性信息已更改;
- "a" 表示 ACL 信息已更改;
- "." 在任何列中表示没有更改。
显示快照之间的差异(diff)(实际文件差异)
对于快照 71 和 72 之间的差异
# snapper diff 71..72
您还可以使用此命令显示特定文件的差异。 例如,要仅显示快照 71 到 72 的文件 /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.timer 和 snapper-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 教程
/ 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 始终指当前系统。 根据您的系统运行时间以及您是否已经使用过 YaST 或 Zypper,可能已经存在其他几个快照。
现在我们想尝试将 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 | |
快照类型
现在是时候解释快照类型了。 Snapper 在 YaST 运行之前和之后拍摄快照,这些快照分别称为 pre 和 post。 post 快照知道哪个 pre 快照属于它。 通过拥有 pre 和 post 快照,我们可以看到在 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
当执行此命令时,实际会发生什么?
- 创建配置文件 /etc/snapper/configs/foo。
- 将存储 /foo 子卷快照的文件夹:/foo/.snapshots/,将被创建。
- 通过更改 SNAPPER_CONFIGS 参数,更新配置文件 /etc/sysconfig/snapper:SNAPPER_CONFIGS="foo"。
相应地,当用户执行
snapper -c bar create-config /bar
在创建 /foo 子卷的配置后,Snapper 的算法相同
- 创建配置文件 /etc/snapper/configs/bar。
- 将存储 /bar 子卷快照的文件夹:/bar/.snapshots/,将被创建。
- 通过更改 SNAPPER_CONFIGS 参数,更新配置文件 /etc/sysconfig/snapper:SNAPPER_CONFIGS="foo bar"。
依此类推。
因此,当
snapper -c foo delete-config
用于删除 /foo 子卷的配置时
- 删除配置文件 /etc/snapper/configs/foo。
- 将存储 /foo 子卷快照的文件夹:/foo/.snapshots/,将被删除。
- 通过更改 SNAPPER_CONFIGS 参数,更新配置文件 /etc/sysconfig/snapper:SNAPPER_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 视频
Greg Kroah-Hartman & SUSE Linux Enterprise 产品经理演示 Snapper (~7 分钟)
