[libvirt] Support for qemu snapshot=on drives in libvirt

Eric Blake eblake at redhat.com
Fri Oct 5 12:28:32 UTC 2012


On 10/05/2012 05:40 AM, Richard W.M. Jones wrote:
> 
> I notice that the qemu driver doesn't support snapshot drives
> (-drive file=foo,snapshot=on).  This is important for libguestfs.
> 
> Currently libguestfs hacks this using <qemu:arg>.  That works fine for
> static disks in the libvirt XML, but lack of direct support in libvirt
> is a blocker for adding hotplugging to libguestfs.
> 
> In qemu, the snapshot=on feature does several things:
> 
> (a) It creates a temporary qcow2 disk in $TMPDIR.

Which makes the guest non-migrateable.

> 
> (e) When qemu exits, the temporary qcow2 disk is deleted.

That's the whole intent of the existing <transient/> tag.

> 
> So note that when you use snapshot=on there is an implicit dependency
> on the $TMPDIR environment variable.  I don't know of a way to create
> the snapshot in another directory (at least, not using snapshot=on
> .. possibly one can do it by creating an explicit overlay disk in
> libvirt).
> 
> A simple implementation therefore would be to add a <snapshot/>
> element to <disk>.  It would just add snapshot=on and ignore concerns
> about $TMPDIR.
> 
> Or reuse the <readonly/> flag?  Note that these disks are writable.

The <transient/> tag sounds better than a new <snapshot/> tag or abuse
of the <readonly/> tag.

> 
> A more complex implementation would create an explicit overlay disk in
> libvirt and clean it up afterwards.  This would let us control where
> the temporary disk is created.

Yes, that's my goal with the <transient/> tag.

>  XML might look like this:
> 
>   <snapshot [tmp=...] />

Ah, so making <transient> take optional attributes (and/or subelements)
to further refine HOW the temporary file is created; but if not present,
then libvirt defaults to as sane as possible.

> I'm also concerned about the time is takes to run the external
> 'qemu-img create' command, which is non-trivial in some versions
> of qemu.  In libguestfs, every millisecond counts.
> 
>   $ time qemu-img create -f qcow2 test.qcow2 10M
>   Formatting 'test.qcow2', fmt=qcow2 size=10485760 encryption=off cluster_size=65536 
>   
>   real	   0m0.610s
>   user	   0m0.022s
>   sys	   0m0.009s
> 
> Or, can this be done using existing libvirt features?

Existing libvirt has a way to create qcow2 files within a storage pool,
but does so by calling out to qemu-img.  As for why qcow2 creation is
slow, I don't know what we can do about it.

> 
> Any thoughts on this before I implement something ...

We definitely need to tie it into the XML that has already been
designated for this purpose: <transient/>.

-- 
Eric Blake   eblake at redhat.com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 617 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20121005/30104b72/attachment-0001.sig>


More information about the libvir-list mailing list