qemu-img 快照的一些总结


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来实现的。