注意点写在前面

[root@localhost ~]# virsh snapshot-create vm2
错误:不支持的配置:存储类型 vda 不支持磁盘 raw 的内部快照

[root@localhost ~]# virsh domblklist vm2
目标     源
------------------------------------------------
vda        /disk3/vm2.raw
hda        /disk3/vm2.iso

最好是用.qcow2的磁盘格式创建虚拟机

 

查看所有虚拟机
[root@localhost ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 2     vm1                            running

一、内置快照
1、创建
虚拟机关机状态
virsh snapshot-create-as vm1 centos1_sn1
虚拟机开机状态
virsh snapshot-create-as vm1 centos1_sn2
显示vm1的所有快照

[root@localhost ~]# virsh snapshot-list vm1
  名称               生成时间              状态
 ------------------------------------------------------------
  centos1_sn1          2019-02-28 10:15:47 +0800 running
  centos1_sn2          2019-02-28 10:15:23 +0800 shutoff


其中running代表是开机状态创建的,shutoff是关机状态创建的
2、回滚
virsh snapshot-revert --domain vm1 centos1_sn1
3、快照删除
virsh snapshot-delete vm1 centos1_sn1
或者
virsh snapshot-delete --domain vm1 --snapshotname centos1_sn1
二、外置磁盘快照
准备工作
virsh destroy vm1 关闭虚拟机
[root@localhost ~]# virsh domblklist vm1
目标     源
------------------------------------------------
vda        /disk3/vm1.qcow2
hda        -

可以看到,当前所使用磁盘为vm1.qcow2,之前说过,外置磁盘快照创建时,会保存正在使用磁盘作为backing file(此磁盘不再接受新数据,只保存快照前的数据),并创建一个新的磁盘作为overlays以等待写入新数据
1、创建

[root@localhost ~]# virsh snapshot-create-as --domain vm1 vm1_sn1 --disk-only --diskspec vda,snapshot=external,file=/disk3/vm1_sn.qcow2 --atomic


已生成域快照 vm1_sn1

其中/disk3/vm1_sn.qcow2是新生成的磁盘快照

[root@localhost ~]# virsh domblklist vm1
 目标     源
 ------------------------------------------------
 vda        /disk3/vm1_sn.qcow2
 hda        -


且正在使用的磁盘也已经更新到新创建的磁盘中去了

2、删除

-》查看磁盘快照
 [root@localhost ~]# virsh snapshot-list vm1
  名称               生成时间              状态
 ------------------------------------------------------------
  vm1_sn1              2019-02-28 10:28:04 +0800 shutoff
  vm1_sn2              2019-02-28 10:42:21 +0800 shutoff
  vm1_sn3              2019-02-28 10:42:31 +0800 shutoff-》外置磁盘快照是不能随便删除的,因为每个快照都有保存相应的数据
 [root@localhost ~]# virsh snapshot-delete vm1 vm1_sn1
 错误:删除快照失败:vm1_sn1
 错误:不支持的配置:尚不支持 1 外部磁盘快照删除
 -》查看虚拟机的完整快照链
 [root@localhost ~]# virsh domblklist vm1
 目标     源
 ------------------------------------------------
 vda        /disk3/vm1_sn3.qcow2
 hda        -[root@localhost ~]# qemu-img info --backing-chain /disk3/vm1_sn
 vm1_sn2.qcow2  vm1_sn3.qcow2  vm1_sn.qcow2

一定要选择当前使用的磁盘也就是 vm1_sn3.qcow2

[root@localhost ~]# qemu-img info --backing-chain /disk3/vm1_sn3.qcow2 
 image: /disk3/vm1_sn3.qcow2
 file format: qcow2
 virtual size: 10G (10737418240 bytes)
 disk size: 196K
 cluster_size: 65536
 backing file: /disk3/vm1_sn2.qcow2
 backing file format: qcow2
 Format specific information:
     compat: 1.1
     lazy refcounts: falseimage: /disk3/vm1_sn2.qcow2
 file format: qcow2
 virtual size: 10G (10737418240 bytes)
 disk size: 196K
 cluster_size: 65536
 backing file: /disk3/vm1_sn.qcow2
 backing file format: qcow2
 Format specific information:
     compat: 1.1
     lazy refcounts: falseimage: /disk3/vm1_sn.qcow2
 file format: qcow2
 virtual size: 10G (10737418240 bytes)
 disk size: 196K
 cluster_size: 65536
 backing file: /disk3/vm1.qcow2
 backing file format: qcow2
 Format specific information:
     compat: 1.1
     lazy refcounts: false


通过每个磁盘快照的信息中的backing file可以很容易画出快照链
vm1.qcow2 <- vm1_sn.qcow2 <- vm1_sn2.qcow2 <- vm1_sn3.qcow2

下面介绍如何进行外置快照的合并以缩短链长
两种合并方式:
1)blockcommit向下合并(合并overlay到backing file)

现在:[vm1.qcow2] <- vm1_sn.qcow2 <- vm1_sn2.qcow2 <- vm1_sn3.qcow2

目标:[vm1.qcow2] <- vm1_sn.qcow2 <-------------------- - vm1_sn3.qcow2
[root@localhost ~]# virsh blockcommit --domain vm1 vda --base /disk3/vm1.qcow2 --top /disk3/vm1_sn3.qcow2 --wait --verbose
错误:不支持的配置:这个 QEMU 二进制文件不支持在线指派

原因:
A qemu1.3以下版本不支持live blockcommit,
B qemu2.0以下版本不支持合并'Active'层(最顶部的overlay,即当前使用磁盘)至backing_files
2)blockpull向上合并与blockcommit正好相反
目标还是一样
[root@localhost ~]# virsh blockpull --domain vm1 --path /disk3/vm1_sn3.qcow2 --base /disk3/vm1.qcow2 --wait --verbose
错误:不支持的配置:这个 QEMU 二进制中不支持块任务

好正式开始讲解如何进行外置快照的删除

现在有的快照
[base] <- vm1_sn <- vm1_sn1 <-vm1_sn2 <-vm1_sn3
现在要删除sn2这个快照
步骤:(1)复制sn2数据到后端sn1,
               commit是向后端合并
          (2)复制sn2数据到前端sn3
    rebase是向前端合并

[root@localhost ~]# qemu-img commit /disk3/vm1_sn2.qcow2     
 Image committed.
 [root@localhost ~]# qemu-img rebase -u -b /disk3/vm1_sn.qcow2     /disk3/vm1_sn3.qcow2 
   ###########-u此模式下仅仅修改指向到backing file名字,不复制数据
 [root@localhost ~]# qemu-img rebase  -b /disk3/vm1_sn.qcow2 /disk3/vm1_sn3.qcow2 
  ###########去掉-u将把数据也一并复制过去
 [root@localhost ~]# virsh snapshot-list vm1


名称               生成时间              状态
 ------------------------------------------------------------
  vm1_sn1              2019-02-28 10:28:04 +0800 shutoff
  vm1_sn2              2019-02-28 10:42:21 +0800 shutoff
  vm1_sn3              2019-02-28 10:42:31 +0800 shutoff


#清理掉不用的快照
 [root@localhost ~]# virsh snapshot-delete --domain vm1 vm1_sn2 --metadata


已删除域快照 vm1_sn2

[root@localhost ~]# virsh snapshot-list vm1
名称               生成时间              状态
 ------------------------------------------------------------
  vm1_sn1              2019-02-28 10:28:04 +0800 shutoff
  vm1_sn3              2019-02-28 10:42:31 +0800 shutoff


3、回滚(外置磁盘快照的回滚是暂不支持的)
[root@localhost ~]# virsh snapshot-revert --domain vm1 vm1_sn3
错误:不支持的配置:revert to external snapshot not supported yet