[libvirt] Extensions to the libvirt Storage API
Daniel P. Berrange
berrange at redhat.com
Wed Jul 28 18:24:40 UTC 2010
On Wed, Jul 28, 2010 at 12:24:53PM -0500, Patrick Dignan wrote:
> On 07/28/2010 05:08 AM, Daniel P. Berrange wrote:
> >On Tue, Jul 27, 2010 at 06:28:01PM -0500, Patrick Dignan wrote:
> >>Hi Everyone,
> >>I'm looking at implementing some functionality in libvirt that would
> >>allow it to call functions in an unpublished iSCSI library. Some of the
> >>functionality I wish to implement is not currently part of the libvirt
> >>storage API. I wanted to suggest the following additions to the storage
> >>API: grow volumes, show whether thin provisioning is enabled, enable
> >>thin provisioning, disable thin provisioning, create snapshots, and
> >>delete snapshots. I've added a patch at the end of the mail showing how
> >>I think these functions should be implemented. Note that I have not
> >>included details about the virStorageSnapshotDefPtr yet, that's the next
> >>Perhaps this should be in a separate mail for better threading, but it
> >>seems a bit strange to me that the storage interface isn't pluggable in
> >>the traditional sense. In order to add a backend to libvirt, one has to
> >>make modifications all over the place, for example: virt-inst, the
> >>Makefile.am, the configure.ac, storage_backend.h, and several other
> >>places. It would make sense to me to make this pluggable such that
> >>someone could just load in a library that implements the required
> >>functions and some identifying information (eg type of storage,
> >>description, etc). A list of supported backends could be stored in
> >>empty files in a directory somewhere, or some similar hack. This way
> >>someone could write a plugin for tgtd for example, or in my case the
> >>library I'm working with. I think this would also help others with
> >>writing plugins for more storage backends. How difficult do you think
> >>this would be? I'm willing to do a reasonable amount of work to get
> >>this implemented, but I want to know what the experts think!
> >We explicitly don't support external driver plugins in libvirt for a
> >couple of reasons
> > - We don't want to support use of closed source plugins
> > - We don't want to guarentee stability of any aspect of
> > libvirt's internal API
> >We would like to see support for the various vendor specific iSCSI
> >extensions to allow volume creation/deletion, but want that code to
> >be part of the libvirt codebase.
> Understandable. I was thinking that there is currently no way to
> specify a vendor of a storage backend. For example, an iSCSI vendor.
> This makes it look like implementing vendor-specific extensions requires
> creating a new backend, even though there's already an iSCSI backend.
> It seems like a secondary field for vendor, and maybe even model, could
> help this.
Yes, we'd want to add some kind of vendor and/or model tag to the
storage pool XML description, to indicate what variant of iSCSI
is to be used.
> >> /* File creation/cloning functions used for cloning between backends */
> >> int virStorageBackendCreateRaw(virConnectPtr conn,
> >>@@ -76,6 +83,12 @@
> >> virStorageBackendCreateVol createVol;
> >> virStorageBackendRefreshVol refreshVol;
> >> virStorageBackendDeleteVol deleteVol;
> >>+ virStorageBackendGrowVol growVol;
> >I'd call this 'resizeVol' since there's no reason we can't also support
> Do all backends support shrinking? I was under the impression shrinking
> is not quite a universal feature, so it made sense to me to break this
> out. If most backends support shrinking, it makes sense to use
> resizeVol instead then.
Plain files, LVM, and disk partitions can all be shrunk, so I
think this is fine. If a particular storage type does not support
shrinking then it can raise VIR_ERR_NO_SUPPORT if the users tries
> >>+ virStorageBackendThinProvisionShow thinProvisionShow;
> >>+ virStorageBackendThinProvisionEnable thinProvisionEnable;
> >>+ virStorageBackendThinProvisionDisable thinProvisionDisable;
> >I'm not really liking this as a concept. The other storage drivers, and
> >indeed my iSCSI server, deal with thin provisioning on a per-volume basis
> >when creating the volume. The libvirt model is that if in the XML, then
> ><allocation> value is zero then the user is requesting thin provisioning
> >of that volume. ie no storage allocated for it upfront. If<allocation>
> >matches<capacity> then the volume should be fully allocated upfront.
> Sorry, that was a bit of a misnomer on my part, these functions are
> intended to be used at the volume level. However, what if they want to
> enable thin provisioning or disable it after the fact? Is that not
> going to be supported? An example use case of enabling after the fact
> is if they want to enable it, and then grow the volume to a larger
> size. Disabling, of course, could be done at any time (eg for a speed
> increase). Do you object to the thinProvisionShow function, in either case?
I think this can all still be done using a combination of allocation
and capacity. Some examples
* create new volume, thin provisioning
* create new volume, fat provisioning
The virStorageVolResize() API would probably want to take the same
XML format. So to extend a volume with thin provisioning
Or to extend with fat provisioning
Finally if you want to query current volume status the XML
config will show this, as will virStorageVolGetInfo.
> >>+ virStorageBackendCreateSnapshot createSnapshot;
> >>+ virStorageBackendDeleteSnapshot deleteSnapshot;
> >There's no need for snapshot APIs. This functionality is already supported
> >via the normal volume creation API, just specify the original volume to be
> >snapshotted in the XML as the backing store.
> I wasn't aware of this functionality. It looks like it's implemented on
> a per-hypervisor basis. It'd be really cool to get snapshotting
> integrated into storage backends with snapshotting support, so that
> snapshots would show up in both libvirt and the storage backend's UI,
> but I can see how this would be nearly impossible.
Namespace clash ! The virDomainSnapshot APIs are per-hypervisor. They
do snapshotting of the guest VM (including its storage).
I was actually just talking about the storage backends though which
can do snapshots independently of any hypervisor. See the <backingstorage>
This is already implemented with the LVM pool doing LVM snapshots. We
also use it for external qcow2 backing files.
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list