Skip to content
Snippets Groups Projects
  • Stefan Hajnoczi's avatar
    26de2296
    qga: add systemd socket activation support · 26de2296
    Stefan Hajnoczi authored
    AF_UNIX and AF_VSOCK listen sockets can be passed in by systemd on
    startup.  This allows systemd to manage the listen socket until the
    first client connects and between restarts.  Advantages of socket
    activation are that parallel startup of network services becomes
    possible and that unused daemons do not consume memory.
    
    The key to achieving this is the LISTEN_FDS environment variable, which
    is a stable ABI as shown here:
    https://www.freedesktop.org/wiki/Software/systemd/InterfacePortabilityAndStabilityChart/
    
    
    
    We could link against libsystemd and use sd_listen_fds(3) but it's easy
    to implement the tiny LISTEN_FDS ABI so that qemu-ga does not depend on
    libsystemd.  Some systems may not have systemd installed and wish to
    avoid the dependency.  Other init systems or socket activation servers
    may implement the same ABI without systemd involvement.
    
    Test as follows:
    
      $ cat ~/.config/systemd/user/qga.service
      [Unit]
      Description=qga
    
      [Service]
      WorkingDirectory=/tmp
      ExecStart=/path/to/qemu-ga --logfile=/tmp/qga.log --pidfile=/tmp/qga.pid --statedir=/tmp
    
      $ cat ~/.config/systemd/user/qga.socket
      [Socket]
      ListenStream=/tmp/qga.sock
    
      [Install]
      WantedBy=default.target
    
      $ systemctl --user daemon-reload
      $ systemctl --user start qga.socket
      $ nc -U /tmp/qga.sock
    
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Reviewed-by: default avatarDaniel P. Berrange <berrange@redhat.com>
    Signed-off-by: default avatarMichael Roth <mdroth@linux.vnet.ibm.com>
    26de2296
    History
    qga: add systemd socket activation support
    Stefan Hajnoczi authored
    AF_UNIX and AF_VSOCK listen sockets can be passed in by systemd on
    startup.  This allows systemd to manage the listen socket until the
    first client connects and between restarts.  Advantages of socket
    activation are that parallel startup of network services becomes
    possible and that unused daemons do not consume memory.
    
    The key to achieving this is the LISTEN_FDS environment variable, which
    is a stable ABI as shown here:
    https://www.freedesktop.org/wiki/Software/systemd/InterfacePortabilityAndStabilityChart/
    
    
    
    We could link against libsystemd and use sd_listen_fds(3) but it's easy
    to implement the tiny LISTEN_FDS ABI so that qemu-ga does not depend on
    libsystemd.  Some systems may not have systemd installed and wish to
    avoid the dependency.  Other init systems or socket activation servers
    may implement the same ABI without systemd involvement.
    
    Test as follows:
    
      $ cat ~/.config/systemd/user/qga.service
      [Unit]
      Description=qga
    
      [Service]
      WorkingDirectory=/tmp
      ExecStart=/path/to/qemu-ga --logfile=/tmp/qga.log --pidfile=/tmp/qga.pid --statedir=/tmp
    
      $ cat ~/.config/systemd/user/qga.socket
      [Socket]
      ListenStream=/tmp/qga.sock
    
      [Install]
      WantedBy=default.target
    
      $ systemctl --user daemon-reload
      $ systemctl --user start qga.socket
      $ nc -U /tmp/qga.sock
    
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Reviewed-by: default avatarDaniel P. Berrange <berrange@redhat.com>
    Signed-off-by: default avatarMichael Roth <mdroth@linux.vnet.ibm.com>
channel.h 964 B
/*
 * QEMU Guest Agent channel declarations
 *
 * Copyright IBM Corp. 2012
 *
 * Authors:
 *  Michael Roth      <mdroth@linux.vnet.ibm.com>
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
 * See the COPYING file in the top-level directory.
 */
#ifndef QGA_CHANNEL_H
#define QGA_CHANNEL_H


typedef struct GAChannel GAChannel;

typedef enum {
    GA_CHANNEL_VIRTIO_SERIAL,
    GA_CHANNEL_ISA_SERIAL,
    GA_CHANNEL_UNIX_LISTEN,
    GA_CHANNEL_VSOCK_LISTEN,
} GAChannelMethod;

typedef gboolean (*GAChannelCallback)(GIOCondition condition, gpointer opaque);

GAChannel *ga_channel_new(GAChannelMethod method, const gchar *path,
                          int listen_fd, GAChannelCallback cb,
                          gpointer opaque);
void ga_channel_free(GAChannel *c);
GIOStatus ga_channel_read(GAChannel *c, gchar *buf, gsize size, gsize *count);
GIOStatus ga_channel_write_all(GAChannel *c, const gchar *buf, gsize size);

#endif