SDB:Snapper 教程

跳转至: 导航, 搜索

测试版本

推荐条目

相关条目

Icon-help.png


简介

除非特别声明,本文列出的命令均需要 root 权限。

Snapper 是用于管理文件系统快照(filesystem snapshot,下文简称为:快照 或 snapshot)的工具。快照保存了文件系统在某个时间点的状态,从而可以轻松实现系统回滚或数据备份。

本文假定读者搭配 BTRFS 文件系统使用 snapper 工具(即 openSUSE 的默认配置)。

在安装完一个全新的 openSUSE 系统后,/(根分区)默认使用 btrfs;/home(用户文件夹)默认使用 XFS 文件系统。如果你在安装系统时,未分离 @/home 子卷,那么用户目录也将使用 btrfs 文件系统。

如果你在安装新系统时使用了 openSUSE 的默认值(btrfs + snapper),那么 YaST2 安装器会自动为你配置好 snapper。

某些方法可以将 EXT3/EXT4 文件系统转换为 btrfs,以便于利用 snapper。但是开发者强烈不推荐在 EXT4 上使用 snapper。

注意: 由于快照功能会占据额外的磁盘空间,建议为要开启快照的分区分配两倍于一般情况下使用的空间。

重要信息

当 Snapper 以默认设置运行时(即设置为在 / 上运行),默认的行为是排除所有的 btrfs 子卷。这与 SUSE Enterprise Linux 的配置相同。例如,如果你有一个 /srv 子卷,snapper 不会对 /srv 启用快照,除非你在专门进行设置。也就说,只要你在任何时间将新子卷添加至 /,snapper 都默认不对其启用快照功能。

使用 snapper 或 YaST2 的时候,除非另有说明,不然你需要 root 权限。

YaST2 通过 yast2-snapper 模块使用 snapper,查看和操作快照。然而,YaST2 并不具备修改 snapper 配置的能力。你需要通过终端来修改配置。

对于存储空间大于 16GB/(根分区),快照功能默认自动启用。

注意如果存储空间小于 16GB,那么所有的 snapper 功能和自动快照都会对 / 默认禁用。禁用的的功能包括自动化配置 /(根分区),详见 https://bugzilla.opensuse.org/show_bug.cgi?id=1085378

对于存储空间大于 16GB 和小于 16GB 的 Snapper 默认设置

存储空间小于 16GB 存储空间小于 16GB
1. 自动创建 /etc/snapper/configs/root (0 single) 配置文件。 1. 没有 /etc/snapper/configs/root (0 single) 配置文件。需要使用 snappercreate-config / 命令手动创建。
2. 根分区(/)的 1 single 快照自动被命名为 'first root filesystem' 2. 因为原因 1,不会自动创建快照 1 single。用户可以以任意名称新建此快照。
3. 自动创建根分区(/)的快照 2 single 'After installation', important=yes 3. 因为原因 1,不会自动创建快照 single 2
4. /etc/sysconfig/yast2 配置文件默认启用 USE_SNAPPER=yes 参数。启用 Administrative Snapshots(管理快照)。 4. /etc/sysconfig/yast2 配置文件默认启用 USE_SNAPPER=no 参数。启用 Administrative Snapshots
5. /etc/snapper/configs/root 配置文件默认启用 TIMELINE_CREATE=yes 参数。这表示将默认启用 Timeline Snapshots (时间线快照)。 5. /etc/snapper/configs/root 配置文件默认启用 TIMELINE_CREATE=no 参数。Timeline Snapshots 功能被禁用。

使用下列命令查询 / 具有的块设备,以及被纳入快照的子卷:

lsblk; sudo 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 的过程中所做的选择。在确认对要安装的系统的更改前,请确保安装了上面列出的软件包(除了 python3-dnf-plugin-snapper,通常需要全部安装),否则 snapper 可能不会按预期工作。

快照类型

Snapper 快照可分为两大类型:

  • 快照对:由一对快照组成,在进行某项操作前拍摄一个「前快照」(pre),操作后再拍摄一个「后快照」(post),从而可以比较两个快照对差异而撤销该操作。快照对是一一对应的,如果删除了某一快照,则对应的快照也会被删除。
  • 单一快照(single):由一个单独的快照组成,与其他快照没有特殊联系。可用于备份或回滚整个系统等操作。

快照对和单一快照既可以手动创建,也可以根据配置自动创建。自动创建的快照又可分为三种类型:

  • 时间线快照:每小时自动创建的单一快照。
  • 安装快照:在安装软件包前后自动创建的一对快照对。可用于撤销软件包更改。
  • 管理快照:在使用 YaST 管理系统前后自动创建的一堆快照对。可用于撤销配置更改。

这三种自动创建的快照均可单独启用和配置,从而提供了极大的灵活性。

快速配置(默认配置)

要在分区或 Btrfs 子卷启用快照,需要创建配置文件。Snapper 的配置文件存储在 /etc/snapper/configs 中。

如果你的根分区大于 16 GB,并且在安装 openSUSE 时使用默认分区配置,则根分区的配置文件应已被自动创建。默认配置启用了安装快照和管理快照,并排除了部分目录,可以满足大多数需求。

如果你希望使用 openSUSE 的默认配置,但在安装 openSUSE 时未开启快照功能,可以使用以下命令创建根分区的默认配置文件:

注意: 要使用该默认配置文件,请确保根分区大小至少为 16 GB,并使用 openSUSE 安装程序建议的包含子卷的 Btrfs 根文件系统(安装程序默认分区设置)
snapper -c root create-config /

确保 snapper-zypp-plugin 软件包已安装以启用安装快照:

zypper install snapper-zypp-plugin

手动配置

创建配置文件

如果你的根分区不足 16 GB 而无法直接使用默认配置,或者只希望在特定分区或子卷启用快照,可以以下命令创建相应的配置文件:

snapper -c 配置文件名 create-config 分区或子卷的挂载点

这将根据 /etc/snapper/config-templates/default 提供的默认值创建配置文件。

注意: 在创建配置文件前请确保目标分区或子卷已被创建。不能为同一分区或子卷创建多个配置文件。

例如,为防止回滚时数据丢失,默认的根分区配置排除了 /home 目录,可以使用上述命令为 /home 创建配置文件:

snapper -c home create-config /home

该命令会使用 /etc/snapper/config-templates/default 提供的默认值创建 /etc/snapper/configs/home 文件。

可以使用

snapper list-configs

查看现有配置文件。

启用/禁用自动快照

你可以选择性地启用/禁用自动创建的快照类型:

启用时间线快照

snapper -c 配置文件名 set-config "TIMELINE_CREATE=yes"

禁用时间线快照

snapper -c 配置文件名 set-config "TIMELINE_CREATE=no"
注意: 以下两种快照包含的内容由安装的软件包或修改的配置而定,与特定分区或子卷无关。

启用安装快照

zypper install snapper-zypp-plugin

禁用安装快照

zypper remove snapper-zypp-plugin

启用管理快照

/etc/sysconfig/yast2 中将 USE_SNAPPER 设置为 yes

禁用管理快照

/etc/sysconfig/yast2 中将 USE_SNAPPER 设置为 no

配置文件参数

Snapper 的行为由配置文件参数定义,除了直接使用文本编辑器编辑配置文件外,还可以使用

snapper -c 配置文件名称 set-config "参数名称=参数"

修改配置文件参数。

以下对几个常用配置案例进行说明,完整的参数说明可参阅 snapper-configs(5) :

man snapper-configs

启用时间线快照

参见「启用/禁用快照」一节。

允许普通用户管理快照

默认情况下仅 root 用户可以管理快照,要允许普通用户或组管理快照,可运行:

snapper -c 配置文件名称 set-config "ALLOW_USERS=用户名" "ALLOW_GROUPS=组名" "SYNC_ACL=yes"

必须配置「SYNC_ACL=yes」以允许普通用户访问快照所在目录。

自动清理旧快照

为防止快照占据全部磁盘空间,Snapper 提供了几种自动清理旧快照的机制,可通过一系列参数配置自动清理过程:

清理机制 说明 启用选项 配置参数 含义 备注
编号 根据快照编号进行清理 NUMBER_CLEANUP=yes NUMBER_LIMIT=数字或范围 定义要保留的快照数量。 如果启用了定额支持,应使用范围。如果未启用定额支持,应使用单个数字。
NUMBER_LIMIT_IMPORTANT=数字或范围 定义要保留的含 important 标签的快照数量,内核更新等的安装快照自带该标签。
NUMBER_MIN_AGE=秒 定义满足上述条件的快照被清理前最少应保留的时间。0 表示无限制。
时间线 根据快照创建时间进行清理 TIMELINE_CLEANUP=yes TIMELINE_LIMIT_HOURLY=数字或范围 定义要保留的每小时首张快照的数量。 如果启用了定额支持,应使用范围。如果未启用定额支持,应使用单个数字。
TIMELINE_LIMIT_DAILY=数字或范围 定义要保留的每日首张快照的数量。
TIMELINE_LIMIT_WEEKLY=数字或范围 定义要保留的每周首张快照的数量,此处的周由星期一开始。
TIMELINE_LIMIT_MONTHLY=数字或范围 定义要保留的每月首张快照的数量。
TIMELINE_LIMIT_YEARLY=数字或范围 定义要保留的每年首张快照的数量。
TIMELINE_MIN_AGE=秒 定义满足上述条件的快照被清理前最少应保留的时间。0 表示无限制。
无差异快照对 清理没有差异的快照对。如运行 Yast2 后未作任何修改,则自动清理创建的管理快照。 EMPTY_PRE_POST_CLEANUP=yes EMPTY_PRE_POST_CLEANUP=秒 定义无差异快照对被清理前最少应保留的时间。0 表示无限制。
磁盘定额 定义快照可占用空间的百分比 运行snapper setup-quota SPACE_LIMIT=表示百分比的小数 定义快照可占用空间的百分比
  • 仅支持 Btrfs 文件系统
  • 需至少启用编号或时间线清理算法中的一个
  • 启用定额支持后,编号和时间线清理算法的部分参数应当使用范围值。清理算法会清理快照至上限值,如果未满足定额配置则在下限值范围内尽量清理快照以满足定额。

管理配置文件

可以使用 snapper 命令快速管理配置文件:

列出配置文件

snapper list-configs

显示特定的配置文件

snapper -c 配置文件名称 get-config

删除配置文件

snapper -c 配置文件名称 delete-config

快照管理

可以使用 snapper 工具或 Yast2 模块进行查看、创建、比较快照等操作。

snapper 工具

snapper 工具提供了一系列子命令,可以在文本界面进行快照管理。本节介绍了一些常用命令和参数,更多信息可参阅 snapper(8):

man snapper
注意: 管理快照时可使用 「-c 配置文件名」 指定配置文件,如未指定则默认使用 root 配置文件,下述示例均未指定配置文件。

查看快照

snapper list

将列出 root 配置的所有快照。

可以使用 「-t」 参数列出特定类型的快照。

例如,列出 root 配置下的所有快照对:

snapper list -t pre-post

列出 home 配置下的所有单一快照:

snapper -c home -t single

你还可以使用

snapper list -a

列出所有配置下的快照。

创建快照

snapper create

将使用 root 配置文件创建一个单一快照。

可以使用「-t」参数指定快照类型(默认值为 single),使用「-d」参数添加描述。手动创建的快照默认不会自动被清理,使用「--cleanup-algorithm」参数指定自动清理算法。还可以使用「--userdata」参数定义自定义数据(如 important 标记)。

例如,创建当前系统的单一快照,标记为重要,并指定时间线清理算法:

snapper create -t single --description "系统快照" --userdata "important=yes" --cleanup-algorithm timeline

要创建一个快照对,首先创建一个前快照,使用「--print-number」选项以列出快照编号:

snapper create -t pre --print-number --description "Before"

假设列出的快照编号为 30,将其作为「--pre-number」参数的值创建后快照:

snapper create -t post --pre-number 30 --description "After"

你也可以使用

snapper create --command "要运行的命令"

以自动创建运行命令前后的快照对。

比较快照

有两种比较方法:

snapper status <第一个快照编号>..<第二个快照编号> //第一个快照的创建时间要早于第二个

将显示您在两个快照时间内修改的全部文件的路径和文件名。

例如,下述命令可以比较当前系统状态与 161 号快照的差异:

snapper status 161..0 //0 表示当前系统,它不是快照,但你可以认为是比所有快照都新的一个快照。

第二种:

snapper diff <第一个快照编号>..<第二个快照编号> 文件名

将以 diff 的格式显示指定文件的差异,如果未指定文件名,将显示所有文件的差异。

撤销修改

snapper undochange <修改前的快照编号>..<修改后的快照编号> <文件名>

比如你误删除了某个文件,可以使用:

snapper undochange <删除文件前的快照编号>..0 文件名 //0 表示当前系统,它不是快照,但你可以认为是比所有快照都新的一个快照。

来撤销。

删除快照

snapper delete 快照编号或范围

例如,要删除 16 号快照:

snapper delete 16

要删除 10 号到 15 号快照:

snapper delete 10-15

可以结合「-s」参数以在删除快照后立刻释放可用空间而不必等待 Btrfs 进程回收。

回滚整个系统

注意: 要回滚整个系统,请确保根文件系统为 openSUSE 安装程序默认的带子卷的 Btrfs 文件系统。

如果因为更新或病毒等原因导致系统出现重大错误,并保留了错误前的快照,则可以回滚整个系统到错误前的状态。

snapper rollback 要回滚的快照编号

该命令将创建当前系统状态的只读快照 A 及指定编号快照的可读写快照 B,并使用快照 B 替换根分区的默认子卷,重新启动系统后即可实现回滚。

你还可以在引导系统时选择「可引导快照」,以引导想要回滚的快照,在检查无误后在引导的快照中执行:

snapper rollback

不指定快照编号时,将创建根分区默认子卷(即原系统)的只读快照 A 和当前系统(即目前引导的快照)的可读写快照 B,并使用快照 B 替换根分区的默认子卷,重新启动系统后选择默认引导项即可实现回滚。

图形界面

安装 yast2-snapper 可以使用 Snapper 的图形界面。

OpenSUSE snapper.png

可以使用「当前配置」下拉框切换配置文件。

参考文档