I made a couple of tests.
Image A.qcow2:
- 2 Gb file size (the image size is 10Gb)
- OS: Windows XP sp2 installed
I create the image B.qcow2 with A as backing store through
virStorageVolCreateXML():
- 160 Mb file size (image size alway 10Gb)
- OS in the same state as before.
I do some updates to the OS in image B like installing sp3 and I shut
down the VE
I create the image C.qcow2 with B as backing store through
virStorageVolCreateXML():
- File size 230 Mb
- OS: Windows XP sp3 with all the changes made in image B.
This is extremely powerful in contexts as cloud VM provisioning or
system tests.
For what I guessed (didn't look at the code yet) libvirt can already set
up a hierarchy in a way that, given a complete disk image, can build
several COW images and run a coherent VM merging deltas contained in
these files.
So shouldn't be hard to do the same procedure with images created from
snapshots.
As I said in:
https://www.redhat.com/archives/libvirt-users/2012-May/msg00105.html I
create an image from a snapshot through qemu-img, I obtain a qcow2 file
valuable for inspections but not for running a new VE as it doesn't
contain the whole disk of the original VM.
If I do the same without COW I succeed but I pass from a bunch of
seconds to several minutes to complete the task as I basically clone the
whole disk.
A nice solution could be giving the capability to specify in the volume
XML the source as a snapshot name contained in the running domain.
The internal logic should be able to generate a new qcow2 file that
knows which backing file has been used to generate the disk the snapshot
refers to.
To be more clear running the image C I create the snapshot S, from S
through virStorageVolCreateXML() I create the disk image S.qcow2 which
contains deltas from C to the moment S has been taken. I can then use
S.qcow2 to spawn a new VE with changes made from C to S (including
changes made in B etc obviously).
This should allow, for example, to make so that while C is still running
I can start other VEs from C disk snapshots; obtaining a dynamic VE
branching system. Everything through libvirt API.