[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
  

Comments

Maxim Cournoyer March 16, 2025, 1:14 p.m. UTC | #1
Hi Nathan,

nathan <nathan_mail@nborghese.com> writes:

> 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
>
> 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

LGTM.

[...]

> @@ -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")))

I suppose only modules from the booted kernel makes sense to be used,
hence the /run/booted-system instead of /run/current-system as Nix uses?
  
Maxim Cournoyer March 16, 2025, 2:19 p.m. UTC | #2
Hi,

Maxim Cournoyer <maxim.cournoyer@gmail.com> writes:

[...]

>> @@ -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")))
>
> I suppose only modules from the booted kernel makes sense to be used,
> hence the /run/booted-system instead of /run/current-system as Nix uses?

I've kept /run/booted-system, made some light cosmetic changes including
in the GNU Changelog of the commit message (have a look in commit
856fa9a4e4), and pushed!
  
nathan March 16, 2025, 4:03 p.m. UTC | #3
Actually, Nix uses /run/booted-system too. They fixed it in a later patch that I didn't bother to link
https://github.com/NixOS/nixpkgs/pull/287544

Thanks for applying it

On 3/16/25 2:19 PM, Maxim Cournoyer wrote:
> Hi,
> 
> Maxim Cournoyer <maxim.cournoyer@gmail.com> writes:
> 
> [...]
> 
>>> @@ -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")))
>>
>> I suppose only modules from the booted kernel makes sense to be used,
>> hence the /run/booted-system instead of /run/current-system as Nix uses?
> 
> I've kept /run/booted-system, made some light cosmetic changes including
> in the GNU Changelog of the commit message (have a look in commit
> 856fa9a4e4), and pushed!
>
  

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