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(a)redhat.com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org