SDB:Snapper 教程
目录
简介
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(详见 https://doc.opensuse.org/documentation/leap/reference/html/book-opensuse-reference/cha-snapper.html#sec-snapper-setup)
- 存储空间小于 16GB(例如,VirtualBox VDI 固定大小磁盘默认为 8Gb,在将 openSUSE/SUSE 部署到物理机之前,可以作为测试平台。)
存储空间小于 16GB | 存储空间小于 16GB |
---|---|
1. 自动创建 /etc/snapper/configs/root (0 single) 配置文件。 |
1. 没有 /etc/snapper/configs/root (0 single) 配置文件。需要使用 snapper 的 create-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 时未开启快照功能,可以使用以下命令创建根分区的默认配置文件:
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=表示百分比的小数 | 定义快照可占用空间的百分比 |
|
管理配置文件
可以使用 snapper 命令快速管理配置文件:
列出配置文件
snapper list-configs
显示特定的配置文件
snapper -c 配置文件名称 get-config
删除配置文件
snapper -c 配置文件名称 delete-config
快照管理
可以使用 snapper 工具或 Yast2 模块进行查看、创建、比较快照等操作。
snapper 工具
snapper 工具提供了一系列子命令,可以在文本界面进行快照管理。本节介绍了一些常用命令和参数,更多信息可参阅 snapper(8):
man snapper
查看快照
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 进程回收。
回滚整个系统
如果因为更新或病毒等原因导致系统出现重大错误,并保留了错误前的快照,则可以回滚整个系统到错误前的状态。
snapper rollback 要回滚的快照编号
该命令将创建当前系统状态的只读快照 A 及指定编号快照的可读写快照 B,并使用快照 B 替换根分区的默认子卷,重新启动系统后即可实现回滚。
你还可以在引导系统时选择「可引导快照」,以引导想要回滚的快照,在检查无误后在引导的快照中执行:
snapper rollback
不指定快照编号时,将创建根分区默认子卷(即原系统)的只读快照 A 和当前系统(即目前引导的快照)的可读写快照 B,并使用快照 B 替换根分区的默认子卷,重新启动系统后选择默认引导项即可实现回滚。
图形界面
安装 yast2-snapper 可以使用 Snapper 的图形界面。
可以使用「当前配置」下拉框切换配置文件。