Snapper (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态:本文是 Snapper翻译。上次翻译日期:2017-03-15。如果英文版本有所更改,则您可以帮助同步翻译。

Snapper 是一个由 openSUSE 的 Arvin Schnell 开发的工具,用于管理 Btrfs 子卷和 LVM 精简配置(thin-provisioned)卷。它可以创建和比较快照,在快照间回滚,并支持自动按时间序列创建快照。

安装

安装 snapper 包。或者安装开发版本 snapper-gitAUR

此外,还可以安装 GUI 前端 snapper-gui-gitAUR

建立一个新的配置

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: Add instructions for using thin-provisioned LVM snapshots. (Discuss in Talk:Snapper#LVM thin-provisioned snapshots)

在为 btrfs 子卷建立一个 snapper 配置前,这个子卷必须已经存在。否则,你应该在建立 snapper 配置前创建它。

要为位置为 /path/to/subvolume 的 btrfs 子卷创建一个新的 snapper 配置文件,并命名为 config

# snapper -c config create-config /path/to/subvolume

这将会:

  • 根据 /etc/snapper/config-templates 处的默认配置模板创建一个配置文件 /etc/snapper/configs/config
  • /path/to/subvolume/.snapshots 处创建一个子卷,用于存储未来该配置文件产生的子卷。子卷的路径将会是 /path/to/subvolume/.snapshots/#/snapshot# 是子卷序号。
  • config 加入到 /etc/conf.d/snapperSNAPPER_CONFIGS 中。

例如,要为挂载在 / 的子卷创建一个配置文件:

# snapper -c root create-config /

此时,配置文件已经激活。如果你的 cron 守护进程已经运行, snapper 将会使用 #自动按时创建快照。否则,你需要使用 systemd 单元文件和定时器。参阅 #启用/停用

参阅 snapper-configsman page (简体中文)

创建快照

自动按时创建快照

一个快照时间线(timeline)由可配置数目的每小时/日/月/年快照组成。当自动按时创建启用时,默认每小时创建一个快照。每天由时间线清理算法清理多余快照。

启用/停用

如果你拥有一个 cron 守护进程,该特性应该已经自动启用。要停用,编译你想禁用该特性的子卷对应配置文件为:

TIMELINE_CREATE="no"

如果你没有 cron 守护进程,你可以使用提供的 systemd 单元文件。Startenable snapper-timeline.timer 来启用自动按时创建快照。另外,startenable snapper-cleanup.timer 来定期清理老旧快照。

设置快照限制

默认配置将保留 10 个每小时快照,10 个每日快照,10 个每月快照和 10 个每年快照。你可以在配置文件中更改这些限制,特别是在繁忙的子卷,例如 / 上。参阅 Snapper#Preventing slowdowns

这是一份名为 config 的配置文件的示例片段,它将保留 5 个每小时快照,7 个每日快照,不保留每月和每年快照:

/etc/snapper/configs/config
TIMELINE_MIN_AGE="1800"
TIMELINE_LIMIT_HOURLY="5"
TIMELINE_LIMIT_DAILY="7"
TIMELINE_LIMIT_WEEKLY="0"
TIMELINE_LIMIT_MONTHLY="0"
TIMELINE_LIMIT_YEARLY="0"

更改创建和清理频率

如果你使用提供的 systemd 定时器,你可以 修改 它们来更改创建和清理频率。

例如,编辑 snapper-timeline.timer,加入下列配置来设定快照频率为间隔五分钟,而不是一小时:

[Timer]
OnCalendar=*:0/5
注意: 配置项 TIMELINE_LIMIT_HOURLY 在上述示例中,其含义将会变为表示保留多少个每5分钟快照。

在编辑 snapper-cleanup.timer 来每小时运行清理,而不是每天的时候, 你需要更改 OnUnitActiveSec。 加入:

[Timer]
OnUnitActiveSec=1h

参阅 Systemd (简体中文)/定时器Systemd#Drop-in files.

手动创建快照

简单快照

默认情况下 snapper 创建 'simple 类型的快照,它们与其他快照没有特别关系。

要为一个子卷创建快照:

 # snapper -c config create --description desc

以上命令没有对应的清理算法,因此该快照将会一直存储直到 删除 它。

要设置一个清理算法,在 create 后使用 -c 选项,并在 numbertimelineprepost 中选择一个参数。 number 使 snapper 定期清理超出配置文件中设置的数量限制的快照。例如,要创建一个使用 number 清理算法的快照:

 # snapper -c config create -c number

参阅 #自动按时创建快照 查看 timeline 是如何工作的。参阅 #Pre/post 快照 查看 pre post 如何工作。

Pre/post 快照

除了 simple 快照以外,你还可以创建 pre/post 快照,pre 快照永远有一个对应的 post 快照。配对的目的是可以在系统更改前后创建快照。

要创建一个 pre/post 快照对,先创建一个 pre 快照:

 # snapper -c config create -t pre -p

记下输出的快照序号,它将会在创建 post 快照时使用。

然后执行一个系统更改(例如:安装一个新程序,更新系统,等等)

现在创建 post 快照:

 # snapper -c config create -t post --pre-number N

N 是对应的 pre 快照的序号。

An alternative method is to use the --command flag for create, which wraps a command with pre/post snapshots: 另一种方法是在 create 时使用 --command 选项,将会在 pre/post 快照间执行一个命令:

 # snapper -c config create --command cmd

cmd 是你希望在 pre/post 快照间执行的命令。

参阅 Snapper#Wrapping pacman transactions in snapshots.

启动时快照

要让 snapper 为 root 配置文件创建一个快照,启用 snapper-boot.timer

列出快照

要列出名为 config 的配置文件对应的快照:

 # snapper -c config list

列出配置

列出所有你已经创建的配置:

 # snapper list-configs

删除快照

要删除序号为 N 的快照:

 # snapper -c config delete N

可以一次删除多个快照。例如,要删除 root 配置文件的 65 和 70 号快照:

 # snapper -c root delete 65 70
注意: 删除 pre 快照时, 你应该总是删除对应的 post 快照。反之亦然。

允许非 root 用户访问

所有配置文件都是由 root 用户创建的,默认情况下,也只有 root 用户可以查看并访问它们。

要让指定用户可以列出某一配置文件的快照,修改 /etc/snapper/configs/config 中的 ALLOW_USERS 项。现在你应该可以以普通用户权限运行 snapper -c configlist

最后,如果你想允许某一用户浏览 .snapshots 目录,但是该目录的拥有者必须为 root。因此,你应该修改包括该用户的组为组拥有者,以 users 为例:

# chmod a+rx .snapshots
# chown :users .snapshots

疑难解答

日志

Snapper 将所有活动写入到 /var/log/snapper.log 中 —— 在你认为出错时,首先检查该文件。

当你遇到关于每小时/每日/每周快照的问题时,最常见的原因是由于 cronie 服务(或者你使用的其他 cron 守护进程)没有运行。

IO 错误

如果你在试图创建快照时遇到 'IO Error',请确认你试图创建快照的子卷对应的 .snapshots 目录是一个子卷。

另一个可能的原因是 .snapshots 目录的拥有者不是 root。你会在在 /var/log/snapper.log 中找到 Btrfs.cc(openInfosDir):219 - .snapshots must have owner root

相关资源