snapper用于创建和管理文件系统快照,并在需要时实现回滚,它还可以用于创建用户数据的磁盘备份。snapper使用btrfs文件系统或者精简配置的被格式化成XFS或EXT4的LVM卷。snapper可以通过命令行或YaST来进行管理。
btrfs是一种copy-on-write文件系统,它原生支持subvolumes文件系统快照。subvolumes是物理分区内可单独安装的文件系统。你也可以直接从btrfs快照启动系统。
1 默认设置
在openSUSE Leap中,snapper通常用于系统修改的撤销和恢复的工具。默认情况下,系统的根分区被格式化成了btrfs文件系统。如果根分区足够大(大于16G),快照功能是默认开启的。其他分区默认关闭了快照功能。
SUSE15:~ # df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs tmpfs 974M 0 974M 0% /dev/shm
tmpfs tmpfs 390M 12M 379M 3% /run
tmpfs tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/nvme0n1p2 btrfs 28G 6.7G 22G 24% /
/dev/nvme0n1p2 btrfs 28G 6.7G 22G 24% /boot/grub2/i386-pc
/dev/nvme0n1p2 btrfs 28G 6.7G 22G 24% /.snapshots
/dev/nvme0n1p2 btrfs 28G 6.7G 22G 24% /home
/dev/nvme0n1p2 btrfs 28G 6.7G 22G 24% /opt
/dev/nvme0n1p2 btrfs 28G 6.7G 22G 24% /root
/dev/nvme0n1p2 btrfs 28G 6.7G 22G 24% /boot/grub2/x86_64-efi
/dev/nvme0n1p2 btrfs 28G 6.7G 22G 24% /srv
/dev/nvme0n1p2 btrfs 28G 6.7G 22G 24% /tmp
/dev/nvme0n1p2 btrfs 28G 6.7G 22G 24% /var
/dev/nvme0n1p2 btrfs 28G 6.7G 22G 24% /usr/local
tmpfs tmpfs 195M 48K 195M 1% /run/user/1000
tmpfs tmpfs 195M 36K 195M 1% /run/user/0
CentOS7的根分区默认采用了XFS,默认情况下没有开启快照功能。
如果在系统安装时关闭了快照功能,可以通过下面的命令开启:
SUSE15:~ # snapper -c root create-config /
创建快照时,快照和原始快照都指向文件系统中的相同块。因此,最初快照不会占用额外的磁盘空间。如果原始文件系统中的数据被修改,则更改的数据块被复制,而旧的数据块保留用于快照。因此,快照与修改的数据占用的空间量相同。因此,随着时间的推移,快照分配的空间量不断增长。因此,从包含快照的Btrfs文件系统中删除文件可能无法释放磁盘空间!
快照始终驻留在已拍摄快照的同一分区或子卷上。无法将快照存储在不同的分区或子卷上。因此根分区的磁盘大小决定了能够保存多少份快照,一旦空间不够,系统会自动删除一部分快照(从最旧的开始删除)。
1.1 默认设置
- Disks larger than 16 GB
Configuration file: /etc/snapper/configs/root
USE_SNAPPER=yes
TIMELINE_CREATE=no
- Disks smaller than 16 GB
Configuration file: not created
USE_SNAPPER=no
TIMELINE_CREATE=yes
1.2 快照类型
根据触发它们的事件,快照分为了三种类型:
- Timeline Snapshots
每小时创建一个快照,旧的快照将会自动被删除。默认情况下,过去10天,一个月和一年的第一份快照将会被保留。默认情况下该快照是关闭的。
- Installation Snapshots
安装软件后,会创建一对快照:安装前(pre)的和安装后的(post)。如果是安装比较重要的包比如内核,快照对还会被标记上important
。旧的快照同样会被自动删除。默认情况下,过去的十个重要快照和十个常规快照将会被保留。默认情况下该快照是开启的。
- Aministration Snapshots
当你使用YaST管理系统时,会创建一对快照:管理前(pre)的和管理后的(post)。旧的快照同样会被自动删除。默认情况下,过去的十个重要快照和十个常规快照将会被保留。默认情况下该快照是开启的。
1.3 被排除的目录
/boot/grub2/i386-pc, /boot/grub2/x86_64-efi, /boot/grub2/powerpc-ieee1275, /boot/grub2/s390x-emu
boot loader
配置是无法回滚的,这里列出的目录是针对不同硬件架构的boot loader
目录
/home
如果/home
不驻留在单独的分区上,排除掉它是为了避免回滚时数据丢失。
/opt
第三方应用通常安装在该目录下。排除掉它是为了避免回滚时应用被删除。
/srv
该目录包含了web和FTP服务器的数据。排除掉它是为了避免回滚时数据丢失。
/tmp
临时文件夹,没必要做快照。
/usr/local
手工安装软件的目录,排除掉它是为了避免回滚时应用被删除。
/var
该目录包含了很多变量文件,比如日志,缓存,/var/opt中的第三方软件,而且还是虚拟机映像和数据库的默认位置。因此,创建此子卷是为了从快照中排除所有这些可变数据,并禁用了写时复制。
1.4 自定义设置
openSUSE默认提供了通用场景下的快照设置,你也可以根据需要进行修改。
1.4.1 开启和关闭快照
timeline snapshots
SUSE15:~ # snapper -c root set-config "TIMELINE_CREATE=yes"
SUSE15:~ # snapper -c root set-config "TIMELINE_CREATE=no"
installation snapshots
开启该快照功能需要安装软件,安装后自动开启,删除软件后关闭该快照功能
SUSE15:~ # zypper install snapper-zypp-plugin
SUSE15:~ # zypper remove snapper-zypp-plugin
administration snapshots
SUSE15:~ # vim /etc/sysconfig/yast2
## Type: list(yes,no)
## Default: "no"
# Enable use of snapper for YaST.
USE_SNAPPER="yes" #设置为yes就是开启,改为no即可关闭,默认是开启状态
1.4.2 控制installation snapshots
安装软件的快照对创建依赖于插件snapper-zypp-plugin
。配置文件是/etc/snapper/zypp-plugin.conf
。配置文件如下:
SUSE15:~ # cat /etc/snapper/zypp-plugin.conf
<?xml version="1.0" encoding="utf-8"?>
<snapper-zypp-plugin-conf>
<solvables>
#match属性代表使用UNIX shell风格的通配符(w)还是使用python正则表达式(re)
#important属性代表是否被标记为重要快照,这取决于软件包的标记
#括号中间的字符如下一行的kernel-*,用于匹配软件包名,根据match属性的设置,特殊字符会被解释为shell通配符或正则表达式。
<solvable match="w" important="true">kernel-*</solvable>
<solvable match="w" important="true">dracut</solvable>
<solvable match="w" important="true">glibc</solvable>
<solvable match="w" important="true">systemd*</solvable>
<solvable match="w" important="true">udev</solvable>
<solvable match="w">*</solvable> #无条件的匹配所有软件包,注释掉这一行代表非重要的软件安装将不会做快照
</solvables>
</snapper-zypp-plugin-conf>
4.3 创建和挂载新的子卷
系统支持在根下创建一个新的子卷并永久挂载,但是这样的子卷将会被快照排除掉。你需要确保不在现有快照中创建它,因为回滚后将无法再删除快照。
openSUSELeap配置了/@/子卷,它作为/opt、/srv、/home等永久子卷的独立根。您创建和永久安装的任何新子卷都需要在此初始根文件系统中创建。
下面的列子是从/dev/sda2
中新创建一个/usr/important
子卷:
SUSE15:~ # mount /dev/sda2 -o subvol=@ /mnt
SUSE15:~ # btrfs subvolume create /mnt/usr/important
SUSE15:~ # umount /mnt
永久挂载配置
SUSE15:~ # vim /etc/fstab
/dev/sda2 /usr/important btrfs subvol=@/usr/important 0 0
子卷可能包含不断变化的文件,例如虚拟化磁盘映像、数据库文件或日志文件。如果是这样,请考虑禁用此卷的写时复制功能,以避免磁盘块重复。使用/etc/fstab中的nodatacow挂载选项来执行此操作:
/dev/sda2 /usr/important btrfs nodatacow,subvol=@/usr/important 0 0
命令行下的操作:
SUSE15:~ # chatter +C /usr/important
1.4.4 控制快照归档
快照会占据大量的磁盘空间,因此为了避免快照占据整个磁盘空间,多余的快照将会自动被删除。默认情况下,系统会保存10个重要的安装和管理快照,以及10个常规的安装和管理快照,如果快照占据了超过50%的分区空间,那么数量会相应的减少,但**至少会保存10个重要快照加2个常规快照**。
1.4.5 在精简置备LVM卷中使用快照
快照还支持的文件系统包括XFS、EXT3和EXT4,需要专门为这些文件系统创建一个快照配置。在创建时需要在--fstype="lvm(xfs)"
中指明文件系统名,例如:
SUSE15:~ # snapper -c lvm create-config --fstype="lvm(xfs)" /thin_lvm
2 快照用于撤销修改
snapper还有一个作用是撤销zypper和YaST做的修改,因此在zypper和YaST做修改时,snapper会产生一对快照(修改前和修改后)。也可以用于恢复意外丢失的系统文件。要达到这个目的,需要开启Timeline snapshots
撤销修改和回滚的区别
- 撤销修改:当使用撤销修改功能是,系统会比较两个快照的区别,然后取消掉修改的部分。撤销修改还可以只针对某个文件。
- 回滚:整个系统将会恢复到原来快照的状态。
撤销修改也可以和当前系统状态进行对比,如果所有文件都做了快照,那么实际上撤销修改和回滚就没啥区别了。当然首选的还是回滚,因为回滚允许在操作之前查看系统,并且速度更快。
注意:创建快照时没有机制保证数据的一致性。如果在创建快照的同时写入文件(例如,数据库),就会导致文件损坏或部分写入。恢复这样的文件会导致问题。此外,不得恢复某些系统文件,例如/etc/mtab。因此,强烈建议始终仔细查看已更改文件的列表及其差异。仅还原真正需要还原的操作的文件。
2.1 撤销YaST和zypper的修改
一旦在安装时将根分区配置为btrfs文件系统,针对YaST和zypper的快照就会被自动配置,因此每次操作YaST和zypper时,就会创建一对快照。可以通过YaST中的snapper模块和snapper命令来操作修改的撤销。文件的对比也可以通过命令diff
来进行查看。
2.1.1 YaST操作
1.通过root账户进入YaST,打开Miscellaneous(杂项)中的snapper(文件系统快照)模块
2.选择类型为Pre & Post的快照,描述中会显示通过什么工具来造成的修改。
在清单里面,还可以看到最后一个快照只有Pre,因为登陆了YaST做操作,而操作还没有完成,因此没有post快照。
3.选择一对快照,然后点击查看修改
这里可以看到所有的修改内容
4.选择所有,或者某一个文件夹进行恢复
2.1.2 CLI操作
1.首先列出所有的快照
SUSE15:~ # snapper list -t pre-post
Pre # | Post # | Pre Date | Post Date | Description | Userdata
------+--------+--------------------------+--------------------------+--------------+-------------
3 | 4 | Tue Aug 17 16:35:58 2021 | Tue Aug 17 16:36:06 2021 | zypp(zypper) | important=no
5 | 6 | Tue Aug 17 16:51:45 2021 | Tue Aug 17 16:51:55 2021 | zypp(zypper) | important=no
7 | 8 | Tue Aug 17 16:53:16 2021 | Tue Aug 17 16:53:53 2021 | zypp(zypper) | important=no
9 | 10 | Tue Aug 17 17:38:10 2021 | Tue Aug 17 17:39:00 2021 | zypp(zypper) | important=no
11 | 12 | Tue Aug 17 17:39:09 2021 | Tue Aug 17 17:39:10 2021 | zypp(zypper) | important=no
2.查看某一快照的具体修改内容
SUSE15:~ # snapper status 3..4 #需要使用两个ID才能具体匹配某一个快照
c..... /etc/products.d/Leap.prod
+..... /etc/zypp/repos.d/repo-backports-debug-update.repo
+..... /etc/zypp/repos.d/repo-backports-update.repo
+..... /etc/zypp/repos.d/repo-sle-debug-update.repo
+..... /etc/zypp/repos.d/repo-sle-update.repo
c..... /usr/lib/sysimage/rpm/Basenames
c..... /usr/lib/sysimage/rpm/Conflictname
c..... /usr/lib/sysimage/rpm/Dirnames
c..... /usr/lib/sysimage/rpm/Group
c..... /usr/lib/sysimage/rpm/Installtid
c..... /usr/lib/sysimage/rpm/Name
c..... /usr/lib/sysimage/rpm/Obsoletename
c..... /usr/lib/sysimage/rpm/Packages
c..... /usr/lib/sysimage/rpm/Providename
c..... /usr/lib/sysimage/rpm/Recommendname
c..... /usr/lib/sysimage/rpm/Requirename
c..... /usr/lib/sysimage/rpm/Sha1header
c..... /usr/lib/sysimage/rpm/Sigmd5
c..... /usr/lib/sysimage/rpm/Suggestname
快照中总共有三种标记:
c
:有修改+
:增加的内容-
:删除的内容
3.查看具体的修改内容
SUSE15:~ # snapper diff 3..4 /etc/products.d/Leap.prod
--- /.snapshots/3/snapshot/etc/products.d/Leap.prod 2021-05-24 19:41:40.000000000 +0800
+++ /.snapshots/4/snapshot/etc/products.d/Leap.prod 2021-06-04 16:43:53.000000000 +0800
@@ -98,7 +98,7 @@
</buildconfig>
<installconfig>
<defaultlang>en_US</defaultlang>
- <releasepackage name="openSUSE-release" flag="EQ" version="15.3" release="lp153.138.1"/>
+ <releasepackage name="openSUSE-release" flag="EQ" version="15.3" release="lp153.146.1"/>
<distribution>openSUSE</distribution>
</installconfig>
<runtimeconfig/>
如果不指定文件,则会显示所有的修改内容。
4.撤销修改操作
SUSE15:~ # snapper -v undochange 3..4 /etc/products.d/Leap.prod
create:0 modify:1 delete:0
modifying /etc/products.d/Leap.prod
如果不指定文件,则会撤销所有的修改。
不建议通过使用Snapper撤消更改来恢复用户添加。由于某些目录被排除在快照之外,属于这些用户的文件将保留在文件系统中。如果创建了与已删除用户具有相同用户ID的用户,则该用户将继承这些文件。因此强烈建议使用YaST用户和组管理工具删除用户。
2.2 恢复文件
timeline snapshot可以帮助你恢复以外删除的文件或是回退文件版本。snapper的diff选项也可以帮你找出具体的修改内容。
2.2.1 YaST操作
- 从YaST中的“杂项”部分或输入“yast2 Snapper”启动“Snapper*”模块。
- 选择要从中选择快照的“当前配置”。
- 选择要从中恢复文件的时间轴快照,然后选择“显示更改”。时间轴快照的类型为Single,描述值为Timeline。
- 单击文件名,从文本框中选择一个文件。显示了快照版本与当前系统之间的差异。激活复选框以选择要还原的文件。对所有要恢复的文件执行此操作。
2.2.2 CLI操作
- 通过以下命令获取特定配置的时间轴快照列表:
sudo snapper -c CONFIG list -t single | grep timeline
CONFIG需要替换为现有Snapper配置。使用snapper列表配置来显示列表。
- 通过以下命令获取给定快照的更改文件列表:
sudo snapper -c CONFIG status SNAPSHOT_ID..0
将SNAPSHOT_ID替换为要从中恢复文件的快照的ID。
- 可以选择通过运行以下命令列出当前文件版本与快照中的文件版本之间的差异
sudo snapper -c CONFIG diff SNAPSHOT_ID..0 FILE NAME
如果未指定,则会显示所有文件的差异。
4.恢复一个或多个文件
sudo snapper -c CONFIG -v undochange SNAPSHOT_ID..0 FILENAME1 FILENAME2
不指定名字则会保存所有的修改
----3 从快照启动实现回滚
openSUSE Leap中的GRUB2可以直接从btrfs快照中引导。只有默认snapper配置(不能修改)创建的快照(root)才能实现引导。
启动快照时,快照中包含的文件系统部分以只读方式挂载; 从快照中排除的所有其他文件系统和部分都以读写方式挂载并且可以修改。
要从可引导快照回滚,必须满足以下要求。进行默认安装时,系统会进行相应设置。
- 根文件系统必须是btrfs,不支持LVM卷
- 根文件系统必须是一个单独的设备,分区或子卷。快照中排除的部分分区如
/srv
可能驻留在单独的分区上。 - 系统需要能够通过已安装的引导加载程序进行引导。
回滚操作步骤:
- 启动系统后,选择*Bootable snapshots *并选择需要启动的快照,快照会以时间为前缀命名。
- 登陆系统,检查系统工作是否正常。
- 决定是否回滚。
- 如果不想要回滚到这个快照,重启并引导现有的系统,或者是选择其他快照。
- 如果想回滚,执行命令
snapper rollback
,然后重启系统,选择默认启动项以重新启动到恢复的系统。
注意:如果在安装时没有禁用快照,安装完成后会有一个叫做
after installztion
的快照,你可以随时回滚到这个状态。启动系统升级到Service Pack或新的主要版本时,也会创建可引导快照。
3.1 回滚后的快照
在执行回滚之前,会创建正在运行的文件系统的快照。该描述引用了在回滚中恢复的快照的ID。
由回滚创建的快照接收Cleanup属性的值编号。因此,当达到设置的快照数量时,回滚快照会自动删除。如果快照包含重要数据,请在删除之前从快照中提取数据。
3.1.1 回滚快照举例
在新安装一个系统后,系统中会有如下快照
SUSE15:~ # snapper --iso list
# | Type | Pre # | Date | User | Used Space | Cleanup | Description | Userdata
----+--------+-------+---------------------+------+------------+---------+-----------------------+--------------
0 | single | | | root | | | current |
1* | single | | 2021-08-17 15:04:56 | root | 129.47 MiB | | first root filesystem |
2 | single | | 2021-08-17 15:16:30 | root | 24.12 MiB | number | after installation | important=yes
在执行回滚后3号快照会被创建并且包含了回滚前的状态,快照4是新的默认Btrfs子卷,因此是重新启动后的系统。
SUSE15:~ # snapper --iso list
Type | # | | Cleanup | Description | Userdata
-------+---+ ... +---------+-----------------------+--------------
single | 0 | | | current |
single | 1 | | number | first root filesystem |
single | 2 | | number | after installation | important=yes
single | 3 | | number | rollback backup of #1 | important=yes
single | 4 | | | |
3.2 访问和识别快照
启动时选择Start Bootloader from a read-only snapshot,就会看到快照列表,最新的在最前面,可以使用上下箭头进行选择。从引导菜单激活快照不会立即重新启动机器,而是打开所选快照的引导加载程序。
快照的命名格式如下:
[*]OS (KERNEL,DATETTIME,DESCRIPTION)
- 如果快照被标记为important,则会有
*
标记 - 操作系统名称和版本
- 内核版本
- 快照创建日期
- 快照创建时间
- 快照的描述。手工创建的描述可以通过
--description
选项来添加描述。
可以通过修改的方式对现有的自动创建的快照进行描述调整。例如要将快照5的描述修改为post-initial,可以使用命令
snapper modify --userdata "bootloader=post-initial" 5
。自定义的描述不能超过25个字符,否则会无法启动。
3.3 限制条件
由于系统随时在产生临时文件,因此是不可能完全回滚到某一个状态的。
3.3.1 快照排除的目录
由于根文件系统不可能包含所有的目录,因此这些目录是无法恢复的,因此快照会有如下限制:
-
附加的和第三方软件可能会在回滚后无法使用,解决的办法只有重新安装应用。
-
文件访问问题,如果做了快照后应用修改了文件的权限或属组(用户),那么回滚可能会导致应用无法访问这些文件。这样就只能在回滚后重置权限设置。
-
不兼容的数据格式。如果在做了快照后服务或应用建立了新的数据格式。在回滚后应用可能不能读取收到影响的数据。
-
混合代码和数据的子卷。一些子卷如
/srv
可能既包含代码也包含数据。回滚可能会导致出现无法执行的代码。例如,PHP版本的降级可能会导致Web服务器的PHP脚本损坏。 -
用户数据。如果回滚导致用户被删除,但相关的数据由于被排除在快照之外而没有被删除。如果系统又创建了相同user ID的用户,那么这个用户将会继承旧的数据,可通过
find
命令找到并删除这些文件。
3.3.2 引导加载数据无法回滚
系统无法实现引导加载程序的回滚。
4 开启用户家目录快照
家目录的快照是支持,它支持多种用例:
- 个人用户管理自己的快照和回滚
- 系统用户,如想要跟踪配置文件、文档等副本的数据库、系统和网络管理员。
- samba与家目录和btrfs后端共享
用户目录都是btrfs目录/home
的子卷,可以手工设置快照。但是更方便的方式是使用pam_snapper
,pam_snapper包安装了pam_snapper.so模块和帮助程序脚本,它们可以自动创建用户和配置Snapper。
pam_snapper
集成了useradd
命令,pam和snapper。它默认会在用户登录和注销时创建快照,并且还会在某些用户长时间保持登录状态时创建基于时间的快照。 通过Snapper命令或修改配置文件更改默认值。
4.1 安装pam_snapper并创建用户
- 安装软件
SUSE15:~ # zypper in pam_snapper
Loading repository data...
Reading installed packages...
Resolving package dependencies...
The following NEW package is going to be installed:
pam_snapper
1 new package to install.
Overall download size: 27.9 KiB. Already cached: 0 B. After the operation, additional 29.1 KiB
will be used.
Continue? [y/n/v/...? shows all options] (y): y
Retrieving package pam_snapper-0.8.16-1.1.x86_64 (1/1), 27.9 KiB ( 29.1 KiB unpacked)
Retrieving: pam_snapper-0.8.16-1.1.x86_64.rpm ..........................................[done]
Checking for file conflicts: ...........................................................[done]
(1/1) Installing: pam_snapper-0.8.16-1.1.x86_64 ........................................[done
- 添加配置文件
SUSE15:~ # vim /etc/pam.d/common-session
session optional pam_snapper.so #添加到最后一行
- 使用脚本文件创建新用户和家目录,脚本默认是试运行状态,因此需要先关闭。
SUSE15:~ # vim /usr/lib/pam_snapper/pam_snapper_useradd.sh
DRYRUN=0 #默认是1,改为0
修改配置后再执行脚本:
SUSE15:~ # /usr/lib/pam_snapper/pam_snapper_useradd.sh wolf wolf passwd=123456
Create subvolume '/home/wolf'
useradd: warning: the home directory /home/wolf already exists.
useradd: Not copying any file from skel directory into it.
chown: invalid user: ‘wolf.wolf’
- 在用户第一次登陆时,
/etc/skel
文件夹中的文件将会被复制到用户的家目录中,
SUSE15:~ # snapper list --all
Config: home_wolf, subvolume: /home/wolf
# | Type | Pre # | Date | User | Used Space | Cleanup | Description | Userdata
---+--------+-------+--------------------------+------+------------+---------+-------------+-----------------------------------------
0 | single | | | root | | | current |
1 | pre | | Sun Aug 22 20:36:03 2021 | wolf | 16.00 KiB | | pam_snapper | ruser=root, service=su-l, tty=/dev/pts/2
2 | post | 1 | Sun Aug 22 20:36:06 2021 | wolf | 16.00 KiB | | pam_snapper | ruser=root, service=su-l, tty=/dev/pts/2
由于已经使用wolf登陆过一次系统,因此创建了两个快照。wolf用户可以通过snapper命令管理属于自己的快照。
4.2 删除用户
和添加用户一样,也需要先修改脚本,然后再执行删除操作。
SUSE15:~ # vim /usr/lib/pam_snapper/pam_snapper_userdel.sh
DRYRUN=0 #默认是1,改为0
执行删除:
SUSE15:~ # /usr/lib/pam_snapper/pam_snapper_userdel.sh jack
Delete subvolume (no-commit): '/home/jack'
no crontab for jack
userdel: jack home directory (/home/jack) not found
4.3 手工开启家目录快照
SUSE15:~ # btrfs subvolume create /home/jack
Create subvolume '/home/jack'
SUSE15:~ # snapper -c home_jack create-config /home/jack
SUSE15:~ # sed -i -e "s/ALLOW_USERS=\"\"/ALLOW_USERS=\"jack\"/g" /etc/snapper/configs/home_jack
SUSE15:~ # yast users add username=jack home=/home/jack password=123456
SUSE15:~ # chown jack.jack /home/jack
SUSE15:~ # chmod 755 /home/jack/.snapshots
5 创建和修改snapper配置
snapper的配置文件统一存放在/etc/snapper/configs/
下,其中root为默认创建的,主要针对YaST和zypper的操作,当根分区磁盘空间足够大时就会自动创建。
你也可以为挂载到btrfs格式子卷下的任何目录创建自己定义的快照配置,
SUSE15: # snapper -c tmp-data create-config /tmp #-c后面跟配置名称,最后跟目录
SUSE15: # ls /etc/snapper/configs/
home_jack home_wolf root tmp-data
配置将会根据模板
/etc/snapper/config-templates/default
来进行创建。也可以使用-t
来指定自己定义的模板。
5.1 管理已有的配置
snapper提供了很多子命令来管理配置。
列出配置
SUSE15:/opt # snapper list-configs
Config | Subvolume
----------+-----------
home_jack | /home/jack
home_wolf | /home/wolf
root | /
tmp-data | /tmp
查看配置
SUSE15:/opt # snapper -c home_wolf get-config
Key | Value
-----------------------+-----------
ALLOW_GROUPS |
ALLOW_USERS | wolf
BACKGROUND_COMPARISON | yes
EMPTY_PRE_POST_CLEANUP | yes
EMPTY_PRE_POST_MIN_AGE | 1800
FREE_LIMIT | 0.2
FSTYPE | btrfs
NUMBER_CLEANUP | yes
NUMBER_LIMIT | 50
NUMBER_LIMIT_IMPORTANT | 10
NUMBER_MIN_AGE | 1800
QGROUP |
SPACE_LIMIT | 0.5
SUBVOLUME | /home/wolf
SYNC_ACL | no
TIMELINE_CLEANUP | yes
TIMELINE_CREATE | yes
TIMELINE_LIMIT_DAILY | 10
TIMELINE_LIMIT_HOURLY | 10
TIMELINE_LIMIT_MONTHLY | 10
TIMELINE_LIMIT_WEEKLY | 0
TIMELINE_LIMIT_YEARLY | 10
TIMELINE_MIN_AGE | 1800
修改配置
根据列出来的配置中的选项,修改其参数:
SUSE15:/opt # snapper -c home_wolf set-config NUMBER_LIMIT=20
SUSE15:/opt # snapper -c home_wolf get-config
Key | Value
-----------------------+-----------
ALLOW_GROUPS |
ALLOW_USERS | wolf
BACKGROUND_COMPARISON | yes
EMPTY_PRE_POST_CLEANUP | yes
EMPTY_PRE_POST_MIN_AGE | 1800
FREE_LIMIT | 0.2
FSTYPE | btrfs
NUMBER_CLEANUP | yes
NUMBER_LIMIT | 20 #默认为50,已经修改成了20
NUMBER_LIMIT_IMPORTANT | 10
NUMBER_MIN_AGE | 1800
QGROUP |
SPACE_LIMIT | 0.5
SUBVOLUME | /home/wolf
SYNC_ACL | no
TIMELINE_CLEANUP | yes
TIMELINE_CREATE | yes
TIMELINE_LIMIT_DAILY | 10
TIMELINE_LIMIT_HOURLY | 10
TIMELINE_LIMIT_MONTHLY | 10
TIMELINE_LIMIT_WEEKLY | 0
TIMELINE_LIMIT_YEARLY | 10
TIMELINE_MIN_AGE | 1800
删除配置
SUSE15:/opt # snapper -c home_jack delete-config
SUSE15:/opt # snapper list-configs
Config | Subvolume
----------+-----------
home_wolf | /home/wolf
root | /
tmp-data | /tmp
5.1.1 配置数据
1. ALLOW_GROUPS, ALLOW_USERS - 授予普通用户使用快照的权限。默认值为空。2. BACKGROUND_COMPARISON - 定义在创建快照后,快照对是否在后台被比较。默认为`Yes`
3. EMPTY_* - 定义具有相同前后快照的快照对的清理算法
4. FSTYPE - 分区的文件系统类型,不要修改它。默认为`btrfs`
5. NUMBER_* - 定义安装和管理快照的清理算法
6. QGROUP/SPACE_LIMIT - 为清理算法添加配额支持
7. SUBVOLUME - 分区或子卷快照的挂载点,不要修改它。默认是`/`
8. SYNC_ACL - 如果快照用在常规用户上,该用户必须能够访问`.snapshot`目录和读取里面的文件。如果设置为`yes`,Snapper会自动使用来自ALLOW_USERS或ALLOW_GROUPS条目的用户和组的ACL来访问它们。默认值是`no`
9. TIMELINE_CREATE - 如果设置为`yes`,每小时会创建一个快照。默认值为`no`
10. TIMELINE_CLEANUP/TIMELINE_LIMIT_* - 为基于时间的快照定义清理算法
5.1.2 普通用户使用snapper
默认情况下,快照只能由root
用户使用,但是总会有一些使用需求:
- 网站的管理员想要为
/srv/www
创建快照 - 用户想为自己的家目录创建快照
可以创建快照配置,为用户/组添加相关的权限,并保证用户/组能够访问快照数据。最好的办法就是将SYNC_ACL
选项设置为yes
。
操作步骤(注意需要使用root用户执行以下操作):
- 创建配置
SUSE15: # snapper -c tmp-data create-config /tmp
-
根据需要调整配置参数
-
通过设置
ALLOW_USERS``ALLOW_GROUPS
来给用户/组授权,多个条目使用空格隔开。
SUSE15:/opt # snapper -c tmp-data set-config ALLOW_USERS=wolf SYNC_ACL="yes"
- 查看配置
wolf@SUSE15:~> snapper -c tmp-data list
# | 类型 | 前期 # | 日期 | 用户 | 已用空间 | 清空 | 描述 | 用户数据
---+--------+--------+------+------+----------+------+---------+---------
0 | single | | | root | | | current |
6 手工创建和管理快照
snapper支持手工创建快照,由于快照都是针对已存在的配置,因此手工创建快照同样需要基于已有的配置。默认情况下,root
配置已经被使用了,因此手工创建快照时,首先需要创建快照配置。
6.1快照元数据
每个快照都有自己的元数据,创建快照时需要指定快照的元数据,修改快照就是在修改快照的元数据。
snapper --config root list
- 列出基于该配置创建的所有快照(由于root是默认配置,因此这里可以省去)。
snapper list -a
- 列出基于所有存在的配置创建的所有快照。
snapper list -t pre-post
- 列出所有的基于默认配置的pre and post快照
snapper list -t single
- 列出所有的基于默认配置的single快照
以下元数据可用于每个快照:
Type
:快照类型,不可修改。Number
:快照的唯一编号,不可修改Pre Number
:指定对应的pre快照编号。 仅适用于post类型的快照。不可修改Description
:快照描述Userdata
:指定用户数据的扩展描述,使用逗号隔开。例如reason=testing, project=foo
,也用来标示快照是否重要,以及列出快照的创建者。Cleanup-Algorithm
:快照的清理算法。
6.1.1 快照类型
快照有三种类型,它们在物理上没有区别,但Snapper处理它们的方式不同。
- pre - 文件系统修改前的快照。每个快照都会对应一个post快照
- post - 文件系统修改后的快照。每个快照都会对应一个pre快照
- single - 单独的快照,这是快照创建的默认类型。
6.1.2 清理算法
snapper提供了三种清理算法,这些算法将会在日常的cron
中执行。可以定义要保留在Snapper配置中的不同类型快照的数量
- number - 达到一定的数量后删除旧的快照
- timeline - 超出一定的时限后删除旧的快照,但保留几个每小时、每天、每月和每年的快照。
- empty-pre-post - 删除两者无差异的pre/post快照
6.2 创建快照
在命令行下使用snapper create
或者在YaST的Snapper模块下点击Create创建快照。下面是命令行下的快照创建举例。
- snapper create --from 17 --description "with package2" 从现有的快照(指定了id为17)创建一个single类型的独立快照
- snapper create --description "Snapshot for week 2 2014" 根据默认配置创建一个带有描述的single类型的独立快照,由于没有指定清理算法,因此该快照永远不会被删除
- snapper --config home create --description "Cleanup in ~tux" 根据配置home创建一个带有描述的single类型的独立快照,由于没有指定清理算法,因此该快照永远不会被删除
- snapper --config home create --description "Daily data backup" --cleanup-algorithm timeline> 根据配置home创建一个带有描述的single类型的独立快照,当快照满足为配置中的时间线清理算法指定的条件时,将自动删除该快照。
- snapper create --type pre --print-number --description "Before the Apache config cleanup" --userdata "important=yes" 创建一个类型为pre的快照,并输出快照编号。这是创建用于保存“before”和“after”状态的一对快照所需的第一个命令。快照会被标记为重要
- snapper create --type post --pre-number 30 --description "After the Apache config cleanup" --userdata "important=yes" 创建一个和ID号为30的pre快照配对的post快照,这是创建用于保存“before”和“after”状态的一对快照所需的第二个命令。快照会被标记为重要
- snapper create --command *COMMAND* --description "Before and after COMMAND" 在运行*COMMAND*命令的前后自动创建一对快照。这种创建方式只能在命令行下使用。
6.3 修改快照元数据
Snapper只允许修改快照的描述、清理算法和用户数据。通过命令行和YaST都可以完成修改操作。下面是命令行下的举例:
- snapper modify --cleanup-algorithm "timeline" 10 修改快照的清理算法
- snapper --config home modify --description "daily backup" -cleanup-algorithm "timeline" 120 修改快照的清理算法和描述
6.4 删除快照
命令行和YaST都可以执行快照删除操作,但是不允许删除当前默认子卷的快照。
使用Snapper删除快照时,释放的空间将被后台运行的Btrfs进程占用。因此,空闲空间的可见性和可用性被延迟。如果想要立即可用,将选项--sync
与删除命令一起使用。
- snapper delete 65 删除一个快照
- snapper -c home delete 89 90 删除指定配置下的两个快照
- snapper delete --sync 23 删除快照并立即释放空间
有时Btrfs快照存在,但包含Snapper元数据的XML文件丢失。在这种情况下,快照对Snapper不可见,需要手动删除:
btrfs subvolume delete /.snapshots/SNAPSHOTNUMBER/snapshot
rm -rf /.snapshots/SNAPSHOTNUMBER
如果想删除快照以释放硬盘空间,先删除旧快照。快照越旧,它占用的磁盘空间就越多。
7 快照自动清理
自动清理的目的在于防止快照占据过大的空间,可以结合磁盘配额来做清理,保证根分区有足够的可用空间。
7.1 清理编号的快照
清理编号快照(管理和安装快照对)由Snapper配置的以下参数控制。
- NUMBER_CLEANUP 开启或关闭安装和管理快照对的清理。如果开启,当快照的数量超出设置的值后就会自动清理。默认值是`yes`
- NUMBER_LIMIT/NUMBER_LIMIT_IMPORTANT 定义最多保留多少个快照,第一个参数的默认值是2-10,第二个参数的默认值是4-10。清理算法会删除超过指定最大值的快照,而不考虑快照和文件系统空间。算法还会删除高于最小值的快照,直到达到快照和文件系统的限制。如果禁用配额支持,则需要提供一个常量值,例如 10,否则清理将失败并显示错误。
- NUMBER_MIN_AGE 定义快照在自动删除之前必须具有的最短时间(以秒为单位)。 无论存在多少快照,都不会删除小于此处指定值的快照。默认值是1800
上面的三个参数都会被参考,只有当条件都满足,才会清除快照。如果不想考虑某个参数,可以将它设置为0,。
7.2 清理时间线快照
下面的参数可以控制时间线快照的清理:
- TIMELINE_CLEANUP 开启或关闭时间线快照对的清理。如果开启,当快照的数量超出设置的值后就会自动清理。默认值是`yes`
- TIMELINE_LIMIT_DAILY,TIMELINE_LIMIT_HOURLY,TIMELINE_LIMIT_MONTHLY,TIMELINE_LIMIT_WEEKLY,TIMELINE_LIMIT_YEARLY 定义小时、日、月和年快照保留的数量,默认值是10。基于周的快照默认值是0。
- TIMELINE_MIN_AGE 定义快照在自动删除之前必须具有的最短时间。默认值是1800
7.3 清理没有变化的快照对
当你运行了zypper命令或者进入了YaST界面又没有做任何修改时,系统仍然会创建一对快照,只是这对快照的变化为空。使用下面的参数来设置自动清除这些快照:
- EMPTY_PRE_POST_CLEANUP 如果设置为yes,那么无变化的快照对将会被删除,默认值为yes
- EMPTY_PRE_POST_MIN_AGE 定义快照在自动删除之前必须具有的最短时间。默认值是1800
7.4 清理手工创建的快照
snapper不会为手工创建的快照提供客户定义的清除算法,但是可以在创建的时候指定算法。如果添加了,快照将会加入你指定算法的清除队列,也可以在创建后修改算法。
- snapper create --description "Test" --cleanup-algorithm number 创建一个单独的快照并指定了number清除算法
- snapper modify --cleanup-algorithm "timeline" 25 修改ID为25的快照清除算法为timeline
7.5 磁盘配额
你还可以为快照指定配额,通过百分比来表示。btrfs配额应用到子卷而不是用户。除了使用Btrfs配额之外,还可以对用户和组应用磁盘空间配额。
配额是自动启用的,也可以使用命令snapper setup-quota
来手工开启。
配额有由下面的参数来配置:
- QGROUP Snapper使用的Btrfs配额组,如果没有设置,运行`snapper setup-quota`。如果已经设置,只有在熟悉`man 8 btrfs-qgroup`的情况下才能更改。此值是使用`snapper setup-quota`设置的,不应更改。
- SPACE_LIMIT 限制的配置,以小数表示(如0.1表示10%)
配额仅在现有数量或时间线清理算法之外被激活。如果没有清理算法处于活动状态,则不会应用配额限制。
启用配额支持后,Snapper将根据需要执行两次清理运行。第一次运行将应用为数量和时间线快照指定的规则。只有在本次运行后超过配额时,才会在第二次运行中应用特定于配额的规则。
即使启用了配额支持,Snapper也将始终保留使用NUMBER_LIMIT*
和TIMELINE_LIMIT*
值指定的快照数量,即使会超出配额。因此,建议为NUMBER_LIMIT*
和TIMELINE_LIMIT*
指定范围值(MIN-MAX),以确保可以应用配额。
例如,如果设置了NUMBER_LIMIT=5-20
,Snapper将执行第一次清理运行并将常规编号快照的数量减少到20。如果这20个快照超过配额,Snapper将删除一个中最旧的快照。第二次运行,直到达到配额。无论它们占用多少空间,都将始终保留至少五个快照。
8 显示快照占用的磁盘空间
由于快照会共享当前状态的数据,因此常规的du
和df
命令不能查看快照具体占用的空间大小。当需要释放Btrfs上的磁盘空间时,需要知道每个快照使用了多少独占磁盘空间,而不是共享空间。Snapper 0.6及更高版本在“已用空间”列中报告每个快照的已用磁盘空间:
SUSE15:~ # snapper --iso list
# | Type | Pre # | Date | User | Used Space | Cleanup | Description | Userdata
----+--------+-------+---------------------+------+------------+---------+-----------------------+--------------
0 | single | | | root | | | current |
1* | single | | 2021-08-17 15:04:56 | root | 708.00 KiB | | first root filesystem |
2 | single | | 2021-08-17 15:16:30 | root | 97.22 MiB | number | after installation | important=yes
5 | pre | | 2021-08-17 16:51:45 | root | 224.00 KiB | number | zypp(zypper) | important=no
6 | post | 5 | 2021-08-17 16:51:55 | root | 512.00 KiB | number | | important=no
7 | pre | | 2021-08-17 16:53:16 | root | 48.00 KiB | number | zypp(zypper) | important=no
8 | post | 7 | 2021-08-17 16:53:53 | root | 2.48 MiB | number | | important=no
9 | pre | | 2021-08-17 17:38:10 | root | 176.00 KiB | number | zypp(zypper) | important=no
10 | post | 9 | 2021-08-17 17:39:00 | root | 1.74 MiB | number | | important=no
11 | pre | | 2021-08-17 17:39:09 | root | 64.00 KiB | number | zypp(zypper) | important=no
12 | post | 11 | 2021-08-17 17:39:10 | root | 1.54 MiB | number | | important=no
13 | pre | | 2021-08-22 16:14:22 | root | 136.57 MiB | number | yast snapper |
14 | pre | | 2021-08-22 20:28:38 | root | 112.00 KiB | number | zypp(zypper) | important=no
15 | post | 14 | 2021-08-22 20:28:41 | root | 316.00 KiB | number | | important=no
16 | pre | | 2021-08-22 20:45:24 | root | 336.00 KiB | number | yast users |
17 | post | 16 | 2021-08-22 20:45:35 | root | 304.00 KiB | number | |
btrfs
命令也提供了类似的功能:
SUSE15:~ # btrfs qgroup show -p /
qgroupid rfer excl parent
-------- ---- ---- ------
0/5 16.00KiB 16.00KiB ---
0/256 16.00KiB 16.00KiB ---
0/257 180.59MiB 180.59MiB ---
0/258 40.00KiB 40.00KiB ---
0/259 192.00KiB 192.00KiB ---
0/260 16.00KiB 16.00KiB ---
0/261 10.48MiB 10.48MiB ---
0/262 16.00KiB 16.00KiB ---
0/263 34.95MiB 34.95MiB ---
0/264 16.00KiB 16.00KiB ---
0/265 2.51MiB 2.51MiB ---
0/266 160.00KiB 160.00KiB ---
0/267 5.69GiB 708.00KiB ---
0/275 5.68GiB 97.22MiB 1/0
0/278 5.69GiB 224.00KiB 1/0
0/279 5.69GiB 512.00KiB 1/0
0/280 5.69GiB 48.00KiB 1/0
0/281 5.69GiB 2.48MiB 1/0
0/283 5.69GiB 176.00KiB 1/0
0/284 5.70GiB 1.74MiB 1/0
0/285 5.69GiB 64.00KiB 1/0
0/286 5.69GiB 1.54MiB 1/0
0/288 5.70GiB 136.57MiB 1/0
0/289 5.69GiB 112.00KiB 1/0
0/290 5.69GiB 316.00KiB 1/0
0/291 16.00KiB 16.00KiB ---
0/292 16.00KiB 16.00KiB ---
0/293 0.00B 0.00B ---
0/294 0.00B 0.00B ---
0/295 16.00KiB 16.00KiB ---
0/296 16.00KiB 16.00KiB ---
0/297 16.00KiB 16.00KiB ---
0/298 0.00B 0.00B ---
0/299 5.69GiB 336.00KiB 1/0
0/300 5.69GiB 304.00KiB 1/0
0/302 16.00KiB 16.00KiB ---
0/303 16.00KiB 16.00KiB ---
0/304 16.00KiB 16.00KiB ---
0/305 16.00KiB 16.00KiB ---
0/306 16.00KiB 16.00KiB ---
0/307 48.00KiB 48.00KiB ---
0/308 16.00KiB 16.00KiB ---
0/309 48.00KiB 48.00KiB ---
1/0 6.59GiB 924.74MiB ---
qgroupid
显示子卷的识别号rfer
显示子卷中引用的数据总量excl
显示每个子卷中的独占数据。parent
显示子卷的父 qgroup
最后一项1/0显示父qgroup的总数。在上面的示例中,如果删除所有子卷,将释放924.97MiB。运行以下命令以查看哪些快照与每个子卷相关联:
SUSE15:~ # btrfs subvolume list -st /
ID gen cgen top level otime path
-- --- ---- --------- ----- ----
275 69 69 266 2021-08-17 15:16:30 @/.snapshots/2/snapshot
278 215 215 266 2021-08-17 16:51:45 @/.snapshots/5/snapshot
279 218 218 266 2021-08-17 16:51:55 @/.snapshots/6/snapshot
280 222 222 266 2021-08-17 16:53:16 @/.snapshots/7/snapshot
281 227 226 266 2021-08-17 16:53:53 @/.snapshots/8/snapshot
283 283 283 266 2021-08-17 17:38:10 @/.snapshots/9/snapshot
284 287 287 266 2021-08-17 17:39:00 @/.snapshots/10/snapshot
285 289 289 266 2021-08-17 17:39:09 @/.snapshots/11/snapshot
286 292 292 266 2021-08-17 17:39:10 @/.snapshots/12/snapshot
288 2248 2248 266 2021-08-22 16:14:22 @/.snapshots/13/snapshot
289 2435 2435 266 2021-08-22 20:28:38 @/.snapshots/14/snapshot
290 2438 2438 266 2021-08-22 20:28:41 @/.snapshots/15/snapshot
295 2460 2460 292 2021-08-22 20:36:03 @/home/wolf/.snapshots/1/snapshot
296 2462 2462 292 2021-08-22 20:36:06 @/home/wolf/.snapshots/2/snapshot
299 2493 2493 266 2021-08-22 20:45:24 @/.snapshots/16/snapshot
300 2495 2495 266 2021-08-22 20:45:35 @/.snapshots/17/snapshot
302 2517 2517 292 2021-08-22 21:00:20 @/home/wolf/.snapshots/3/snapshot
304 2583 2583 292 2021-08-22 21:52:30 @/home/wolf/.snapshots/4/snapshot
305 2588 2588 292 2021-08-22 21:53:01 @/home/wolf/.snapshots/5/snapshot
306 2599 2599 292 2021-08-22 22:00:25 @/home/wolf/.snapshots/6/snapshot
307 2602 2601 303 2021-08-22 22:00:25 @/tmp/.snapshots/1/snapshot
308 2679 2679 292 2021-08-22 23:00:25 @/home/wolf/.snapshots/7/snapshot
309 2682 2681 303 2021-08-22 23:00:25 @/tmp/.snapshots/2/snapshot
从一个服务包升级到另一个服务包会导致快照对占据磁盘的大量的磁盘空间,建议在不需要这个快照后立即删除它以释放磁盘空间。