[libvirt] pausing / unpausing guests with libvirt
Matthew Donovan
matthew at atc-nycorp.com
Sun Sep 21 21:16:32 UTC 2008
> Is it possible you could isolate whether the problem is with libvirt
> or with the Java bindings? One way would be to shell out to 'virsh'
> just to see if virsh fails to change the state (ie. a libvirt/C) or if
> the problem is in the Java bindings.
>
> Pausing/resuming Xen domains is a very common and well-tested
> operation so I would be surprised if it's a libvirt problem, but you
> never know ...
Using following C code does not work. The domain starts but does not
suspend. When I call virConnGetLastError() error->code is 0 and
error->message is NULL. I ran my code with LIBVIRT_DEBUG=1. The output is
below the C code.
I was able to suspend the guest with virsh. The guest was started with my C
code below. You should be able to suspend the guest at any point, correct?
virsh # suspend 65
DEBUG: libvirt.c: virDomainLookupByID (conn=0x882f208, id=65)
DEBUG: hash.c: __virGetDomain (New hash entry 0x8846808)
DEBUG: libvirt.c: virDomainSuspend (domain=0x8846808)
Domain 65 suspended
DEBUG: libvirt.c: virDomainFree (domain=0x8846808)
DEBUG: hash.c: virUnrefDomain (unref domain 0x8846808 Linux2 1)
DEBUG: hash.c: virReleaseDomain (release domain 0x8846808 Linux2)
DEBUG: hash.c: virReleaseDomain (unref connection 0x882f208 xen:/// 2)
Thanks
-matthew
#include <stdio.h>
#include <unistd.h>
#include <libvirt/libvirt.h>
#include <libvirt/virterror.h>
const char* xml =
"<domain type='xen'>"
"<name>Linux2</name>"
"<os>"
"<type>hvm</type>"
"<loader>/usr/lib/xen/boot/hvmloader</loader>"
"<boot dev='hd'/>"
"</os>"
"<memory>500000</memory>"
"<vcpu>1</vcpu>"
"<on_shutdown>shutdown</on_shutdown>"
"<on_reboot>restart</on_reboot>"
"<on_crash>restart</on_crash>"
"<features>"
"<pae/>"
"<acpi/>"
"<apic/>"
"</features>"
"<devices>"
"<emulator>/usr/lib/xen/bin/qemu-dm</emulator>"
"<input type='tablet' bus='usb'/>"
"<graphics type='vnc' autoport='yes' listen='192.168.1.226'/>"
"<serial type='pty'/>"
"<disk type='block'>"
"<source dev='/dev/vgvms/Linux2'/>"
"<target dev='hda'/>"
"</disk>"
"<interface type='bridge'>"
"<mac address='D6:5F:DF:05:45:BB'/>"
"<source bridge='Bridge2'/>"
"</interface>"
"</devices>"
"</domain>";
int main (int argc, char** argv) {
virConnectPtr conn;
virDomainPtr dom;
if (virInitialize () < 0) {
printf ("virInitialize() failed\n");
return -1;
}
conn = virConnectOpen ("xen:///");
if (!conn) {
printf ("virConnectOpen() failed\n");
return -1;
}
dom = virDomainDefineXML (conn, xml);
if (!dom) {
printf ("virDomainDefineXML() failed\n");
return -1;
}
if (virDomainCreate (dom) < 0) {
printf ("virDomainCreate() failed\n");
return -1;
}
sleep (30);
if (virDomainSuspend (dom) < 0) {
virErrorPtr error = virConnGetLastError (conn);
printf ("virDomainSuspend() failed: %d\n", error->code);
}
sleep (60);
if (virDomainResume (dom) < 0) {
printf ("virDomainResume() failed\n");
}
return 0;
}
[root at grape tmp]$ ./a.out
DEBUG: libvirt.c: virInitialize (register drivers)
DEBUG: xen_internal.c: xenHypervisorInit (Using new hypervisor call: 30001
)
DEBUG: xen_internal.c: xenHypervisorInit (Using hypervisor call v2, sys ver3
dom ver5
)
DEBUG: libvirt.c: virConnectOpen (name=xen:///)
DEBUG: libvirt.c: do_open (name "xen:///" to URI components:
scheme xen
opaque (null)
authority (null)
server (null)
user (null)
port 0
path /
)
DEBUG: libvirt.c: do_open (trying driver 0 (Test) ...)
DEBUG: libvirt.c: do_open (driver 0 Test returned DECLINED)
DEBUG: libvirt.c: do_open (trying driver 1 (Xen) ...)
DEBUG: xen_unified.c: xenUnifiedOpen (Trying hypervisor sub-driver)
DEBUG: xen_unified.c: xenUnifiedOpen (Activated hypervisor sub-driver)
DEBUG: xen_unified.c: xenUnifiedOpen (Trying XenD sub-driver)
DEBUG: xen_unified.c: xenUnifiedOpen (Activated XenD sub-driver)
DEBUG: xen_unified.c: xenUnifiedOpen (Trying XS sub-driver)
DEBUG: xen_unified.c: xenUnifiedOpen (Activated XS sub-driver)
DEBUG: libvirt.c: do_open (driver 1 Xen returned SUCCESS)
DEBUG: libvirt.c: do_open (network driver 0 Test returned DECLINED)
DEBUG: libvirt.c: do_open (network driver 1 QEMU returned DECLINED)
DEBUG: remote_internal.c: doRemoteOpen (proceeding with name = xen:///)
DEBUG: libvirt.c: do_open (network driver 2 remote returned SUCCESS)
DEBUG: libvirt.c: do_open (storage driver 0 Test returned DECLINED)
DEBUG: libvirt.c: do_open (storage driver 1 storage returned DECLINED)
DEBUG: libvirt.c: do_open (storage driver 2 remote returned SUCCESS)
DEBUG: libvirt.c: virDomainDefineXML (conn=0x92ae478, xml=<domain
type='xen'><name>Linux2</name><os><type>hvm</type><loader>/usr/lib/xen/boot/
hvmloader</loader><boot
dev='hd'/></os><memory>500000</memory><vcpu>1</vcpu><on_shutdown>shutdown</o
n_shutdown><on_reboot>restart</on_reboot><on_crash>restart</on_crash><featur
es><pae/><acpi/><apic/></features><devices><emulator>/usr/lib/xen/bin/qemu-d
m</emulator><input type='tablet' bus='usb'/><graphics type='vnc'
autoport='yes' listen='192.168.1.226'/><serial type='pty'/><disk
type='block'><source dev='/dev/vgvms/Linux2'/><target
dev='hda'/></disk><interface type='bridge'><mac
address='D6:5F:DF:05:45:BB'/><source
bridge='Bridge2'/></interface></devices></domain>)
DEBUG: xend_internal.c: xenDaemonDomainDefineXML (Defining w/ sexpr:
(vm (name 'Linux2')(memory 488)(maxmem 488)(vcpus 1)(uuid
'5d9f6df2-6930-b2b8-4f71-db8575faa3ae')(on_poweroff 'destroy')(on_reboot
'restart')(on_crash 'restart')(image (hvm (kernel
'/usr/lib/xen/boot/hvmloader')(vcpus 1)(boot c)(acpi 1)(apic 1)(pae 1)(usb
1)(usbdevice tablet)(parallel none)(serial pty)(device_model
'/usr/lib/xen/bin/qemu-dm')))(device (vbd (dev 'hda:disk')(uname
'phy:/dev/vgvms/Linux2')(mode 'w')))(device (vif (mac
'd6:5f:df:05:45:bb')(bridge 'Bridge2')(script 'vif-bridge')))(device
(vkbd))(device (vfb (type vnc)(vncunused 1)(vnclisten '192.168.1.226')))))
DEBUG: libvirt.c: virDomainLookupByName (conn=0x92ae478, name=Linux2)
DEBUG: hash.c: __virGetDomain (New hash entry 0x92bd1e0)
DEBUG: libvirt.c: virDomainCreate (domain=0x92bd1e0)
DEBUG: libvirt.c: virDomainSuspend (domain=0x92bd1e0)
virDomainSuspend() failed: 0
> -----Original Message-----
> From: Richard W.M. Jones [mailto:rjones at redhat.com]
> Sent: Friday, September 19, 2008 2:21 PM
> To: Matthew Donovan
> Cc: libvir-list at redhat.com
> Subject: Re: [libvirt] pausing / unpausing guests with libvirt
>
> On Fri, Sep 19, 2008 at 09:23:52AM -0400, Matthew Donovan wrote:
> > I'm working on a management application that will control
> Xen guest vms
> > (HVMs) with libvirt Java bindings. I want to be able to
> pause and unpause
> > the VMs but doing so through the libvirt functions does not
> seem to actually
> > pause the VM. The suspend function returns true and
> doesn't throw any
> > exceptions, however, the guest VM is still running and responsive.
> >
> > Any pointers are greatly appreciated.
>
> Is it possible you could isolate whether the problem is with libvirt
> or with the Java bindings? One way would be to shell out to 'virsh'
> just to see if virsh fails to change the state (ie. a libvirt/C) or if
> the problem is in the Java bindings.
>
> Pausing/resuming Xen domains is a very common and well-tested
> operation so I would be surprised if it's a libvirt problem, but you
> never know ...
>
> Rich.
>
>
> --
> Richard Jones, Emerging Technologies, Red Hat
> http://et.redhat.com/~rjones
> virt-df lists disk usage of guests without needing to install any
> software inside the virtual machine. Supports Linux and Windows.
> http://et.redhat.com/~rjones/virt-df/
>
More information about the libvir-list
mailing list