[Libguestfs] running libguestfs as a service?

Richard W.M. Jones rjones at redhat.com
Sat Apr 30 09:32:32 UTC 2011


On Sat, Apr 30, 2011 at 01:10:57AM -0400, T Johnson wrote:
> Thanks for responding. I'm by no means a python expert so I could very
> well be doing something wrong, but I've been playing a bit with what
> you've suggested and noted a few interesting things.
> 
> 1) As soon as I create 'g', something seems to take over stderr and
> stdout so I can no longer print debugging output like you suggested.

This is very odd.  AFAIK nothing in libguestfs should affect stdout or
stderr.

When you say "create 'g'" do you mean "g = guestfs.GuestFS()" (ie.
create the handle) or "g.launch ()" (ie. launch the subprocess)?  I
guess it is possible that something in g.launch (ie. forking off a
subprocess) might affect stdout/stderr, although we use it in an awful
lot of other programs and no one has noticed anything before.

Here's my test program:

----------------------------------------------------------------------
#!/usr/bin/python

import sys
import guestfs

print >> sys.stderr, "creating the handle"
g = guestfs.GuestFS()
print >> sys.stderr, "add_drive_ro"
g.add_drive_ro ("/dev/null")
print >> sys.stderr, "launch"
g.launch ()
print >> sys.stderr, "set_verbose"
g.set_verbose (1)
print >> sys.stderr, "delete the handle"
#g.close ()
del g
print >> sys.stderr, "finished"
----------------------------------------------------------------------

BTW you can't directly call g.close() from Python because that method
is not exposed (instead, it is called implicitly when you delete g).
So your program ought to be throwing an exception when you try to call
g.close().  I'm not sure why you are not seeing that.

You're not trying to create the underlying libguestfsmod objects
directly?  Don't do that.

Here is the output from my test program:

----------------------------------------------------------------------
creating the handle
add_drive_ro
launch
set_verbose
delete the handle
libguestfs: closing guestfs handle 0x25106a0 (state 2)
libguestfs: send_to_daemon: 44 bytes: 00 00 00 28 | 20 00 f5 f5 | 00 00 00 04 | 00 00 01 1a | 00 00 00 00 | ...
libguestfs: recv_from_daemon: 40 bytes: 20 00 f5 f5 | 00 00 00 04 | 00 00 01 1a | 00 00 00 01 | 00 12 34 00 | ...
libguestfs: sending SIGTERM to process 13874
finished
----------------------------------------------------------------------

As you can see it's completely as expected
(python-libguestfs-1.11.3-1.fc16.x86_64).

> 2) (I assume) because of #1, g.set_verbose(1) results in no output to
> stdout/stderr either, so it hasn't been helpful so far.
> 
> 3) However, I then decided to try g.set_trace(1) and that does provide
> output. In the example I provided before I get this (editing config
> settings in /etc/sysconfig/network):

Unfortunately (because of a bug) closing the handle does not result
in any trace output, except ...

> libguestfs: trace: add_drive "/mnt/images/test_server.img"
> libguestfs: trace: add_drive = 0
> libguestfs: trace: launch
> libguestfs: trace: launch = 0
> libguestfs: trace: mount "/dev/vda1" "/"
> libguestfs: trace: mount = 0
> libguestfs: trace: write "/etc/sysconfig/network" "..."
> libguestfs: trace: write = 0
> 
> I can't seem to get any other ouput.. but it is very interesting that
> once I kill the process I see the remainder of the calls failing from
> trace output:
> 
> libguestfs: trace: umount_all
> libguestfs: trace: umount_all = -1 (error)
> libguestfs: trace: sync
> libguestfs: trace: sync = -1 (error)
> libguestfs: trace: umount_all
> libguestfs: trace: umount_all = -1 (error)
> libguestfs: trace: sync
> libguestfs: trace: sync = -1 (error)

... when you close a handle which has autosync enabled, which is now
the default, you'll see output like this.  It seems like all your
handles are getting closed at once.  I have no idea why.

> So, I guess that is what's failing.. but I haven't been able to
> determine why yet.
> 
> This is something I've been running into on much older versions of
> libguestfs all the way up to now which I'm trying your recent
> "1.7.17-17.el6" RPMs for rhel6.

Ah, so this could be RHEL 6.0?  This could well be a RHEL 6.0 bug.
Definitely try out the RHEL 6.1 packages from:

http://people.redhat.com/~rjones/rhel6.1-libguestfs-preview/

You'll find a lot of things are better.  It's much faster for one.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.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 Libguestfs mailing list