
On Tue, Sep 27, 2011 at 12:35:21PM +0100, Richard W.M. Jones wrote:
On Tue, Sep 27, 2011 at 12:20:31PM +0100, Daniel P. Berrange wrote:
One other point worth mentioning is that libguestfs.so does not want to directly link to libvirt.so, and vica-verca, to ensure we both avoid pulling major new dependancy chains for all users.
Actually libguestfs.so in Fedora links to libvirt.so today. What we don't want is libvirt to be required *for libguestfs to compile*.
At the moment if libvirt is not available, we disable one API at compile time (using #ifdef HAVE_LIBVIRT etc). I don't this discussion is affected by this.
If I were ignoring the requirement that libguestfs does not link to libvirt, then you could quite likely make all this happen with only a simple additional API in libvirt. We need an API to let a client open a connection to a <channel> device, using the virStreamPtr API.
If the guests were not running, libguestfs would use virDomainCreate to spawn a transient, auto-detroy guest, with a custom kernel/initrd that runs the appliance, and an additional <channel> device, but with all other parts of the guest XML unchanged. This would ensure all the lock manager, sVirt and secret stuff 'just works'. If the guest is already running, libguestfs would just query the XML to find the <channel> device configuration. Then it could just use a new API like virDomainOpenChannel(virStreamPtr, const char *channelid) to get a stream to talk to the guestfs daemon with.
I'm with you up to here, but there's a practical problem: How do we create the appliance kernel/initrd/root disk on the server side? (I'm assuming that libvirt doesn't forward these large objects from the client to the server.) Normally these objects are created by running febootstrap-supermin-helper.
Yeah, I think libvirt will just have to be able to run the febootstrap-supermin-helper program itself at the appropriate time. As long as we create some SELinux security policy to confine the febootstrap-supermin-helper I don't see that as a very significant problem. I think the SELinux policy would be quite straightforward to create, since the program has a pretty well defined single task to perform
To do this I would create what I call a bridging library, to be named 'libvirt-guestfs.so'.
See above, although we have converged on similar designs, but for different reasons.
FWIW as outlined in the other email, I think we can do this without a bridging library, and just making changes behind the scenes in guestfs_add_domain[1], which would be transparent to callers.
Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|