[libvirt] [PATCH v4 6/6] qemu: introduce a new "virt-qemu-run" program

Michal Prívozník mprivozn at redhat.com
Sat Jan 25 15:07:08 UTC 2020


On 1/10/20 11:34 AM, Daniel P. Berrangé wrote:
> The previous "QEMU shim" proof of concept was taking an approach of only
> caring about initial spawning of the QEMU process. It was then
> registered with the libvirtd daemon who took over management of it. The
> intent was that later libvirtd would be refactored so that the shim
> retained control over the QEMU monitor and libvirt just forwarded APIs
> to each shim as needed. This forwarding of APIs would require quite alot
> of significant refactoring of libvirtd to achieve.
> 
> This impl thus takes a quite different approach, explicitly deciding to
> keep the VMs completely separate from those seen & managed by libvirtd.
> Instead it uses the new "qemu:///embed" URI scheme to embed the entire
> QEMU driver in the shim, running with a custom root directory.
> 
> Once the driver is initialization, the shim starts a VM and then waits
> to shutdown automatically when QEMU shuts down, or should kill QEMU if
> it is terminated itself. This ought to use the AUTO_DESTROY feature but
> that is not yet available in embedded mode, so we rely on installing a
> few signal handlers to gracefully kill QEMU. This isn't reliable if
> we crash of course, but you can restart with the same root dir.
> 
> Note this program does not expose any way to manage the QEMU process,
> since there's no RPC interface enabled. It merely starts the VM and
> cleans up when the guest shuts down at the end. This program is
> installed to /usr/bin/virt-qemu-run enabling direct use by end users.
> Most use cases will probably want to integrate the concept directly
> into their respective application codebases. This standalone binary
> serves as a nice demo though, and also provides a way to measure
> performance of the startup process quite simply.
> 
> Reviewed-by: Michal Privoznik <mprivozn at redhat.com>
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
>  build-aux/syntax-check.mk       |   2 +-
>  docs/Makefile.am                |   5 +
>  docs/manpages/index.rst         |   1 +
>  docs/manpages/virt-qemu-run.rst | 114 +++++++++++
>  libvirt.spec.in                 |   2 +
>  src/Makefile.am                 |   1 +
>  src/qemu/Makefile.inc.am        |  13 ++
>  src/qemu/qemu_shim.c            | 322 ++++++++++++++++++++++++++++++++
>  8 files changed, 459 insertions(+), 1 deletion(-)
>  create mode 100644 docs/manpages/virt-qemu-run.rst
>  create mode 100644 src/qemu/qemu_shim.c
> 

> --- /dev/null
> +++ b/src/qemu/qemu_shim.c


> +int main(int argc, char **argv)
> +{
> +    GThread *eventLoopThread = NULL;
> +    virConnectPtr conn = NULL;
> +    virConnectPtr sconn = NULL;
> +    g_autofree char *xml = NULL;
> +    g_autofree char *uri = NULL;
> +    g_autofree char *suri = NULL;
> +    char *root = NULL;
> +    bool tmproot = false;
> +    int ret = 1;
> +    g_autoptr(GError) error = NULL;
> +    g_auto(GStrv) secrets = NULL;
> +    gboolean verbose = false;
> +    gboolean debug = false;
> +    GStrv tmpsecrets;
> +    GOptionContext *ctx;
> +    GOptionEntry entries[] = {
> +        { "secret", 's', 0, G_OPTION_ARG_STRING_ARRAY, &secrets, "Load secret file", "SECRET-XML-FILE,SECRET-VALUE-FILE" },
> +        { "root", 'r', 0, G_OPTION_ARG_STRING, &root, "Root directory", "DIR"},
> +        { "debug", 'd', 0, G_OPTION_ARG_NONE, &debug, "Debug output", NULL },
> +        { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "Verbose output", NULL },
> +        { NULL }

s/NULL/0/ to make clang happy. It's complaining, that the rest of struct
members are not initialzied.

Michal




More information about the libvir-list mailing list