[PATCH 0/2] Add xe-guest-utilities and daemon

  • Open
  • quality assurance status badge
Details
One participant
  • Karl Hallsby
Owner
unassigned
Submitted by
Karl Hallsby
Severity
normal
K
K
Karl Hallsby wrote on 23 Jul 07:14 +0200
(address . guix-patches@gnu.org)(name . Karl Hallsby)(address . karl@hallsby.com)
cover.1721711392.git.karl@hallsby.com
This service allows Xen hosts to *nicely* control Guix guests by requesting
graceful shutdowns, restarts, etc. You also get some system information about
the guest displayed by the Xen host.

Karl Hallsby (2):
gnu: Add xe-guest-utilities.
services: Add xe-guest-utilities-service-type.

doc/guix.texi | 30 ++++++
gnu/packages/virtualization.scm | 60 +++++++++++
gnu/services/virtualization.scm | 179 +++++++++++++++++++++++++++++++-
3 files changed, 268 insertions(+), 1 deletion(-)


base-commit: ad97f1bdb67015cffe92adba3b94c3b3df576008
--
2.45.2
K
K
Karl Hallsby wrote on 23 Jul 07:22 +0200
[PATCH 1/2] gnu: Add xe-guest-utilities.
(address . 72249@debbugs.gnu.org)(name . Karl Hallsby)(address . karl@hallsby.com)
e2a81c91a37d736f13d955b19ab1fef0fa65fc25.1721711392.git.karl@hallsby.com
* gnu/packages/virtualization.scm (xe-guest-utilities): Init at 8.4.0

Change-Id: I4daf19dc1964be00554e1c598ef88897081f5d52
---
gnu/packages/virtualization.scm | 60 +++++++++++++++++++++++++++++++++
gnu/services/virtualization.scm | 1 +
2 files changed, 61 insertions(+)

Toggle diff (92 lines)
diff --git a/gnu/packages/virtualization.scm b/gnu/packages/virtualization.scm
index 061748bb4a..dc5602e06a 100644
--- a/gnu/packages/virtualization.scm
+++ b/gnu/packages/virtualization.scm
@@ -91,6 +91,7 @@ (define-module (gnu packages virtualization)
#:use-module (gnu packages gnome)
#:use-module (gnu packages gnupg)
#:use-module (gnu packages golang)
+ #:use-module (gnu packages golang-build)
#:use-module (gnu packages graphviz)
#:use-module (gnu packages gtk)
#:use-module (gnu packages haskell)
@@ -2778,6 +2779,65 @@ (define-public xen
(license license:gpl2)
(supported-systems '("i686-linux" "x86_64-linux" "armhf-linux"))))
+(define-public xe-guest-utilities
+ (package
+ (name "xe-guest-utilities")
+ (version "8.4.0")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/xenserver/xe-guest-utilities")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "1yqspizhq3ii6cz2w75slaxy8838yyri9pmgc2q1radnm7w735if"))))
+ (build-system go-build-system)
+ (arguments
+ (list
+ #:import-path "github.com/xenserver/xe-guest-utilities"
+ #:install-source? #f
+ #:tests? #f ; There are no tests.
+ #:phases
+ #~(modify-phases %standard-phases
+ ;; Despite using go-build-system, this project does not use Go's build
+ ;; infrastructure to do anything, instead relying on a Makefile.
+ ;; NOTE: This target builds a tarball, but it is only filled with
+ ;; 2 binaries, 1 script, and a bunch of text files; it is tiny.
+ (add-after 'patch-source-shebangs 'fix-udev-rule
+ (lambda* (#:key inputs import-path #:allow-other-keys)
+ (substitute* (string-append "src/" import-path "/mk/xen-vcpu-hotplug.rules")
+ (("/bin/sh") (search-input-file inputs "/bin/sh")))))
+ (replace 'build
+ (lambda* (#:key import-path #:allow-other-keys)
+ (with-directory-excursion (string-append "src/" import-path)
+ ;; Explicitly state version, removes git as native-input.
+ ;; NOTE: The final step of the Makefile's build target is to "cd"
+ ;; to the final build directory.
+ (invoke "make" (string-append "RELEASE=" #$version) "build"))))
+ ;; The default "install" actions produce package-manager-specific
+ ;; outputs, .deb, .rpm, and .tgz. We just copy the final build
+ ;; products out.
+ (replace 'install
+ (lambda* (#:key outputs import-path #:allow-other-keys)
+ (let* ((stage (string-append "src/" import-path "/build/stage"))
+ (out (assoc-ref outputs "out")))
+ ;; Put udev rules in #$output/lib/udev/rules.d/
+ (copy-recursively (string-append stage "/etc/udev")
+ (string-append out "/lib/udev"))
+ ;; Copy produced binaries and scripts
+ (copy-recursively (string-append stage "/usr") out)))))))
+ (native-inputs (list go-golang-org-x-sys))
+ (inputs (list bash-minimal))
+ (home-page "https://github.com/xenserver/xe-guest-utilities")
+ (synopsis "XenServer guest utilities for unix-like operating systems")
+ (description "The XenServer guest utilities enable a Xen-based hypervisor,
+(Citrix XenServer, XCP-NG, etc.) to work with a Xen-enabled Unix-like guest VMs.
+This allows the guest to share information about its state back to the host,
+such IP address, memory usage, etc. and allows the host to inform the guest VM
+about events that change the virtualized hardware, such as hotplugging.")
+ (license license:bsd-2)))
+
(define-public osinfo-db-tools
(package
(name "osinfo-db-tools")
diff --git a/gnu/services/virtualization.scm b/gnu/services/virtualization.scm
index d87e494348..c9f8225570 100644
--- a/gnu/services/virtualization.scm
+++ b/gnu/services/virtualization.scm
@@ -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.
;;;
--
2.45.2
K
K
Karl Hallsby wrote on 23 Jul 07:22 +0200
[PATCH 2/2] services: Add xe-guest-utilities-service-type.
(address . 72249@debbugs.gnu.org)(name . Karl Hallsby)(address . karl@hallsby.com)
1c2bcecabee79ce42af6d0d3d653f9fdf3ad5458.1721711392.git.karl@hallsby.com
* gnu/services/virtualization.scm (xe-guest-utilities-configuration,
xe-guest-utilities-service-type): New variables.

Change-Id: Ife4e79fa6d1a9d5a21bf7479488884f2a5cf8d56
---
doc/guix.texi | 30 ++++++
gnu/services/virtualization.scm | 178 +++++++++++++++++++++++++++++++-
2 files changed, 207 insertions(+), 1 deletion(-)

Toggle diff (250 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index 9ba96af459..6a29731b95 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -36873,6 +36873,36 @@ Virtualization Services
@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-agent} service runs the agent on Guix guests.
+
+@quotation Note
+The default Linux-libre kernel that Guix ships already enables the
+necessary features for a guest. There is nothing you need to enable for
+the guest to fully support paravirtualization features.
+@end quotation
+
+@defvar xe-guest-agent-service-type
+Service type for the QEMU guest agent service.
+@end defvar
+
+@deftp {Data Type} xe-guest-agent-configuration
+Configuration for the @code{xen-guest-agent} service.
+
+@table @asis
+@item @code{package} (default: @code{xen-guest-utilities})
+The Xen guest utilities package to use.
+
+@item @code{pid-file} (default: @code{"/var/run/xe-daemon.pid"})
+Path to the file holding the PID of xe-deamon.
+@end table
+@end deftp
+
@anchor{build-vm}
@subsubheading Virtual Build Machines
diff --git a/gnu/services/virtualization.scm b/gnu/services/virtualization.scm
index c9f8225570..29d5de6cc7 100644
--- a/gnu/services/virtualization.scm
+++ b/gnu/services/virtualization.scm
@@ -33,6 +33,9 @@ (define-module (gnu services virtualization)
#: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)
@@ -107,7 +110,10 @@ (define-module (gnu services virtualization)
qemu-guest-agent-configuration
qemu-guest-agent-configuration?
- qemu-guest-agent-service-type))
+ qemu-guest-agent-service-type
+
+ xe-guest-agent-configuration
+ xe-guest-agent-service-type))
(define (uglify-field-name field-name)
(let ((str (symbol->string field-name)))
@@ -1004,6 +1010,77 @@ (define qemu-guest-agent-service-type
(default-value (qemu-guest-agent-configuration))
(description "Run the QEMU guest agent.")))
+
+;;;
+;;; Guest agent for VMs running under Xen
+;;;
+(define-configuration/no-serialization xe-guest-agent-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."))
+
+(define (generate-xe-guest-agent-documentation)
+ "Generate documentation for xe-guest-agent fields"
+ (generate-documentation
+ `((xe-guest-agent-configuration ,xe-guest-agent-configuration-fields))
+ 'xe-guest-agent-configuration))
+
+(define (xe-guest-agent-shepherd-service config)
+ (let ((xe-guest-utils (xe-guest-agent-configuration-package config))
+ (pid-file (xe-guest-agent-configuration-pid-file config)))
+ (list
+ (shepherd-service
+ (provision '(xe-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 "/var/log/xe-daemon.log"
+ #: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-agent-udev-rules-service config)
+ (let ((guest-utils (xe-guest-agent-configuration-package config)))
+ (list
+ (file->udev-rule "z10_xen-vcpu-hotplug.rules"
+ (file-append
+ guest-utils
+ ;; I hate this z10_ prefix too
+ "/lib/udev/rules.d/z10_xen-vcpu-hotplug.rules")))))
+
+(define xe-guest-agent-service-type
+ (service-type
+ (name 'xe-guest-agent)
+ (extensions
+ (list (service-extension shepherd-root-service-type
+ xe-guest-agent-shepherd-service)
+ (service-extension udev-service-type
+ xe-guest-agent-udev-rules-service)))
+ (default-value (xe-guest-agent-configuration))
+ (description "Run the Xen guest management utilities.")))
+
;;;
;;; Secrets for guest VMs.
@@ -1860,3 +1937,102 @@ (define hurd-vm-service-type
(description
"Provide a virtual machine (VM) running GNU/Hurd, also known as a
@dfn{childhurd}.")))
+
+(define-configuration/no-serialization xe-guest-utilities-configuration
+ (xe-guest-utilities
+ (file-like xe-guest-utilities)
+ "XenServer guest utilities package.")
+ (pid-file
+ (string "/var/run/xe-daemon.pid")
+ "File holding the PID of xe-deamon."))
+
+(define (generate-xe-guest-utilities-documentation)
+ "Generate documentation for xe-guest-utilities fields"
+ (generate-documentation
+ `((xe-guest-utilities-configuration ,xe-guest-utilities-configuration-fields))
+ 'xe-guest-utilities-configuration))
+
+(define (xe-guest-utils-service config)
+ (let ((pid-file (xe-guest-utilities-configuration-pid-file config)))
+ (list
+ ;; Generate <shepherd-service>s that run the xe-daemon forever.
+ (shepherd-service
+ (documentation "Run the xe-guest-utilities daemon.")
+ (provision '(xe-guest-utilities-daemon))
+ (requirement '(xe-guest-utilities-procfs
+ xe-guest-utilities-distro))
+ (start #~(make-forkexec-constructor
+ (list #$(file-append xe-guest-utilities "/bin/xe-daemon")
+ "-p" #$pid-file)
+ #:pid-file #$pid-file
+ #:environment-variables
+ (list (string-append
+ "PATH=/run/current-system/profile/bin:"
+ "/run/current-system/profile/sbin:"
+ #$(file-append coreutils "/bin") ":"
+ #$(file-append iproute "/bin")))))
+ (stop #~(make-kill-destructor)))
+
+ ;; Generate one-shot <shepherd-service>s that informs the host hypervisor about
+ ;; the distribution of the guest (Guix in this case)
+ (shepherd-service
+ (documentation "Inform host hypervisor of guest's distribution.")
+ (provision '(xe-guest-utilities-distro))
+ (requirement '(;;xe-guest-utilities-xend
+ ))
+ (one-shot? #t)
+ (start #~(make-forkexec-constructor
+ (list #$(file-append xe-guest-utilities "/bin/xe-linux-distribution")
+ "/var/run/xe-linux-distribution")
+ #:environment-variables
+ (list (string-append
+ "PATH="
+ #$(file-append xe-guest-utilities "/bin") ":"
+ #$(file-append coreutils "/bin") ":" ;uname & co
+ #$(file-append gawk "/bin") ":"
+ #$(file-append sed "/bin")))))
+ (stop #~(make-kill-destructor)))
+
+ ;; Generate <shepherd-service>s to mount the xen directory in /proc.
+ (shepherd-service
+ (documentation "Mount /proc/xen files.")
+ (provision '(xe-guest-utilities-procfs))
+ (requirement '(file-systems))
+ (start #~(lambda ()
+ (mount "xenfs" "/proc/xen" "/proc/xen")
+ (member "/proc/xen" (mount-points))))
+ (stop #~(lambda ()
+ (umount "/proc/xen" MNT_DETACH)
+ (not (member "/proc/xen" (mount-points))))))
+
+ ;; Generate <shepherd-service>s to create the necessary temporary directories for XenStore.
+ (shepherd-service
+ (documentation "Provide a temporary directory for XenStore.")
+ (provision '(xe-guest-utilities-tmp-dir))
+ (one-shot? #t)
+ (requirement '(file-systems))
+ (start #~(lambda ()
+ (mkdir "/var/run/xenstored")
+ (chmod o755 "/var/run/xenstored")))
+ (stop #~(lambda ()
+ (delete-file-recursively "/var/run/xenstored")))))))
+
+(define (xe-guest-utils-udev-rules-service config)
+ (let ((guest-utils (xe-guest-utilities-configuration-xe-guest-utilities config)))
+ (list
+ (file->udev-rule "z10_xen-vcpu-hotplug.rules"
+ (file-append
+ guest-utils
+ ;; I hate this z10_ prefix too
+ "/etc/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-utils-service)
+ (service-extension udev-service-type
+ xe-guest-utils-udev-rules-service)))
+ (default-value (xe-guest-utilities-configuration))
+ (description
+ "Enable a Guix System VM to communicate with a Xen-based hypervisor host.")))
--
2.45.2
?
Your comment

Commenting via the web interface is currently disabled.

To comment on this conversation send an email to 72249@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 72249
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch