qemu/kvm有三种快照,分别是内部(保存在硬盘镜像中)/外部(保存为另外的镜像名)/虚拟机状态 ,很多网站上提供的资料和教程也大多是内部快照功能。内部快照不支持raw格式的镜像文件,所以如果想要使作内部快照,需要先将镜像文件转换成qcow2格式。转换命令为:

1qemu-img convert -f raw -O qcow2 centos.img centos.qcow2

具体可以通过如下方法查看镜像文件格式:

1[root@localhost file]# qemu-img info centos.qcow2
2image: centos.qcow2
3file format: qcow2
4virtual size: 30G (32212254720 bytes)
5disk size: 865M
6cluster_size: 65536
7[root@localhost file]#

一、创建快照

创建前先在虚拟机创建一个标记文件,在后面快照回滚时,可以通过对比该文件查看具体的效果 。

 1[root@localhost ~]# virsh console ppd_centos
 2Connected to domain ppd_centos
 3Escape character is ^]
 4login: root
 5Password:
 6Last login: Thu Apr 10 10:17:54 on ttyS0
 7[root@localhost ~]# ls
 8anaconda-ks.cfg  install.log  install.log.syslog
 9[root@localhost ~]# cd /opt/
10[root@localhost opt]# ls
11[root@localhost opt]# touch abc
12[root@localhost opt]# echo 123 > abc
13[root@localhost opt]# ls
14abc

如下所示,连接到虚拟机后,在/opt目录下新建了一个文件,并在文件内写入123 。接下来开始创建快照及查看快照信息:

1[root@localhost file]# virsh snapshot-create ppd_centos
2Domain snapshot 1397528914 created
3[root@localhost file]# virsh snapshot-list ppd_centos
4 Name                 Creation Time             State
5------------------------------------------------------------
6 1397528914           2014-04-15 10:28:34 +0800 running

这里查看快照信息也可以通过qemu-img命令查看,后面也会提到。接下来使用snapshot-current命令查看快照状态配置文件。

 1[root@localhost file]# virsh snapshot-current ppd_centos
 2<domainsnapshot>
 3  <name>1397528914</name>
 4  <state>running</state>
 5  <creationTime>1397528914</creationTime>
 6  <memory snapshot='internal'/>
 7  <disks>
 8    <disk name='vda' snapshot='internal'/>
 9    <disk name='hdc' snapshot='no'/>
10  </disks>
11  <domain type='kvm'>
12    <name>ppd_centos</name>
13    <uuid>7a8638f6-912f-4ed6-0a3c-b5d1e3f187c3</uuid>
14    <memory unit='KiB'>1048576</memory>
15    <currentMemory unit='KiB'>1048576</currentMemory>
16    <vcpu placement='static'>1</vcpu>
17    <os>
18      <type arch='x86_64' machine='rhel6.5.0'>hvm</type>
19      <boot dev='hd'/>
20    </os>
21    <features>
22  ……………………省略

该命令执行的结果实际上是查看/var/lib/libvirt/qemu/snapshot/guest主机名/下的以快照name命令的xml文件 。

二、快照的回滚

我们再次修改标记文件,并继续创建快照

1[root@localhost opt]# echo "456" >> abc
2[root@localhost opt]# cat abc
3123
4456
5[root@localhost opt]#

创建快照和指定快照name的方法如下:

 1[root@localhost ppd_centos]# virsh snapshot-create ppd_centos
 2Domain snapshot 1397529759 created
 3[root@localhost ppd_centos]# virsh snapshot-list ppd_centos
 4 Name                 Creation Time             State
 5------------------------------------------------------------
 6 1397528914           2014-04-15 10:28:34 +0800 running
 7 1397529759           2014-04-15 10:42:39 +0800 running
 8[root@localhost ppd_centos]# virsh snapshot-create-as ppd_centos test
 9Domain snapshot test created
10virsh # snapshot-list ppd_centos
11 Name                 Creation Time             State
12------------------------------------------------------------
13 1397528914           2014-04-15 10:28:34 +0800 running
14 1397529759           2014-04-15 10:42:39 +0800 running
15 test                 2014-04-15 10:46:44 +0800 running

上面使用了snapshot-create-as 参数指定name值,上面提到的使用qemu-img命令查看快照信息的操作如下:

 1[root@localhost file]# qemu-img info centos.qcow2
 2image: centos.qcow2
 3file format: qcow2
 4virtual size: 30G (32212254720 bytes)
 5disk size: 1.6G
 6cluster_size: 65536
 7Snapshot list:
 8ID        TAG                 VM SIZE                DATE       VM CLOCK
 91         1397528914             252M 2014-04-15 10:28:34   00:53:07.200
102         1397529759             252M 2014-04-15 10:42:40   01:06:19.698
113         test                   252M 2014-04-15 10:46:44   01:08:03.934
12[root@localhost file]#

恢复之前最好先关闭虚拟机 virsh shutdown 或virsh destroy ,当然在不关闭的情况下也可以做回滚,不过有新数据写入时会出现问题。还是建议先停机再做回滚。不停机回滚时,会有如下提示:

1[root@localhost file]# virsh snapshot-revert ppd_centos 1397529759
2error: revert requires force: Target controller type ide does not match source usb

这时候需要加上–force才可以 ,如下

1[root@localhost file]# virsh snapshot-revert --force ppd_centos test
23[root@localhost file]# virsh snapshot-revert --force ppd_centos  1397528914

回滚的速度是非常快的,一般1-2秒的时间就OK了,再去查看状态,如下:

1[root@localhost file]# virsh snapshot-current ppd_centos
2<domainsnapshot>
3  <name>1397528914</name>
4  <state>running</state>
5  <creationTime>1397528914</creationTime>
6  <memory snapshot='internal'/>
7……………………省略

此时再去查看标记文件:

1[root@localhost opt]# virsh console ppd_centos
2Connected to domain ppd_centos
3Escape character is ^]
4[root@localhost opt]# ls
5abc
6[root@localhost opt]# cat abc
7123

这时,不难发现标记文件已经恢复到初始时的一个状态。

三、删除快照

1[root@localhost localhost]# virsh snapshot-delete ppd_centos 1397528914
2Domain snapshot 1397528914 deleted

快照的删除没什么好说,过程也很快,1-2秒钟的时候,不过快照删除后,通过ls -al查看发现qcow2镜像文件的大小并不会减少,而在create快照时会增加。

最后,我顺便对raw格式的镜像文件做一个内部快照测试:

1[root@localhost libvirt]# virsh snapshot-create ppd_win7
2error: unsupported configuration: internal snapshot for disk hda unsupported for storage type raw

可以发现其出现了报错提示不支持内部快照 。

总结:

关于kvm的内部快照备份时间比较长,一般要5-10分钟左右,造成该问题的原因是:savevm保存的是当前客户机系统的运行状态(包括:内存、寄存器、CPU执行等的状态),保存为一个文件,而且要在loadvm时可以完全恢复,这个过程比较复杂,如果客户机里面的内存很大、运行的程序很多,savevm比较耗时,也是可以理解的。暂时很难有什么改进方法。

而往往我们并不需要如何完整的一个快照,现网中可能只需要做disk的一个快照就OK了,所以这就要提到外部快照(External snapshot)。