~ruther/guix-local

145b51aeb35b02f0eb43ef3c31d0b2b77551424e — Karl Hallsby 1 year, 3 months ago fb597f2
services: Add xe-guest-utilities-service-type.

* gnu/services/virtualization.scm (xe-guest-utilities-configuration,
  xe-guest-utilities-service-type): New variables.
* doc/guix.texi: Document them.

Change-Id: Ife4e79fa6d1a9d5a21bf7479488884f2a5cf8d56
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
2 files changed, 152 insertions(+), 1 deletions(-)

M doc/guix.texi
M gnu/services/virtualization.scm
M doc/guix.texi => doc/guix.texi +71 -0
@@ 37518,6 37518,77 @@ host.  If empty, QEMU uses a default file name.
@end table
@end deftp

@subsubheading Xen Guest Agent

@cindex Xen
@cindex Xen guest agent

The Xen guest agent allows a Xen host to control the emulated system.
The @code{xe-guest-utilities} service runs the agent on Guix guests.

@url{https://github.com/xenserver/xe-guest-utilities, xe-guest-utilities} collects information about the running virtualized guest. This includes:
@itemize
@item
static information
@itemize
@item
The operating system running
@item
The Linux kernel version
@end itemize

@item
dynamic information
@itemize
@item
Network interfaces (devices) being added/removed
@item
Network connections being unplugged/plugged-in
@item
CPUs being added or removed
@item
The guest migrating, being paused/resumed, etc.
@end itemize

@item
ephemeral information
@itemize
@item
The amount of memory currently in-use and free
@item
The amount of disk-space used
@end itemize
@end itemize

@quotation Note
The default Linux-libre kernel that Guix ships already enables the
necessary paravirtualization features for a guest.  There is nothing you
need to do for the guest to support Xen's paravirtualization features.

The guest utilities are used to have the guest report information
@emph{back} to the virtualizing host and support tasks that require
cooperation between host and guest, like CPU hotplugging.
@end quotation

@defvar xe-guest-utilities-service-type
Service type for the Xen guest utilities service.
@end defvar

@deftp {Data Type} xe-guest-utilities-configuration
Configuration for the @code{xe-guest-utilities} service.

@table @asis
@item @code{package} (default: @code{xe-guest-utilities})
The Xen guest utilities package to use.

@item @code{pid-file} (default: @code{"/var/run/xe-daemon.pid"})
Name of the file holding the PID of @code{xe-deamon}.

@item @code{log-file} (default: @code{"/var/log/xe-guest-utilities.log"})
Name of the @code{xe-guest-utilities} log file.
@end table
@end deftp


@anchor{build-vm}
@subsubheading Virtual Build Machines

M gnu/services/virtualization.scm => gnu/services/virtualization.scm +81 -1
@@ 6,6 6,7 @@
;;; Copyright © 2022 Oleg Pykhalov <go.wigust@gmail.com>
;;; Copyright © 2022 Leo Nikkilä <hello@lnikki.la>
;;; Copyright © 2023 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2024 Raven Hallsby <karl@hallsby.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 32,6 33,9 @@
  #:autoload   (gnu packages gnupg) (guile-gcrypt)
  #:use-module (gnu packages package-management)
  #:use-module (gnu packages ssh)
  #:use-module (gnu packages base)
  #:use-module (gnu packages gawk)
  #:use-module (gnu packages linux)
  #:use-module (gnu packages virtualization)
  #:use-module (gnu services base)
  #:use-module (gnu services configuration)


@@ 106,7 110,10 @@

            qemu-guest-agent-configuration
            qemu-guest-agent-configuration?
            qemu-guest-agent-service-type))
            qemu-guest-agent-service-type

            xe-guest-utilities-configuration
            xe-guest-utilities-service-type))

(define (uglify-field-name field-name)
  (let ((str (symbol->string field-name)))


@@ 1005,6 1012,79 @@ specified, the QEMU default path is used."))


;;;
;;; Guest agent for VMs running under Xen
;;;
(define-configuration/no-serialization xe-guest-utilities-configuration
  (package
   (package xe-guest-utilities)
   "Xen guest management utilities package.")
  (pid-file
   (string "/var/run/xe-daemon.pid")
   "Path to the file holding the PID of xe-deamon.")
  (log-file
   (string "/var/log/xe-guest-utilties.log")
   "Path to xe-guest-utilities log file."))

(define (generate-xe-guest-utilities-documentation)
  "Generate documentation for xe-guest-utilities-configuration fields"
  (generate-documentation
   `((xe-guest-utilities-configuration ,xe-guest-utilities-configuration-fields))
   'xe-guest-utilities-configuration))

(define (xe-guest-utilities-shepherd-service config)
  (let ((xe-guest-utils (xe-guest-utilities-configuration-package config))
        (pid-file (xe-guest-utilities-configuration-pid-file config))
        (log-file (xe-guest-utilities-configuration-log-file config)))
    (list
     (shepherd-service
      (provision '(xen-guest-agent))
      (requirement '(networking user-processes udev))
      (documentation "Run the Xen guest management agent.")
      (start
       #~(lambda _
           (let ((pid (make-forkexec-constructor
                       (list
                        #$(file-append xe-guest-utils
                                       "/sbin/xe-daemon")
                        "-p" #$pid-file)
                       #:log-file #$log-file
                       #:pid-file #$pid-file
                       #:environment-variables
                       (list (string-append
                              "PATH="
                              #$(file-append xe-guest-utils "/bin") ":"
                              ;; logger
                              #$(file-append inetutils "/bin"))))))
             ;; Run xe-linux-distribution script before starting the actual
             ;; daemon. The script collects some basic system information that
             ;; is shared back to the Xen host.
             (system* #$(file-append xe-guest-utils "/sbin/xe-linux-distribution")
                      "/var/cache/xe-linux-distribution")
             ;; Finally, start and return the PID made by
             ;; make-forkexec-constructor.
             pid)))
      (stop #~(make-kill-destructor))))))

(define (xe-guest-utilities-udev-rules-service config)
  (let ((guest-utils (xe-guest-utilities-configuration-package config)))
    (list
     (file->udev-rule
      "z10_xen-vcpu-hotplug.rules"
      (file-append guest-utils "/lib/udev/rules.d/z10_xen-vcpu-hotplug.rules")))))

(define xe-guest-utilities-service-type
  (service-type
   (name 'xe-guest-utilities)
   (extensions
    (list (service-extension shepherd-root-service-type
                             xe-guest-utilities-shepherd-service)
          (service-extension udev-service-type
                             xe-guest-utilities-udev-rules-service)))
   (default-value (xe-guest-utilities-configuration))
   (description "Run the Xen guest management utilities.")))


;;;
;;; Secrets for guest VMs.
;;;