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