On Wed, Jun 08, 2016 at 10:50:24AM +0100, George Dunlap wrote:
On 07/06/16 16:57, Wei Liu wrote:
>> I must admit I'm not familiar with the division of responsibility
>> for managing QEMU between the Xen provided libxl library(s) and
>> the libvirt libxl driver code. Naively I would expect the libvirt
>> libxl driver code to deal with virtlogd and then configure the
>> Xen libxl library / QEMU accordingly. Your request seems to imply
>> that you will need the Xen libxl library to directly talk to
>> virtlogd instead.
>>
>> Is there any way in which it would be practical for the libvirt
>> libxl driver to talk to virtlogd to acquire the file descriptors
>> to use and pass those file descriptors down to the libxl library ?
>>
>
> There are two classes of configurations.
>
> For libvirt + libxl, There is currently no API for passing in a fd to be
> used as QEMU logging fd. But I'm thinking about having one. It wouldn't
> be too hard.
>
> The other class is configurations that don't have libvirt. We need some
> sort of mechanism to handle QEMU logs. My intent of this email is mainly
> for this class of configurations.
Just to be clear -- internally we're investigating options for dealing
with the "qemu logging" problem* for XenProject for people not running
libvirt -- people who use the xl toolstack, or people who build their
own toolstack on top of libxl.
(We *also* need to figure out how to deal with the libxl+libvirt
situation, but that's just a matter of plumbing I think.)
The options we've come up with, broadly, are as follows:
1. Try to use the existing syslog facilities
2. Re-purpose one of our existing daemons to perform a role similar to
virtlogd
3. "Steal" virtlogd and import it into our tree (yay GPL!)
4. Work with the libvirt community to make virtlogd an independent
project which can be used by both libvirt and libxl directly
For completeness I'd also suggest
5. Declare it out of scope for xl toolstack to solve the whole
problem. Merely provide the minimal hooks to enable the layer
above libxl to solve it. This is effectively QEMU's approach.
Of course, this would mean that any non-libvirt layer using libxl
stil faces the same problem you're facing, so I understand if thats
not desirable from your POV.
None of the options are really that great. I'm sure you guys
explored
#1 yourselves before deciding to write your own tools, so I won't cover
its deficiencies. #2 and #3 both involve a lot of duplicate effort and
duplicate code.
From a global perspective, #4 would seem to make sense, since it allows
the virtlogd functionality to be more generally used (and potentially
may be useful in non-virtualization scenarios as well). But it also has
the cost of working cross-community, maintaining a clean separate
codebase, &c &c. And we realize for the libvirt project it's extra work
for no obvious immediate benefit.
As you say there's not really any pre-existing tools that can easily
fit with the requirements, which is why we ended up creating virtlogd
ourselves - it was either that or OpenStack was going to invent their
own daemon which does what virtlogd does to solve it at the even higher
layer (though they could only fix serial port file based output, not
stderr outout)
So, we wanted a standard solution that libvirt and all apps using
libvirt could rely up unconditionally. From our existing libvirtd,
and codebase in general, we have alot of infrastructure pieces that
made creating virtlogd a pretty easy task. In particular our formal
RPC protocol and handling code for libvirtd and virtlockd, was
able to serve as the basis for virtlogd with little need for extra
code.
This in turn means that having virtlogd as a separate project would
be a major undertaking - it relies on so much libvirt infrastructure
code that to make it into a separate project, we'd have to pull out
a huge pile of libvirt internal code and turn it into a more formal
library that could be shared between an external virtlogd and libvirt.
We've never considered any of this code to be API/ABI stable, so don't
really want to go down that route. This would also make your option #3
a surprisingly large effort - there's a load of libvirt code you would
have to pull into Xen, or alternatively re-write in a Xen friendly
manner.
Less problematic, though still relevant, is that virtlogd is intended
to align with libvirtd/virtlockd designs, to give a consistent model.
By this I mean the config files are in common locations, the way we
auto-spawn the daemons works the same way - eg we have one libvirtd
running privileged, and one per-user account, and auto-spawn a
corresponding virtlogd for each.
As Wei said, we're still exploring options; even a negative
response
narrows down the search space. :-)
Let us know what you think.
I don't have a great answer for you I'm afraid, but I don't think
that #4 is really practical from the libvirt POV, due to the issue
with the all the libvirt internal code virtlogd relies upon that
we don't wish to turn into a stable API/ABI.
FWIW, for #3 you would have to take a large portion of src/util
and src/rpc and src/logging from the libvirt tree, which is quite
a considerable amount of code, so also not great.
* For those not familiar: The challenge is to log debug messages
from
qemu to a file, so that if there are problems it's easier to diagnose;
*without* allowing a rogue guest to fill up your disk by causing qemu to
spew useless messages.
NB, it is both messages from QEMU's stdout/stderr, and usage of character
devices (ie seriall ports) with the 'file' backend which lets QEMU write
guest serial output straight to a file. Fixing the former is possible
with any QEM, while the latter requires QEMU >= 2.6
Regards,
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 :|