赞
踩
snapper用于创建和管理文件系统快照,并在需要时实现回滚,它还可以用于创建用户数据的磁盘备份。snapper使用btrfs文件系统或者精简配置的被格式化成XFS或EXT4的LVM卷。snapper可以通过命令行或YaST来进行管理。
btrfs是一种copy-on-write文件系统,它原生支持subvolumes文件系统快照。subvolumes是物理分区内可单独安装的文件系统。你也可以直接从btrfs快照启动系统。
在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文件系统中删除文件可能无法释放磁盘空间!
快照始终驻留在已拍摄快照的同一分区或子卷上。无法将快照存储在不同的分区或子卷上。因此根分区的磁盘大小决定了能够保存多少份快照,一旦空间不够,系统会自动删除一部分快照(从最旧的开始删除)。
Configuration file: /etc/snapper/configs/root
USE_SNAPPER=yes
TIMELINE_CREATE=no
Configuration file: not created
USE_SNAPPER=no
TIMELINE_CREATE=yes
根据触发它们的事件,快照分为了三种类型:
每小时创建一个快照,旧的快照将会自动被删除。默认情况下,过去10天,一个月和一年的第一份快照将会被保留。默认情况下该快照是关闭的。
安装软件后,会创建一对快照:安装前(pre)的和安装后的(post)。如果是安装比较重要的包比如内核,快照对还会被标记上important
。旧的快照同样会被自动删除。默认情况下,过去的十个重要快照和十个常规快照将会被保留。默认情况下该快照是开启的。
当你使用YaST管理系统时,会创建一对快照:管理前(pre)的和管理后的(post)。旧的快照同样会被自动删除。默认情况下,过去的十个重要快照和十个常规快照将会被保留。默认情况下该快照是开启的。
/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中的第三方软件,而且还是虚拟机映像和数据库的默认位置。因此,创建此子卷是为了从快照中排除所有这些可变数据,并禁用了写时复制。
openSUSE默认提供了通用场景下的快照设置,你也可以根据需要进行修改。
SUSE15:~ # snapper -c root set-config "TIMELINE_CREATE=yes"
SUSE15:~ # snapper -c root set-config "TIMELINE_CREATE=no"
开启该快照功能需要安装软件,安装后自动开启,删除软件后关闭该快照功能
SUSE15:~ # zypper install snapper-zypp-plugin
SUSE15:~ # zypper remove snapper-zypp-plugin
SUSE15:~ # vim /etc/sysconfig/yast2
## Type: list(yes,no)
## Default: "no"
# Enable use of snapper for YaST.
USE_SNAPPER="yes" #设置为yes就是开启,改为no即可关闭,默认是开启状态
安装软件的快照对创建依赖于插件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>
系统支持在根下创建一个新的子卷并永久挂载,但是这样的子卷将会被快照排除掉。你需要确保不在现有快照中创建它,因为回滚后将无法再删除快照。
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
快照会占据大量的磁盘空间,因此为了避免快照占据整个磁盘空间,多余的快照将会自动被删除。默认情况下,系统会保存10个重要的安装和管理快照,以及10个常规的安装和管理快照,如果快照占据了超过50%的分区空间,那么数量会相应的减少,但**至少会保存10个重要快照加2个常规快照**。
快照还支持的文件系统包括XFS、EXT3和EXT4,需要专门为这些文件系统创建一个快照配置。在创建时需要在--fstype="lvm(xfs)"
中指明文件系统名,例如:
SUSE15:~ # snapper -c lvm create-config --fstype="lvm(xfs)" /thin_lvm
snapper还有一个作用是撤销zypper和YaST做的修改,因此在zypper和YaST做修改时,snapper会产生一对快照(修改前和修改后)。也可以用于恢复意外丢失的系统文件。要达到这个目的,需要开启Timeline snapshots
撤销修改和回滚的区别
撤销修改也可以和当前系统状态进行对比,如果所有文件都做了快照,那么实际上撤销修改和回滚就没啥区别了。当然首选的还是回滚,因为回滚允许在操作之前查看系统,并且速度更快。
注意:创建快照时没有机制保证数据的一致性。如果在创建快照的同时写入文件(例如,数据库),就会导致文件损坏或部分写入。恢复这样的文件会导致问题。此外,不得恢复某些系统文件,例如/etc/mtab。因此,强烈建议始终仔细查看已更改文件的列表及其差异。仅还原真正需要还原的操作的文件。
一旦在安装时将根分区配置为btrfs文件系统,针对YaST和zypper的快照就会被自动配置,因此每次操作YaST和zypper时,就会创建一对快照。可以通过YaST中的snapper模块和snapper命令来操作修改的撤销。文件的对比也可以通过命令diff
来进行查看。
在清单里面,还可以看到最后一个快照只有Pre,因为登陆了YaST做操作,而操作还没有完成,因此没有post快照。
这里可以看到所有的修改内容
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
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
:有修改+
:增加的内容-
:删除的内容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/>
如果不指定文件,则会显示所有的修改内容。
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用户和组管理工具删除用户。
timeline snapshot可以帮助你恢复以外删除的文件或是回退文件版本。snapper的diff选项也可以帮你找出具体的修改内容。
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
不指定名字则会保存所有的修改
----openSUSE Leap中的GRUB2可以直接从btrfs快照中引导。只有默认snapper配置(不能修改)创建的快照(root)才能实现引导。
启动快照时,快照中包含的文件系统部分以只读方式挂载; 从快照中排除的所有其他文件系统和部分都以读写方式挂载并且可以修改。
要从可引导快照回滚,必须满足以下要求。进行默认安装时,系统会进行相应设置。
/srv
可能驻留在单独的分区上。snapper rollback
,然后重启系统,选择默认启动项以重新启动到恢复的系统。注意:如果在安装时没有禁用快照,安装完成后会有一个叫做
after installztion
的快照,你可以随时回滚到这个状态。启动系统升级到Service Pack或新的主要版本时,也会创建可引导快照。
在执行回滚之前,会创建正在运行的文件系统的快照。该描述引用了在回滚中恢复的快照的ID。
由回滚创建的快照接收Cleanup属性的值编号。因此,当达到设置的快照数量时,回滚快照会自动删除。如果快照包含重要数据,请在删除之前从快照中提取数据。
在新安装一个系统后,系统中会有如下快照
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 | | | |
启动时选择Start Bootloader from a read-only snapshot,就会看到快照列表,最新的在最前面,可以使用上下箭头进行选择。从引导菜单激活快照不会立即重新启动机器,而是打开所选快照的引导加载程序。
快照的命名格式如下:
[*]OS (KERNEL,DATETTIME,DESCRIPTION)
*
标记--description
选项来添加描述。可以通过修改的方式对现有的自动创建的快照进行描述调整。例如要将快照5的描述修改为post-initial,可以使用命令
snapper modify --userdata "bootloader=post-initial" 5
。自定义的描述不能超过25个字符,否则会无法启动。
由于系统随时在产生临时文件,因此是不可能完全回滚到某一个状态的。
由于根文件系统不可能包含所有的目录,因此这些目录是无法恢复的,因此快照会有如下限制:
附加的和第三方软件可能会在回滚后无法使用,解决的办法只有重新安装应用。
文件访问问题,如果做了快照后应用修改了文件的权限或属组(用户),那么回滚可能会导致应用无法访问这些文件。这样就只能在回滚后重置权限设置。
不兼容的数据格式。如果在做了快照后服务或应用建立了新的数据格式。在回滚后应用可能不能读取收到影响的数据。
混合代码和数据的子卷。一些子卷如/srv
可能既包含代码也包含数据。回滚可能会导致出现无法执行的代码。例如,PHP版本的降级可能会导致Web服务器的PHP脚本损坏。
用户数据。如果回滚导致用户被删除,但相关的数据由于被排除在快照之外而没有被删除。如果系统又创建了相同user ID的用户,那么这个用户将会继承旧的数据,可通过find
命令找到并删除这些文件。
系统无法实现引导加载程序的回滚。
家目录的快照是支持,它支持多种用例:
用户目录都是btrfs目录/home
的子卷,可以手工设置快照。但是更方便的方式是使用pam_snapper
,pam_snapper包安装了pam_snapper.so模块和帮助程序脚本,它们可以自动创建用户和配置Snapper。
pam_snapper
集成了useradd
命令,pam和snapper。它默认会在用户登录和注销时创建快照,并且还会在某些用户长时间保持登录状态时创建基于时间的快照。 通过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命令管理属于自己的快照。
和添加用户一样,也需要先修改脚本,然后再执行删除操作。
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
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
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
来指定自己定义的模板。
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
默认情况下,快照只能由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 |
snapper支持手工创建快照,由于快照都是针对已存在的配置,因此手工创建快照同样需要基于已有的配置。默认情况下,root
配置已经被使用了,因此手工创建快照时,首先需要创建快照配置。
每个快照都有自己的元数据,创建快照时需要指定快照的元数据,修改快照就是在修改快照的元数据。
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
:快照的清理算法。快照有三种类型,它们在物理上没有区别,但Snapper处理它们的方式不同。
snapper提供了三种清理算法,这些算法将会在日常的cron
中执行。可以定义要保留在Snapper配置中的不同类型快照的数量
在命令行下使用snapper create
或者在YaST的Snapper模块下点击Create创建快照。下面是命令行下的快照创建举例。
Snapper只允许修改快照的描述、清理算法和用户数据。通过命令行和YaST都可以完成修改操作。下面是命令行下的举例:
命令行和YaST都可以执行快照删除操作,但是不允许删除当前默认子卷的快照。
使用Snapper删除快照时,释放的空间将被后台运行的Btrfs进程占用。因此,空闲空间的可见性和可用性被延迟。如果想要立即可用,将选项--sync
与删除命令一起使用。
有时Btrfs快照存在,但包含Snapper元数据的XML文件丢失。在这种情况下,快照对Snapper不可见,需要手动删除:
btrfs subvolume delete /.snapshots/SNAPSHOTNUMBER/snapshot
rm -rf /.snapshots/SNAPSHOTNUMBER
如果想删除快照以释放硬盘空间,先删除旧快照。快照越旧,它占用的磁盘空间就越多。
自动清理的目的在于防止快照占据过大的空间,可以结合磁盘配额来做清理,保证根分区有足够的可用空间。
清理编号快照(管理和安装快照对)由Snapper配置的以下参数控制。
上面的三个参数都会被参考,只有当条件都满足,才会清除快照。如果不想考虑某个参数,可以将它设置为0,。
下面的参数可以控制时间线快照的清理:
当你运行了zypper命令或者进入了YaST界面又没有做任何修改时,系统仍然会创建一对快照,只是这对快照的变化为空。使用下面的参数来设置自动清除这些快照:
snapper不会为手工创建的快照提供客户定义的清除算法,但是可以在创建的时候指定算法。如果添加了,快照将会加入你指定算法的清除队列,也可以在创建后修改算法。
你还可以为快照指定配额,通过百分比来表示。btrfs配额应用到子卷而不是用户。除了使用Btrfs配额之外,还可以对用户和组应用磁盘空间配额。
配额是自动启用的,也可以使用命令snapper setup-quota
来手工开启。
配额有由下面的参数来配置:
配额仅在现有数量或时间线清理算法之外被激活。如果没有清理算法处于活动状态,则不会应用配额限制。
启用配额支持后,Snapper将根据需要执行两次清理运行。第一次运行将应用为数量和时间线快照指定的规则。只有在本次运行后超过配额时,才会在第二次运行中应用特定于配额的规则。
即使启用了配额支持,Snapper也将始终保留使用NUMBER_LIMIT*
和TIMELINE_LIMIT*
值指定的快照数量,即使会超出配额。因此,建议为NUMBER_LIMIT*
和TIMELINE_LIMIT*
指定范围值(MIN-MAX),以确保可以应用配额。
例如,如果设置了NUMBER_LIMIT=5-20
,Snapper将执行第一次清理运行并将常规编号快照的数量减少到20。如果这20个快照超过配额,Snapper将删除一个中最旧的快照。第二次运行,直到达到配额。无论它们占用多少空间,都将始终保留至少五个快照。
由于快照会共享当前状态的数据,因此常规的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
从一个服务包升级到另一个服务包会导致快照对占据磁盘的大量的磁盘空间,建议在不需要这个快照后立即删除它以释放磁盘空间。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。