
On Sat, Jul 21, 2012 at 08:20:45PM +0100, Richard W.M. Jones wrote:
This preliminary patch series adds a libvirt backend to libguestfs. It's for review only because although it launches the guest OK, there are some missing features that need to be implemented.
The meat of the patch is in part 4/4.
To save you the trouble of interpreting libxml2 fragments, an example of the generated XML and the corresponding qemu command line are attached below. Note the hack required to work around lack of support for '-drive [...]snapshot=on'
Some questions:
- I've tried to use the minimum set of XML possible to create the guest, leaving libvirt to fill out as much as possible. How does this XML look?
- The <name> is mandatory, and I generate one randomly. Is this a good idea? I notice that my $HOME/.libvirt directory fills up with random files. Really I'd like libvirt to generate a random name and just deal with the logfiles.
That's a good question - I have the same issue with libvirt-sandbox and filling up with log files.
- How do we query libvirt to find out if qemu supports virtio-scsi?
Info about supported devices is not available via the API. You'd have to try the create attempt and handle VIR_ERR_CONFIG_UNSUPPORTED
- Will <source file> work if the source is a host device?
You might be lucky but for correctness you should use source type=block if the source is a host device. This will almost certainly make a difference to the way disk locking is performed in the future.
- Since when has <memory unit> attribute been available? For example, is it available in RHEL 6?
http://libvirt.org/formatdomain.html#elementsMemoryAllocation "unit since 0.9.11" so, not RHEL6
- I'm using type="kvm" and I've only tested this on baremetal, but I don't want to force KVM. If only software emulation is available, I'd like to use it.
You have to query the capabilities to see if KVM is present, otherwise use type=qemu
- Is there an easy way to get -cpu host? Although I have the libvirt capabilities, I'd prefer not to have to parse it if I can avoid that, since libxml2 from C is so arcane.
Yes, <cpu mode='host-model'/> uses the host capabilities to specify a CPU that matches the host verbosely, while <cpu mode='host-passthrough'/> just uses '-cpu host'.
- <source mode> attribute is undocumented.
Rich.
----------------------------------------------------------------------
<?xml version="1.0"?> <domain type="kvm" xmlns:qemu="http://libvirt.org/schemas/domain/qemu/1.0"> <name>1dhdpe3sb9ub2vxd</name>
It would be nice to at least prefix this with 'guestfs-XXXX' so admins know what app is responsible for the guest.
<memory unit="MiB">500</memory> <currentMemory unit="MiB">500</currentMemory> <vcpu>1</vcpu> <clock offset="utc"/> <os> <type>hvm</type> <kernel>/home/rjones/d/libguestfs/.guestfs-500/kernel.3198</kernel> <initrd>/home/rjones/d/libguestfs/.guestfs-500/initrd.3198</initrd> <cmdline>panic=1 console=ttyS0 udevtimeout=600 no_timer_check acpi=off printk.time=1 cgroup_disable=memory root=/dev/sdb selinux=0 guestfs_verbose=1 TERM=xterm </cmdline> </os> <devices> <controller type="scsi" index="0" model="virtio-scsi"/> <disk type="file" device="disk"> <source file="/home/rjones/d/libguestfs/test1.img"/> <target dev="sda" bus="scsi"/> <driver name="qemu" format="raw" cache="none"/> <address type="drive" controller="0" bus="0" target="0" unit="0"/>
NB you don't need to specify <address> elements unless you actually want to have full control over the controller/bus/target/unit numbering
</disk> <disk type="file" device="disk"> <source file="/home/rjones/d/libguestfs/.guestfs-500/root.3198"/> <target dev="sdb" bus="scsi"/> <driver name="qemu" format="raw" cache="unsafe"/> <address type="drive" controller="0" bus="0" target="1" unit="0"/> </disk> <channel type="unix"> <source mode="bind" path="/home/rjones/d/libguestfs/libguestfsSSg3Kl/guestfsd.sock"/>
NB, current SELinux policy will prevent QEMU creating a socket in this location. You probably want to ask the SELinux folks to add a rule to the policy to allow creation of sockets like $HOME/.libguestfs/qemu/$VMNAME.guestfsd
<target type="virtio" name="org.libguestfs.channel.0"/> </channel> </devices> <qemu:commandline> <qemu:arg value="-set"/> <qemu:arg value="drive.drive-scsi0-0-1-0.snapshot=on"/> </qemu:commandline> </domain>
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 :|