[bug#77004] gnu: libvirt: Fix path to Linux modules

Message ID 42db80d1-c502-4526-a685-b905ba957201@nborghese.com
State New
Headers
Series [bug#77004] gnu: libvirt: Fix path to Linux modules |

Commit Message

nathan March 14, 2025, 1:16 a.m. UTC
  libvirt needs to load a file that is inside the modules folder.
Fix the path
Nix has a similar fix https://github.com/NixOS/nixpkgs/pull/286985
  

Patch

From f3317c91eb469ff54e31b0fafd45e2070a1bb06a Mon Sep 17 00:00:00 2001
Message-ID: <f3317c91eb469ff54e31b0fafd45e2070a1bb06a.1741914564.git.nathan_mail@nborghese.com>
From: nathan <nathan_mail@nborghese.com>
Date: Thu, 13 Mar 2025 20:36:27 -0400
Subject: [PATCH] gnu: libvirt: Fix path to Linux modules

* gnu/packages/virtualization.scm (libvirt): Use LINUX_MODULE_DIRECTORY to
find modules.
[source]: Add libvirt-respect-modules-path.patch
* gnu/packages/patches/libvirt-respect-modules-path.patch: new file
* gnu/local.mk: Register new file
* gnu/services/virtualization.scm (libvirt-shepherd-service)
<#:environment-variables>: pass LINUX_MODULE_DIRECTORY

Change-Id: Idde5b59df3c1641fcbab376e6c694730769294d3
---
 gnu/local.mk                                         |  1 +
 .../patches/libvirt-respect-modules-path.patch       | 12 ++++++++++++
 gnu/packages/virtualization.scm                      |  3 ++-
 gnu/services/virtualization.scm                      | 10 ++++++----
 4 files changed, 21 insertions(+), 5 deletions(-)
 create mode 100644 gnu/packages/patches/libvirt-respect-modules-path.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 149ef8dff9..e1a34901fd 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1673,6 +1673,7 @@  dist_patch_DATA =						\
   %D%/packages/patches/librewolf-neuter-locale-download.patch	\
   %D%/packages/patches/librewolf-use-system-wide-dir.patch	\
   %D%/packages/patches/libvirt-add-install-prefix.patch	\
+  %D%/packages/patches/libvirt-respect-modules-path.patch	\
   %D%/packages/patches/libziparchive-add-includes.patch		\
   %D%/packages/patches/lightdm-arguments-ordering.patch		\
   %D%/packages/patches/lightdm-vnc-ipv6.patch			\
diff --git a/gnu/packages/patches/libvirt-respect-modules-path.patch b/gnu/packages/patches/libvirt-respect-modules-path.patch
new file mode 100644
index 0000000000..c1ccc8952c
--- /dev/null
+++ b/gnu/packages/patches/libvirt-respect-modules-path.patch
@@ -0,0 +1,12 @@ 
+use linux module path environment variable from modprobe if available
+--- a/src/util/virpci.c
++++ b/src/util/virpci.c
+@@ -1459,6 +1459,7 @@ virPCIDeviceFindBestVFIOVariant(virPCIDevice *dev,
+     }
+ 
+     uname(&unameInfo);
+-    modulesAliasPath = g_strdup_printf("/lib/modules/%s/modules.alias", unameInfo.release);
++    char* modulepath=getenv("LINUX_MODULE_DIRECTORY");
++    modulesAliasPath = g_strdup_printf("%s/%s/modules.alias", modulepath ? modulepath : "/lib/modules", unameInfo.release);
+     if (virFileReadAll(modulesAliasPath, 8 * 1024 * 1024, &modulesAliasContent) < 0)
+         return -1;
diff --git a/gnu/packages/virtualization.scm b/gnu/packages/virtualization.scm
index 87a9aedd3f..a0009f233b 100644
--- a/gnu/packages/virtualization.scm
+++ b/gnu/packages/virtualization.scm
@@ -1549,7 +1549,8 @@  (define-public libvirt
                            version ".tar.xz"))
        (sha256
         (base32 "15jpfrn3d2zyhbm5ip7bmpjb6ch2bfxm1h6yfgh0l3bw3g9ppgg1"))
-       (patches (search-patches "libvirt-add-install-prefix.patch"))))
+       (patches (search-patches "libvirt-add-install-prefix.patch"
+                                "libvirt-respect-modules-path.patch"))))
     (build-system meson-build-system)
     (arguments
      (list
diff --git a/gnu/services/virtualization.scm b/gnu/services/virtualization.scm
index 796b9bf86f..9b31236732 100644
--- a/gnu/services/virtualization.scm
+++ b/gnu/services/virtualization.scm
@@ -508,11 +508,13 @@  (define (libvirt-shepherd-service config)
                      (list (string-append #$libvirt "/sbin/libvirtd")
                            "-f" #$config-file
                            #$@(if listen-tcp? '("--listen") '()))
-                     ;; For finding qemu and ip binaries.
+                     ;; For finding qemu, ip binaries, and kernel modules
                      #:environment-variables
-                     (list (string-append
-                            "PATH=/run/current-system/profile/bin:"
-                            "/run/current-system/profile/sbin"))))
+                     (list
+                      (string-append
+                       "PATH=/run/current-system/profile/bin:"
+                       "/run/current-system/profile/sbin")
+                      "LINUX_MODULE_DIRECTORY=/run/booted-system/kernel/lib/modules")))
            (stop #~(make-kill-destructor))))))
 
 (define libvirt-service-type

base-commit: 678b3dddfe442e643fe5cff7730d4f9690c3e2c2
-- 
2.48.1