KVM快照就是将虚拟机在某一个时间点上的磁盘内容(全部/或部分)、内存和设备状态保存一下,以备将来恢复之用。
一、内存状态快照:只是保持内存和虚机使用的其它资源的状态。如果虚机状态快照在做和恢复之间磁盘没有被修改,那么虚机将保持一个持续的状态;如果被修改了,那么很可能导致数据corruption。
virsh save命令,对运行中的vm01运行 “virsh save” 命令。命令执行完成后,vm01变成 “shut off” 状态。
[root@localhost ~]# virsh save --help
NAME
save - save a domain state to a file
SYNOPSIS
save <domain> <file> [--bypass-cache] [--xml <string>] [--running] [--paused] [--verbose]
DESCRIPTION
Save the RAM state of a running domain.
OPTIONS
[--domain] <string> domain name, id or uuid
[--file] <string> where to save the data
--bypass-cache avoid file system cache when saving
--xml <string> filename containing updated XML for the target
--running set domain to be running on restore
--paused set domain to be paused on restore
--verbose display the progress of save
使用save命令进行内存快照的制作,把当前的内存数据保存到一个文件。
[root@localhost ~]# mkdir /kvm/backup
mkdir: cannot create directory ‘/kvm/backup’: No such file or directory
[root@localhost ~]# mkdir -p /kvm/backup
[root@localhost ~]# virsh list
Id Name State
----------------------------------------------------
2 vm01 running
[root@localhost ~]# virsh save vm01 /kvm/backup/vm01-save --bypass-cache --running
Domain vm01 saved to /kvm/backup/vm01-save
再次开启vm01,在vm01中安装一个gedit软件包,并在根目录下创建一个测试文件。
重新制定一个快照,并查看。
[root@localhost ~]# virsh save vm01 /kvm/backup/vm01-save2 --bypass-cache --running --verbose
Save: [100 %]
Domain vm01 saved to /kvm/backup/vm01-save2
[root@localhost ~]# ll -h /kvm/backup/
total 1.2G
-rw-------. 1 root root 404M Apr 28 15:12 vm01-save
-rw-------. 1 root root 765M Apr 28 15:30 vm01-save2
vm01关机后,使用virsh restore来恢复。
首先使用vm01-save来恢复,发现关机的过程中有报错
再使用vm01-save2来恢复,一切正常。
再次打开vm01,将之前安装的gedit和ceshi文件都删除,关机后再使用vm01-save恢复,则一切正常。
恢复前删除gedit和ceshi文件。
恢复后:
内存快照操作比较简单,但是它对还原点的要求很高,如果有磁盘文件和之前还原点的存在不一致,就会出现错误。所以不推荐使用。
二、磁盘快照:磁盘的内容在某个时间点上被保存,然后可以被恢复。
磁盘快照有两种:
1、内部快照 - 使用单个的 qcow2 的文件来保存快照和快照之后的改动。这种快照是 libvirt 的默认行为,现在的支持很完善(创建、回滚和删除),但是只能针对 qcow2 格式的磁盘镜像文件,而且其过程较慢等。
2、外部快照 - 快照是一个只读文件,快照之后的修改是另一个 qcow2 文件中。外置快照可以针对各种格式的磁盘镜像文件。外置快照的结果是形成一个 qcow2 文件链:original <- snap1 <- snap2 <- snap3。
快照链就是多个快照组成的关系链,这些快照按照创建时间排列成链,像下面这样,本文章要解释的就是怎么创建这条链,链中快照的相互关系,缩短链,以及如何利用这条链回滚我们的虚拟机到某个状态
base-image<–guest1<–snap1<–snap2<–snap3<–snap4<–当前(active)
如上,base-image是制作好的一个qcow2格式的磁盘镜像文件,它包含有完整的OS以及引导程序,现在以这个base-image为模板创建多个虚拟机,简单点方法,每创建一个虚拟机我们就把这个镜像完整复制一份,但这种做法效率底下,满足不了生产需要,这是就用到了qcow2镜像的特性copy-on-write
qcow2(qemu copy-on-write)格式镜像支持快照,具有创建一个base-image,以及在base-image(backing file)基础上创建多个copy-on-write overlays镜像的能力,
解释下backing file和overlay, 上面那条链中,我们为base-image创建一个guest1,那么此时base-image就是guest1的backing file,guest1就是base-image的overlay,同理,为guest1虚拟机创建了一个快照snap1,此时guest1就是snap1的backing file,snap1是guest1的overlay,backing files和overlays十分有用,可以快速的创建瘦装备实例,特别是在开发测试过程中可以快速回滚到之前某个状态。
磁盘内部快照:使用virsh snapshot-create-as命令。
[root@localhost ~]# virsh snapshot-create-as --help
NAME
snapshot-create-as - Create a snapshot from a set of args
SYNOPSIS
snapshot-create-as <domain> [--name <string>] [--description <string>] [--print-xml] [