qemu-img 快照的一些总结
http://www.openext.org/2014/06/qemu-img-snapshot-re
http://blog.csdn.net/muge0913/article/details/33723911
1.向虚拟机磁盘里写入文件,虚拟磁盘会变大。当你删除该文件时候,虚拟磁盘大小依旧不变。
2.当你从一个原来的虚拟镜像,base过来一个虚拟镜像,在首次启动新虚拟镜像之前,删除原来虚拟镜像某个文件,在新的虚拟镜像中一样看不到。在执行新的虚拟镜像后,在原始镜像中删除某个文件,在新的镜像中能看到,且依旧可以訪问。
3.总上,1的机制的实现是和2红色地方有关系的。
4.qemu-img snapshot 实现的是内部快照
5.qemu-img backing_file实现的是外部快照
6.libvirt的快照实现是在qemu的基础上实现的
libvirt的外部快照实现可能使用了qemu的base,rebase,commit功能
libvirt创建非活动的内部快照是通过调用下面函数实现的,该函数说明libvit事实上调用了qemu-img snapshot功能。
/* The domain is expected to be locked and inactive. */
static int
qemuDomainSnapshotCreateInactiveInternal(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virDomainSnapshotObjPtr snap)
{
return qemuDomainSnapshotForEachQcow2(driver, vm, snap, “-c”, false);
}
/* The domain is expected to be locked and inactive. */
static int
qemuDomainSnapshotRevertInactive(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virDomainSnapshotObjPtr snap)
{
/* Try all disks, but report failure if we skipped any. */
int ret = qemuDomainSnapshotForEachQcow2(driver, vm, snap, “-a”, true);
return ret > 0 ? -1 : ret;
}
libvirt创建非活动的外部快照调用下面函数:
static int qemuDomainSnapshotCreateInactiveExternal(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virDomainSnapshotObjPtr snap,
bool reuse)
在该函数中你可以发现一下语句
/* creates cmd line args: qemu-img create -f qcow2 -o */
if (!(cmd = virCommandNewArgList(qemuImgPath,
“create”,
“-f”,
virStorageFileFormatTypeToString(snapdisk->format),
“-o”,
NULL)))
goto cleanup;
if (defdisk->format > 0) {
/* adds cmd line arg: backing_file=/path/to/backing/file,backing_fmd=format */
virCommandAddArgFormat(cmd, “backing_file=%s,backing_fmt=%s”,
defdisk->src,
virStorageFileFormatTypeToString(defdisk->format));
所以libvirt创建非活动外部快照是通过qemu-img create来实现的。