# Snapper (简体中文)

Related articles

- Btrfs
- mkinitcpio-btrfs

翻译状态： 本文是英文页面 Snapper 的翻译，最后翻译时间：2017-03-15，点击这里可以查看翻译后英文页面的改动。

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

## 安装

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

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

## 建立一个新的配置

This article or section needs expansion.

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/snapper` 的 `SNAPPER_CONFIGS` 中。

例如，要为挂载在 `/` 的子卷创建一个配置文件：

    # snapper -c root create-config /

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

参阅 `snapper-configs` 的 man page (简体中文)。

## 创建快照

### 自动按时创建快照

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

#### 启用/停用

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

    TIMELINE_CREATE="no"

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

#### 设置快照限制

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

这是一份名为 `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

以上命令没有对应的清理算法，因此该快照将会一直存储直到 删除[broken link: invalid section] 它。

要设置一个清理算法，在 `create` 后使用 `-c` 选项，并在 `number`，`timeline`，`pre` 或 `post` 中选择一个参数。 `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`。

## 相关资源

- Snapper homepage
- openSUSE Snapper portal
- Btrfs homepage
- Linux.com: Snapper: SUSE's Ultimate Btrfs Snapshot Manager

Category:

- File systems (简体中文)

Hidden categories:

- Pages or sections flagged with Template:Expansion
- Pages with broken section links