为什么要使用Snapper快照?

我们可以想像以下场景:
1. 场景一:系统发生意外宕机,工程师无法快速定位问题,业务受到中断,客户十分不满意。
2. 场景二:项目会议上,就是否升级某软件到最新版本,A和B争执不断,A认为为了保持与其他软件的兼容性不能轻易升级,B认为升级能充分利用软件包的最新功能以及享受到新版本性能的提升
3. 场景三:数据库突然无法访问了,导致业务中断,工程师A和B因为追究责任争得不可开交,A说是B修改了某项配置导致的,B反驳说我的配置都是正确的,不可能出错。

但是Snapper可以轻松帮你解决以上烦恼:
1. 使用Snapper定期做系统备份,系统发生意外宕机可以快速回溯到之前的正常状态。
2. 可以使用Snapper来安装/升级软件,在安装/升级前后做快照,如果安装/升级失败,就可以快速的恢复系统到正常状态
3. 大型软件项目的部署配置,Snapper可以帮助快速定位哪些配置文件做了改动,帮助定位错误,并快速撤销配置文件的修改。

关于Snapper,Linux User & Developer Magazine中如是说:”感谢Snapper,我们才可以肆无忌惮的折腾系统配置以及安装/更新软件,从旧的备份中恢复成为了过去式,也不用再为会丢失文件而提心吊胆,你只需要利用快照就可以从坏点恢复到好点。

快照工具Snapper

快照是对卷在某一点上进行拷贝,提供了一种恢复文件系统到之前状态的一种方法。Snapper是一个用来创建和维护快照的命令行工具,提供了基本的快照工具:创建、删除快照;对比快照之间的变化,以及撤销快照之间的操作。

目前Snapper可以为以下文件系统类型创建快照:

  • btrfs
  • 在thinly-provisioned LVM之上创建的ext3、ext4、xfs文件系统

Snapper是一个开源的项目,它基于GPLv2.0发布。Snapper是由SUSE发起并维护。
- Snapper官方博客为: http://snapper.io/
- Snapper源码发布在github: https://github.com/openSUSE/snapper
- Snapper GUI(目前仅支持btrfs、ext4、精简LVM):https://github.com/ricardomv/snapper-gui
Snapper-gui尚在开发阶段,功能不甚完善,有关介绍请参考另一篇博文:技术预览:利用Snapper GUI管理系统快照

SUSE快照方案为:
- YaST/Zypper + Snapper + btrfs或thin-provisioning LVM
通过提供了YaST/Zypper界面化操作和Snapper命令行;

CentOS快照方案为:
- Snapper + btrfs或thin-provisioning LVM
提供Snapper命令行操作,用户可以体验一下如何使用开源的Snapper GUI作为上层界面,但功能尚不完善。

为Btrfs文件系统创建快照

创建Btrfs分区

首先,我们以btrfs文件系统为例,来利用Snapper创建快照;
如果想为普通的btrfs文件系统创建快照,需要先创建并挂载btrfs文件系统:

  1. 创建btrfs文件系统

    # mkfs.btrfs /dev/sdb
  2. 挂载btrfs文件系统

    # mount /dev/sdb /mnt

如果想利用快照保护根分区,需要在安装时选择btrfs作为根分区,因为CentOS 7 根分区默认是xfs文件系统,所以在安装过程选择btrfs作为根分区默认文件系统即可。

创建快照时,快照与原始点都会指向文件系统中的同一个块。因此一开始时快照并不占用额外的磁盘空间。但如果修改了原始文件系统中的数据,则会复制已更改的数据块,同时将旧的数据块作为快照保留。因此,快照就将占用与已修改数据相同的空间。所以久而久之,分配给快照的空间便会不断增长。因此,包含快照的分区需要比常规分区大才行。确切的空间大小主要取决于要保留的快照数量以及数据更改量。一般来说,应考虑使用两倍于常规使用磁盘空间的空间大小。

  1. 选择“I will configure partitioning”,点击“Done”进入下一步:

  2. 点击“Click here to creat them automatically”自动添加,或者点击“+”手动添加:

  3. 修改根分区的文件系统类型为Btrfs:

  4. 完成以上,安装后生成的根分区文件系统如下:

安装snapper

执行以下命令安装snapper:

# yum install snapper

安装完成以后检查一下,确保安装成功

# rpm -qa | grep snapper

创建配置文件 ###

接下来一步步创建快照,Snapper需要为每一个卷创建一个配置文件,配置文件定义了快照的创建和维护规则,执行以下命令为我们的根文件系统创建一个名为btrfs_config的配置文件:

// snapper -c config_name create-config -f btrfs /mount-point
# snapper -c btrfs_config create-config -f btrfs /

创建的配置文件一般是从/etc/snapper/config-templates/default拷贝,并在/etc/snapper/configs/文件夹下生成,我们可以看到新生成的配置文件如下,目前配置文件先采用默认设置,暂不修改其内容:

# ls /etc/snapper/configs/
btrfs_config

创建快照

快照类型

尽管不同的快照本身并无区别,但根据生成快照的不同情形将它们分成以下三类:
- pre
修改前的文件系统快照。每一张前快照都有一个对应的post快照。

  • post
    修改后的文件系统快照。每一张后快照都有一个对应的pre快照。

  • single
    独立的快照。目的之一就是为了自动创建每小时快照。此为创建快照时的默认类型。

创建pre或者post快照

可以单独创建pre和post快照,比如我们先创建一个pre快照,-p的含义是创建快照的同时,打印出快照编号:

# snapper -c btrfs_config create -t pre -p
1

# snapper -c btrfs_config list
Type   | # | Pre # | Date                            | User | Cleanup  | Description | Userdata
-------+---+-------+---------------------------------+------+----------+-------------+---------
single | 0 |       |                                 | root |          | current     |         
pre    | 1 |       | Wed 08 Jun 2016 11:28:09 AM EDT | root |          |             |

之后我们可能会执行一些系统操作,比如我们安装了一个软件包,根分区文件系统内容会有一些变化

yum install net-tools

我们可以在创建一个post快照:

# snapper -c btrfs_config create -t post --pre-num 1 -p
2

# snapper -c btrfs_config list
Type   | # | Pre # | Date                            | User | Cleanup  | Description | Userdata
-------+---+-------+---------------------------------+------+----------+-------------+---------
single | 0 |       |                                 | root |          | current     |         
pre    | 1 |       | Wed 08 Jun 2016 11:28:09 AM EDT | root |          |             |         
post   | 2 | 1     | Wed 08 Jun 2016 12:26:19 PM EDT | root |          |             |

编号为1和2的快照就组成了一个快照对,记录了在安装net-tools前后的根分区变化,通过以下命令查看这些变化:

# snapper -c btrfs_config status 1..2
+..... /usr/bin/netstat
+..... /usr/lib/systemd/system/arp-ethers.service
+..... /usr/sbin/arp
+..... /usr/sbin/ether-wake
+..... /usr/sbin/ifconfig
+..... /usr/sbin/ipmaddr
+..... /usr/sbin/iptunnel
+..... /usr/sbin/mii-diag
+..... /usr/sbin/mii-tool
+..... /usr/sbin/nameif
+..... /usr/sbin/plipconfig
+..... /usr/sbin/route
+..... /usr/sbin/slattach
+..... /usr/share/doc/net-tools-2.0
+..... /usr/share/doc/net-tools-2.0/copYING
(略...)
+..... /usr/share/man/pt/man8/route.8.gz
c..... /var/cache/yum/x86_64/7/timedhosts
c..... /var/lib/rpm/Basenames
c..... /var/lib/rpm/Dirnames
(略...)
+..... /var/lib/yum/yumdb/n/6a2a1ded37167c106d2be6dbec20003079f37cf6-net-tools-2.0-0.17.20131004git.el7-x86_64/var_infra
+..... /var/lib/yum/yumdb/n/6a2a1ded37167c106d2be6dbec20003079f37cf6-net-tools-2.0-0.17.20131004git.el7-x86_64/var_uuid
c..... /var/log/audit/audit.log
c..... /var/log/cron
c..... /var/log/messages
c..... /var/log/snapper.log
c..... /var/log/yum.log

“+”号代表新增文件,“-”代表删除文件,“c”代表修改了文件,与diff语法相同。

为快照添加描述和用户数据

创建pre类型的快照并打印快照编号,该快照标记为important,且为其添加描述以方便以后查询:

# snapper create --type pre --print-number --description "Before install net-tools"--userdata "important=yes"

创建post类型的快照,其对应的pre快照编号为1,该快照标记为important,且为其添加描述以方便以后查询:

# snapper create --type post --pre-number 1 --description "After install net-tools" --userdata "important=yes"

以上操作也可以合并成一个命令:

# snapper -c btrfs_config create --command "yum install net-tools"

查看快照 ###

由于默认配置中,启动了自动快照功能,自动记录整点的快照,也即类型为single的timeline快照,我们可以看到Snapper自动生成了一个标号为3的快照(注:如果每小时生成一个快照,过不了多久我们的系统就会被快照占满,就会因存储空间不足而崩溃,所以不可能无限制的生成快照,这就是配置文件中快照清理规则的作用了,仅会保留有限个数的当年、当月、当日快照,后面会详细讲解,这里仅做预览。)

# snapper -c btrfs_config list
Type   | #  | Pre # | Date                            | User | Cleanup  | Description | Userdata
-------+----+-------+---------------------------------+------+----------+-------------+---------
single | 0  |       |                                 | root |          | current     |         
pre    | 1  |       | Wed 08 Jun 2016 01:15:16 PM EDT | root |          |             |         
post   | 2  | 1     | Wed 08 Jun 2016 01:15:21 PM EDT | root |          |             |         
single | 3  |       | Wed 08 Jun 2016 02:01:01 PM EDT | root | timeline | timeline    |

快照元数据

通过以上快照列表可以看到,每一张快照均由快照本身以及一些元数据组成。创建快照时,需要指定元数据。修改快照意味着只能更改其元数据,快照内容是无法更改的。每一张快照使用的元数据如下:

Type:          快照类型,有关详细信息请参见快照类型,不能更改;
#:             快照的唯一编号,不能更改;
Pre #:         指定相应前快照的编号,仅适用于post,不能更改;
Date:          创建快照的时间戳
User:          创建快照的用户
Cleanup:       清理规则
Description:   快照的说明。
Userdata:      扩展的说明。可使用逗号分隔的“键=值”列表格式指定自定义数据“reason=testing,project=foo”,此字段也可用于将快照标记为重要 (important=yes) 以及列出创建快照的用户 (user=tux)。

查看文件的改动

显示指定快照中发生更改的一系列文件,例如,运行以下命令列出文件/var/log/yum.log的标号为0的当前版本与标号为2的快照中文件版本的差异,如果不指定文件名,则会显示所有文件的差异:

# snapper -c btrfs_config diff 1..0 /var/log/yum.log
--- /.snapshots/1/snapshot/var/log/yum.log  2016-06-08 13:01:51.977879395 -0400
+++ /var/log/yum.log    2016-06-08 13:47:50.520081926 -0400
@@ -3,3 +3,12 @@
 Jun 08 08:15:18 Installed: snapper-libs-0.1.7-10.el7.x86_64
 Jun 08 08:15:18 Installed: boost-serialization-1.53.0-25.el7.x86_64
 Jun 08 08:15:19 Installed: snapper-0.1.7-10.el7.x86_64
+Jun 08 13:15:21 Installed: net-tools-2.0-0.17.20131004git.el7.x86_64
+Jun 08 13:47:47 Updated: 7:device-mapper-1.02.107-5.el7_2.2.x86_64
+Jun 08 13:47:47 Updated: 7:device-mapper-libs-1.02.107-5.el7_2.2.x86_64
+Jun 08 13:47:47 Installed: 7:device-mapper-event-libs-1.02.107-5.el7_2.2.x86_64
+Jun 08 13:47:48 Installed: 7:device-mapper-event-1.02.107-5.el7_2.2.x86_64
+Jun 08 13:47:48 Installed: 7:lvm2-libs-2.02.130-5.el7_2.2.x86_64
+Jun 08 13:47:48 Installed: libaio-0.3.109-13.el7.x86_64
+Jun 08 13:47:48 Installed: device-mapper-persistent-data-0.5.5-1.el7.x86_64
+Jun 08 13:47:50 Installed: 7:lvm2-2.02.130-5.el7_2.2.x86_64

如果是新增文件,则仅会显示:

# snapper -c btrfs_config diff 1..0 /usr/bin/netstat
Binary files /.snapshots/1/snapshot/usr/bin/netstat and /usr/bin/netstat differ

运行以下命令列出文件/var/log/yum.log在标号为1和2的快照中文件版本的差异:

# snapper -c btrfs_config diff 1..2 /var/log/yum.log
(略...)

通过以上命令可以看到,Snapper 的快照存储在当前子卷根目录的 .snapshots 隐藏文件夹中。比如当前子卷是 /,那么就是 /.snapshots,如果是 /mnt/vol1,那就是 /mnt/vol1/.snapshots。快照始终存放在创建快照的那个分区或子卷中,无法将快照存储到其他分区或子卷。

恢复文件

要恢复一个或多个文件,请运行

# snapper -c CONfig -v undochange
  SNAPSHOT_ID..0 FILENAME1 FILENAME2

如果没有指定文件名,则会恢复所有已更改的文件,可以通过以下命令撤销以上操作,恢复系统状态到快照1:

# snapper -c btrfs_config undochange 1..2

删除快照

可以通过以下命令删除快照:

# snapper -c btrfs_config delete 1 2

# snapper -c btrfs_config list
Type   | # | Pre # | Date | User | Cleanup | Description | Userdata
-------+---+-------+------+------+---------+-------------+---------
single | 0 |       |      | root |         | current     |

提示: 旧快照占用的磁盘空间更多!!!
如果您要删除快照以释放硬盘上的空间,请务必先删除旧快照。快照生成的时间越长,其占用的空间就越大。通过配置文件设置自动删除快照。有关详细信息,请参见清理算法。

在精简LVM卷上创建快照

除了在 Btrfs 文件系统上生成快照之外,快照程序还支持在 XFS、Ext4 或 Ext3 格式的精简LVM 卷(不支持在常规 LVM 卷上生成快照)上生成快照。

创建精简LVM

以系统上的/dev/sdb、/dev/sdc为例,首先分别创建分区/dev/sdb1、/dev/sdc1:

# fdisk /dev/sdb 
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only,until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x962bc2ec.

Command (m for help): n
Partition type:
   p   primary (0 primary,0 extended,4 free)
   e   extended
Select (default p): 
Using default response p
Partition number (1-4,default 1): 
First sector (2048-10485759,default 2048): 
Using default value 2048
Last sector,+sectors or +size{K,M,G} (2048-10485759,default 10485759): 
Using default value 10485759
Partition 1 of type Linux and of size 5 GiB is set

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

查看创建好的分区如下:

# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
fd0      2:0    1    4K  0 disk 
sda      8:0    0   30G  0 disk 
+-sda1   8:1    0  500M  0 part /boot
+-sda2   8:2    0    2G  0 part [SWAP]
+-sda3   8:3    0 27.5G  0 part /home
sdb      8:16   0    5G  0 disk 
+-sdb1   8:17   0    5G  0 part 
sdc      8:32   0    5G  0 disk 
+-sdc1   8:33   0    5G  0 part 
sr0     11:0    1 1024M  0 rom

创建PV:

# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created

# pvcreate /dev/sdc1
  Physical volume "/dev/sdc1" successfully created

创建VG:

# vgcreate vg_thin /dev/sdb1 /dev/sdc1 
  Volume group "vg_thin" successfully created

创建精简池:

# lvcreate -L 5G --thinpool thin_pool vg_thin
  Logical volume "thin_pool" created.

查看精简LVM,可以看到Allocated pool data为0,说明thin_pool尚未实际占用磁盘空间:

# lvdisplay /dev/vg_thin/thin_pool 
  --- Logical volume ---
  LV Name                thin_pool
  VG Name                vg_thin
  LV UUID                3811nd-ltYk-XWqO-mxog-Gq82-38do-BywbfY
  LV Write Access        read/write
  LV Creation host,time localhost.localdomain,2016-06-08 14:05:58 -0400
  LV Pool Metadata       thin_pool_tMeta
  LV Pool data           thin_pool_tdata
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Allocated pool data    0.00%
  Allocated Metadata     0.68%
  Current LE             1280
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2

创建精简卷thin_vol1、thin_vol2、thin_vol3,忽略警告,可以看到三个2G的精简卷相加已经大于5G的精简池thin_pool大小,但是创建仍然成功了,至于为什么可以超额分配,请参考自动精简配置(Thin provisioning )介绍

# lvcreate -V 2G --thin -n thin_vol1 vg_thin/thin_pool
  Logical volume "thin_vol1" created.

# lvcreate -V 2G --thin -n thin_vol2 vg_thin/thin_pool
  Logical volume "thin_vol2" created.

# lvcreate -V 2G --thin -n thin_vol3 vg_thin/thin_pool
6 GiB)!
  For thin pool auto extension activation/thin_pool_autoextend_threshold should be below 100.
  Logical volume "thin_vol3" created.

创建文件系统:

# mkfs.ext4 /dev/vg_thin/thin_vol1

挂载文件系统:

# mkdir /mnt/vol1
# mount /dev/vg_thin/thin_vol1 /mnt/vol1

创建快照配置文件

为了在精简 LVM 卷上使用快照程序,首先为其创建快照配置文件。在 LVM 上要使用 –fstype=lvm(filesystem) 指定文件系统。文件系统的有效值为 ext3、etx4 或 xfs。如下:

# snapper -c lvm_config create-config -f "lvm(ext4)" /mnt/vol1/

# ls /etc/snapper/configs/
btrfs_config  lvm_config  

# snapper -c lvm_config list
Type   | # | Pre # | Date | User | Cleanup | Description | Userdata
-------+---+-------+------+------+---------+-------------+---------
single | 0 |       |      | root |         | current     |

创建一组pre/post快照对

# snapper -c lvm_config create --command "echo Hello > /mnt/vol1/hello_file"

# snapper -c lvm_config list
Type   | # | Pre # | Date                            | User | Cleanup | Description | Userdata
-------+---+-------+---------------------------------+------+---------+-------------+---------
single | 0 |       |                                 | root |         | current     |         
pre    | 1 |       | Wed 08 Jun 2016 02:41:07 PM EDT | root |         |             |         
post   | 2 | 1     | Wed 08 Jun 2016 02:41:07 PM EDT | root |         |             |

查看快照1和2之间的变化

# snapper -c lvm_config diff 1..2
--- /mnt/vol1/.snapshots/1/snapshot/hello_file  1969-12-31 19:00:00.000000000 -0500
+++ /mnt/vol1/.snapshots/2/snapshot/hello_file  2016-06-08 14:41:07.860147086 -0400
@@ -0,0 +1 @@
+Hello

以普通用户身份使用快照

默认情况下,快照程序只能由 root 用户使用。但在特定情况下,某些组或用户也需要创建快照或通过还原至快照来撤销更改:

为 ALLOW_USERS 和(或)ALLOW_GROUPS 设置值,分别为用户和(或)组授予权限。多个条目需要使用空格 分隔。例如,要为用户 thin_user 和 thin_group 授予权限,可运行:

# snapper -c web_data set-config "ALLOW_USERS=thin_user" "ALLOW_GROUPS=thin_group"

也可以通过直接修改配置文件实现,此时,指定的用户和(或)组便可以使用指定的快照程序配置。您可以使用 list 命令对其进行测试,例如:

# thin_user:~ > snapper -c lvm_config list

基本操作的讲解到此结束,下面讲一下一些高级配置:

自定义设置

以上我们都是采用Snapper自带的默认设置/etc/snapper/config-templates/default创建配置文件,该默认配置文件经过了多方面的考虑,适合多数使用情况。用户也可以根据自己的需要对如何创建自动快照以及如何保留快照进行自定义配置。

每个配置都包含一系列选项,这些选项可以通过命令行进行修改:

# snapper -c btrfs_config set-config "TIMELINE_CREATE=yes"
  • FSTYPE
    分区的文件系统类型:btrfs、lvm(ext3)、lvm(ext4)、lvm(xfs),快照类型不可更改。

  • SUBVOLUME
    分区或子卷生成快照的安装点。不可更改。

  • BACKGROUND_COMPARISON
    定义在创建前后快照后是否要在后台对他们进行比较。默认值为 “yes”。

禁用/启用timeline快照

时间线快照默认会启用,可以直接修改配置文件里的TIMELINE_CREATE为yes/no,也可以通过以下命令启停:
- 启用

# snapper -c btrfs_config set-config "TIMELINE_CREATE=yes"
  • 禁用

    # snapper -c btrfs_config set-config "TIMELINE_CREATE=no"

控制快照存档间隔(清理规则)

快照会占用磁盘空间。为了防止磁盘空间不足进而导致系统中断,旧的快照会自动删除:

清理算法

Snapper提供有三种清理旧快照的算法。这些算法以每天计划作业方式执行。您可以定义要在 Snapper 配置中保留的不同类型的快照数:

  • number
    当达到某一快照计数时将删除旧快照。

  • timeline
    将删除超过一定时限的旧快照,但保留一定量的每小时、每天、每月和每年快照。

  • empty-pre-post
    将删除无差异的前后快照对。

Snapper通过以下配置选项控制快照的清理规则:

  • TIMELINE_CLEANUP
    定义当快照数量超出 TIMELINE_LIMIT_* 选项指定的数值同时快照超出 TIMELINE_MIN_AGE 中指定的时限时是否自动删除旧快照。有效值:yes、no,默认值为 “yes”。

  • TIMELINE_CREATE
    如果设置为 yes,便会每小时创建一个快照。这是目前唯一一种可以自动创建快照的方式,因此强烈建议将其设置为 yes。有效值:yes、no,默认值为 “yes”。

  • TIMELINE_MIN_AGE
    定义快照在自动删除前必须保留的最小时限(以秒为单位)。
    默认值为 “1800”。

  • TIMELINE_LIMIT_DAILY、TIMELINE_LIMIT_HOURLY、TIMELINE_LIMIT_MONTHLY、 TIMELINE_LIMIT_YEARLY
    按小时、天、月、年保留的快照数量。每一项的默认值均为 “10”。

    TIMELINE_CLEANUP=”yes”
    TIMELINE_CREATE=”yes”
    TIMELINE_LIMIT_DAILY=”10”
    TIMELINE_LIMIT_HOURLY=”10”
    TIMELINE_LIMIT_MONTHLY=”10”
    TIMELINE_LIMIT_YEARLY=”10”
    TIMELINE_MIN_AGE=”1800”

每小时:最近创建的十张快照。
每天:保留最近十天内每天创建的首张快照。
每月:保留最近十个月内每月的最后一天创建的首张快照。
每年:保留最后十年内每年的最后一天创建的首张快照。

此示例配置能够实现按小时生成将自动清理的快照。TIMELINE_MIN_AGE和 TIMELINE_LIMIT_* 始终会同时进行评估。在本示例中,快照删除前的最小保留时限设置为 30 分钟(1800 秒)。因为我们会每小时创建一次快照,所以确保了只会保留最近的快照。如果 TIMELINE_LIMIT_DAILY 设置为非零值,则表示还会保留当天的首张快照。

  • NUMBER_CLEANUP
    定义当快照总数超出 NUMBER_LIMIT 中指定的数值,同时快照超出 NUMBER_MIN_AGE 中指定的时限时,是否自动删除旧的快照。有效值:yes、no,默认值为 “yes”。

  • NUMBER_LIMIT
    在 NUMBER_CLEANUP 设置为 yes 时,定义要保留的没有标记为重要的安装快照对和管理快照对的数量。所保留的会是最新的那些快照。默认值为 “50”。

  • NUMBER_LIMIT_IMPORTANT
    在 NUMBER_CLEANUP 设置为 yes 时,定义要保留的标记为重要的快照对数。所保留的会是最新的那些快照。默认值为 “10”。

  • NUMBER_MIN_AGE
    定义快照对在自动删除前必须保留的最小时限(以秒为单位)。默认值为 “1800”,即30分钟。

注: 限制和时限
NUMBER_LIMIT、NUMBER_LIMIT_IMPORTANT 和 NUMBER_MIN_AGE 始终都会评估。只有同时符合全部条件才会删除快照。如果想不考虑时限而始终保留一定数量的快照,则可将 NUMBER_MIN_AGE 设置为 0。另外,如果快照超过一定时限之后不想再保留,可以将 NUMBER_LIMIT 和 NUMBER_LIMIT_IMPORTANT 设置为 0。

空快照的处理

EMPTY_PRE_POST_CLEANUP
如果设置为 yes,系统会删除前后快照相同的快照对。默认值为 “yes”。

EMPTY_PRE_POST_MIN_AGE
定义前后快照相同的快照对在自动删除之前必须保留的最短时限(以秒为单位)。默认值为 “1800”。

管理现有配置

snapper 有多个子命令可用于管理现有的配置。您可以列出、显示这些配置,也可以对它们进行删除和修改:

列出配置

使用以下命令显示所有现有的配置:

# snapper list-configs
Config       | Subvolume
-------------+----------
btrfs_config | /        
lvm_config   | /mnt/vol1

查看配置

使用 snapper -c CONfig get-config 子命令可以显示指定的配置。CONfig 应替换为执行 snapper list-configs 命令后所显示的某个配置名称。请参见配置数据以了解有关配置选项的更多信息。

删除配置

使用以下命令可以删除配置。CONfig 应替换为执行 snapper list-configs 命令后所显示的某个配置名称:

# snapper -c CONfig delete-config

修改配置

使用以下命令可以修改指定配置中的选项。CONfig 应替换为执行 snapper list-configs 命令后所显示的某个配置名称。OPTION 和 VALUE 的可能值可参见配置数据:

# snapper -c CONfig set-config OPTION=VALUE

关于数据一致性

在创建快照时并没有能确保数据一致性的机制。如果在创建快照的同时写入某个文件(例如数据库),将导致文件损坏或写入不完整。恢复此类文件会产生问题。而且,有些系统文件(例如/etc/mtab)甚至永远都无法恢复。因此==强烈建议==您要始终仔细查看已更改文件及其差异的列表。只恢复您要还原的操作真正包含的文件。

修改快照元数据

用户可以使用快照程序修改说明、清理算法以及快照的用户数据,其他元数据均无法更改。

使用snapper list 查看所有快照及其编号

# snapper -c btrfs_config list

修改 btrfs_cconfig 配置的第 10 张快照的元数据,将清理算法设置为 timeline:

# snapper -c btrfs_config modify --cleanup-algorithm "timeline" 10

修改名为 btrfs_cconfig 配置的第 12 张快照的元数据,设置新的说明,并取消设置清理算法:

# snapper --config btrfs_config modify --description "daily backup" -cleanup-algorithm "timeline" 120

设置过滤规则

一些文件主要用来保存系统信息,例如/etc/mtab,这类文件不希望被快照操作影响到,Snapper允许通过/etc/snapper/filters/*.txt 指定过滤项,并在快照操作中忽略指定文件或文件夹的变化。
例如我们的btrfs中我们不希望快照跟踪/var、/tmp等,可以添加到filters,这样在以后创建的快照中就看到不到关于/var、/tmp的快照跟踪了。

其他

SUSE还支持从快照启动操作系统,而CentOS还没有引入该功能,我试用了一下没有成功,不知道啥原因,以后有精力再研究吧。。。晒几张截图:
1

2

3

4

CentOS 7中利用Snapper快照进行系统备份与恢复的更多相关文章

  1. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

  2. ios – 错误域= NSURLErrorDomain代码= -1003“找不到具有指定主机名的服务器

    当我尝试在设备上运行应用程序时出现此错误.当我在模拟器上运行它并且post请求正常工作时,我没有收到此错误.这是我的代码片段:任何帮助表示赞赏.谢谢解决方法此错误通常会提示DNS相关问题.检查设备上的DNS设置并确认您可以使用Safari或其他浏览器浏览互联网.如果有一个url,你可以在同一台服务器上获取,尝试直接在设备上的Safari中访问它.

  3. ios – Xcode Bot:如何在post触发器脚本上获得.ipa路径?

    我正在使用机器人来存档iOS应用程序,我需要获取.ipa产品路径才能将其发布到我们的分发系统中.机器人设置:并使用脚本打印所有env变量,其中不包含ipa文件的路径.此外,一些变量指向不存在的目录,即:XCS_OUTPUT_DIR这里的env变量输出:除此之外,我还能够确认.ipa文件是在另一个文件夹中创建的(/IntegrationAssets//

  4. ios – 使用CocoaPods post install hook将自定义路径添加到HEADER_SEARCH_PATHS

    解决方法在Podfile中定义一个方法:然后在post_install中调用该方法:

  5. iOS推送通知适用于Dev而不是Enterprise Distribution

    本网站上没有其他问题,我已经能够找到实际上提出了Dev将工作的原因,但企业分布不会.为什么归档总是使aps环境生产?

  6. ios7 – 如何使用默认的IOS映像

    嗨,我是IOS开发的新手.我知道如何在IOS应用程序中使用图像.但是我不知道如何使用默认图像,如开发者站点中提到的共享或书签图标.我想用它们我必须下载这些图像集或那些可用在xcode?

  7. iOS7 Safari中的全屏模式

    我正在使用SenchaTouch开发移动网站.在iOS7Safari中,我无法创建顶级地址栏和下面的工具栏消失了.Sencha过去常常处理iOS6,但iOS7最近的一些变化导致了这个问题.http://java.dzone.com/articles/safari-ios-7-and-html5我阅读了上面的链接&对于HTML5游戏而言,这似乎也是一个问题.一些其他应用程序.适用于iOS6的旧win

  8. ios – 如何使用新的Apple Swift语言发布JSON

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  9. 动态模拟iOS动态类型系统文字大小(UIContentSizeCategory)

    解决方法多么尴尬!

  10. ios – POST请求使用application / x-www-form-urlencoded

    后端开发人员在POST请求中给出了这些说明:>路线:{url}/{app_name/{controller}/{action}控制器和动作应该是小帽子.>API测试链接:http:****************>请求应该使用POST方法.>参数应通过请求内容体(FormUrlEncodedContent)传递.>参数应该是json格式.>参数是关键的.在协议中没有经验5,我搜索并结束了我的代码.

随机推荐

  1. 在airgapped(离线)CentOS 6系统上安装yum软件包

    我有一个CentOS6系统,出于安全考虑,它已经被空气泄漏.它可能从未连接到互联网,如果有,它很长时间没有更新.我想将所有.rpm软件包放在一个驱动器上,这样它们就可以脱机安装而无需查询互联网.但是,我在测试VM上遇到的问题是,即使指定了本地路径,yum仍然会挂起并尝试从在线存储库进行更新.另外,有没有办法使用yum-utils/yumdownloader轻松获取该包的所有依赖项和所有依赖项?目前

  2. centos – 命名在日志旋转后停止记录到rsyslog

    CentOS6.2,绑定9.7.3,rsyslog4.6.2我最近设置了一个服务器,我注意到在日志轮换后,named已停止记录到/var/log/messages.我认为这很奇怪,因为所有日志记录都是通过rsyslog进行的,并且named不会直接写入日志文件.这更奇怪,因为我在更新区域文件后命名了HUPed,但它仍然没有记录.在我停止并重新启动命名后,记录恢复.这里发生了什么?

  3. centos – 显示错误的磁盘大小

    对于其中一个磁盘,Df-h在我的服务器上显示错误的空白区域:Cpanel表明它只有34GB免费,但还有更多.几分钟前,我删除了超过80GB的日志文件.所以,我确信它完全错了.fdisk-l/dev/sda2也显示错误:如果没有格式化,我该怎么做才能解决这个问题?并且打开文件描述符就是它需要使用才能做到这一点.所以…使用“lsof”并查找已删除的文件.重新启动写入日志文件的服务,你很可能会看到空间可用.

  4. 如何在centos 6.9上安装docker-ce 17?

    我目前正在尝试在centOS6.9服务器上安装docker-ce17,但是,当运行yuminstalldocker-ce时,我收到以下错误:如果我用跳过的标志运行它我仍然得到相同的消息,有没有人知道这方面的方法?

  5. centos – 闲置工作站的异常负载平均值

    我有一个新的工作站,具有不寻常的高负载平均值.机器规格是:>至强cpu>256GB的RAM>4x512GBSSD连接到LSI2108RAID控制器我从livecd安装了CentOS6.564位,配置了分区,网络,用户/组,并安装了一些软件,如开发工具和MATLAB.在启动几分钟后,工作站负载平均值的值介于0.5到0.9之间.但它没有做任何事情.因此我无法理解为什么负载平均值如此之高.你能帮我诊断一下这个问题吗?

  6. centos – Cryptsetup luks – 检查内核是否支持aes-xts-plain64密码

    我在CentOS5上使用cryptsetupluks加密加密了一堆硬盘.一切都很好,直到我将系统升级到CentOS6.现在我再也无法安装磁盘了.使用我的关键短语装载:我收到此错误:在/var/log/messages中:有关如何装载的任何想法?找到解决方案问题是驱动器使用大约512个字符长的交互式关键短语加密.出于某种原因,CentOS6中的新内核模块在由旧版本创建时无法正确读取512个字符的加密密钥.似乎只会影响内核或cryptsetup的不同版本,因为在同一系统上创建和打开时,512字符的密钥将起作用

  7. centos – 大量ssh登录尝试

    22个我今天登录CentOS盒找到以下内容这是过去3天内的11次登录尝试.WTF?请注意,这是我从我的提供商处获得的全新IP,该盒子是全新的.我还没有发布任何关于此框的内容.为什么我会进行如此大量的登录尝试?是某种IP/端口扫描?基本上有4名匪徒,其中2名来自中国,1名来自香港,1名来自Verizon.这只发生在SSH上.HTTP上没有问题.我应该将罪魁祸首子网路由吗?你们有什么建议?

  8. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  9. centos – Azure将VM从A2 / 3调整为DS2 v2

    我正在尝试调整前一段时间创建的几个AzureVM,从基本的A3和标准A3到标准的DS2v2.我似乎没有能力调整到这个大小的VM.必须从头开始重建服务器会有点痛苦.如果它有所不同我在VM中运行CentOS,每个都有一个带有应用程序和操作系统的磁盘.任何人都可以告诉我是否可以在不删除磁盘的情况下删除VM,创建新VM然后将磁盘附加到新VM?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

返回
顶部