diff --git a/gnu/services/virtualization.scm b/gnu/services/virtualization.scm index fc42dcb8a7..3c9aadaae3 100644 --- a/gnu/services/virtualization.scm +++ b/gnu/services/virtualization.scm @@ -9,6 +9,7 @@ ;;; Copyright © 2024 Raven Hallsby ;;; Copyright © 2025 Maxim Cournoyer ;;; Copyright © 2025 Nigko Yerden +;;; Copyright © 2026 Giacomo Leidi ;;; ;;; This file is part of GNU Guix. ;;; @@ -493,10 +494,21 @@ avoid potential infinite waits blocking libvirt.")) (list (user-group (name "libvirt") (system? #t)))) (define (%libvirt-activation config) - (let ((sock-dir (libvirt-configuration-unix-sock-dir config))) + (let ((package (libvirt-configuration-libvirt config)) + (sock-dir (libvirt-configuration-unix-sock-dir config))) #~(begin (use-modules (guix build utils)) - (mkdir-p #$sock-dir)))) + (mkdir-p #$sock-dir) + (mkdir-p "/etc/libvirt/qemu/networks") + ;; special-files-service-type could be used but it creates a file union + ;; and libvirtd needs to write in /etc/libvirt. This makes /etc/libvirt + ;; read-only and libvirt crashes at startup. activate-special-files + ;; creates a single symlink to the store for + ;; /etc/libvirt/qemu/networks/default.xml so libvirt doesn't notice and + ;; starts successfully. + (activate-special-files + '(("/etc/libvirt/qemu/networks/default.xml" + #$(file-append package "/etc/libvirt/qemu/networks/default.xml"))))))) (define (libvirt-shepherd-service config) (let* ((config-file (libvirt-conf-file config)) diff --git a/gnu/tests/virtualization.scm b/gnu/tests/virtualization.scm index 070ceecc2c..05b2e0748b 100644 --- a/gnu/tests/virtualization.scm +++ b/gnu/tests/virtualization.scm @@ -119,15 +119,23 @@ "-c" "qemu:///system" "connect")) marionette)) - (test-eq "create default network" - 0 + (test-equal "default network is inactive" + "no" (marionette-eval '(begin + (use-modules (ice-9 popen) + (ice-9 textual-ports)) (chdir "/tmp") - (system* #$(file-append libvirt "/bin/virsh") - "-c" "qemu:///system" "net-define" - #$(file-append libvirt - "/etc/libvirt/qemu/networks/default.xml"))) + (define port + (open-input-pipe + (string-join '(#$(file-append libvirt "/bin/virsh") + "-c" "qemu:///system" "net-info" + "default" "|" "grep" "Active:" "|" + "awk" "'{ print $2; }'") + " "))) + (define answer (get-string-all port)) + (close-port port) + (string-trim-both answer)) marionette)) (test-eq "start default network"