Rosenthal/modules/rosenthal/packages/patches/guix-allow-out-of-tree-modules-in-initrd.patch
Hilton Chain a71e15a31f
rosenthal: guix/dolly: Apply ZFS patches.
* modules/rosenthal/packages/package-management.scm (guix/hako): Rename to...
(guix/dolly): ...this and apply patches necessary for root on ZFS support.
2025-09-13 18:00:32 +08:00

271 lines
12 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From 4323514d1b259a0dd61572e3c0859fab4250d297 Mon Sep 17 00:00:00 2001
Message-ID: <4323514d1b259a0dd61572e3c0859fab4250d297.1757725903.git.hako@ultrarare.space>
From: Brian Cully <bjc@spork.org>
Date: Sun, 16 Feb 2025 21:52:45 +0900
Subject: [PATCH] Allow copying of out-of-tree modules to the Linux initrd.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
With this patch, modules for initrd-modules will not only be searched for in
the in-tree Linux modules, but also any additional modules specified in
kernel-loadable-modules.
* gnu/build/linux-modules.scm (find-module-file): Change DIRECTORY argument to
DIRECTORIES. Now takes a list of directories to search, rather than a single
one.
* gnu/system/linux-initrd.scm (flat-linux-module-directory): change LINUX
argument to PACKAGES. Now contains a list of file-like objects to search for
modules.
(raw-initrd): Add LINUX-EXTRA-MODULE-DIRECTORIES keyword argument. Pass it
to (flat-linux-module-directory) along with the selected LINUX package.
(base-initrd): Add LINUX-EXTRA-MODULE-DIRECTORIES keyword argument. Pass it
to (raw-initrd).
* gnu/system.scm (operating-system-initrd-file): Pass in operating system
definition's kernel-loadable-modules into (make-initrd) as
LINUX-EXTRA-MODULE-DIRECTORIES.
* doc/guix.texi (Initial RAM Disk): Document how out-of-tree modules can be
used.
Change-Id: Ic39f2abcfabc3ec34a71acce840038396bf9c82e
Signed-off-by: Maxim Cournoyer <maxim.cournoyer@gmail.com>
Modified-by: Maxim Cournoyer <maxim.cournoyer@gmail.com>
Modified-by: Hilton Chain <hako@ultrarare.space>
---
doc/guix.texi | 15 ++++++++++
gnu/build/linux-modules.scm | 23 ++++++++++-----
gnu/system.scm | 2 ++
gnu/system/linux-initrd.scm | 58 +++++++++++++++++++++++--------------
4 files changed, 69 insertions(+), 29 deletions(-)
diff --git a/doc/guix.texi b/doc/guix.texi
index 4ab404dcdb2..3c05428829b 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -46404,6 +46404,21 @@ Initial RAM Disk
(initrd-modules (cons "megaraid_sas" %base-initrd-modules)))
@end lisp
+If a module listed in @code{initrd-modules} is not included in the
+Linux-libre kernel, then its location must be provided via the
+@code{kernel-loadable-modules} list.
+
+As an example, if you need the driver for a Realtek RTL8821CE wireless
+network adapter for mounting the root file system over NFS, your
+configuration might include the following:
+
+@lisp
+(operating-system
+ ;; @dots{}
+ (initrd-modules (cons "8821ce" %base-initrd-modules))
+ (kernel-loadable-modules (list (list rtl8821ce-linux-module "module"))))
+@end lisp
+
@defvar %base-initrd-modules
This is the list of kernel modules included in the initrd by default.
@end defvar
diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 32baf6c5259..f45db55f861 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -246,8 +246,8 @@ (define (file-name->module-name file)
'.ko[.gz|.xz|.zst]' and normalizing it."
(normalize-module-name (strip-extension (basename file))))
-(define (find-module-file directory module)
- "Lookup module NAME under DIRECTORY, and return its absolute file name.
+(define (find-module-file directories module)
+ "Lookup module NAME under DIRECTORIES, and return its absolute file name.
NAME can be a file name with or without '.ko', or it can be a module name.
Raise an error if it could not be found.
@@ -255,6 +255,10 @@ (define (find-module-file directory module)
module names usually (always?) use underscores as the inter-word separator,
whereas file names often, but not always, use hyphens. Examples:
\"usb-storage.ko\", \"serpent_generic.ko\"."
+ ;; For backward compatibility.
+ (define %directories (if (pair? directories)
+ directories
+ (list directories)))
(define names
;; List of possible file names. XXX: It would of course be cleaner to
;; have a database that maps module names to file names and vice versa,
@@ -268,16 +272,19 @@ (define (find-module-file directory module)
(else chr)))
module))))
- (match (find-files directory
- (lambda (file stat)
- (member (strip-extension
- (basename file)) names)))
+ (match (append-map
+ (cut find-files <>
+ (lambda (file _)
+ (member (strip-extension
+ (basename file))
+ names)))
+ %directories)
((file)
file)
(()
- (error "kernel module not found" module directory))
+ (error "kernel module not found" module %directories))
((_ ...)
- (error "several modules by that name" module directory))))
+ (error "several modules by that name" module %directories))))
(define* (recursive-module-dependencies files
#:key (lookup-module dot-ko))
diff --git a/gnu/system.scm b/gnu/system.scm
index 78a30646e1b..b709686744d 100644
--- a/gnu/system.scm
+++ b/gnu/system.scm
@@ -1380,6 +1380,8 @@ (define (operating-system-initrd-file os)
#:linux (operating-system-kernel os)
#:linux-modules
(operating-system-initrd-modules os)
+ #:linux-extra-module-directories
+ (operating-system-kernel-loadable-modules os)
#:mapped-devices mapped-devices
#:keyboard-layout (operating-system-keyboard-layout os)))
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 17c2e6f6bfd..978084062b2 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -120,13 +120,19 @@ (define* (expression->initrd exp
`(#:references-graphs (("closure" ,init))))
"/initrd.cpio.gz"))
-(define (flat-linux-module-directory linux modules)
+(define (flat-linux-module-directory packages modules)
"Return a flat directory containing the Linux kernel modules listed in
-MODULES and taken from LINUX."
+MODULES and taken from PACKAGES."
(define imported-modules
(source-module-closure '((gnu build linux-modules)
(guix build utils))))
+ (define package-inputs
+ (map (match-lambda
+ ((p o) (gexp-input p o))
+ (p (gexp-input p "out")))
+ packages))
+
(define build-exp
(with-imported-modules imported-modules
(with-extensions (list guile-zlib guile-zstd)
@@ -138,13 +144,17 @@ (define (flat-linux-module-directory linux modules)
(srfi srfi-26)
(ice-9 match))
- (define module-dir
- (string-append #$linux "/lib/modules"))
+ (define module-dirs
+ (map (cut string-append <> "/lib/modules")
+ '#$package-inputs))
(define builtin-modules
- (match (find-files module-dir (lambda (file stat)
- (string=? (basename file)
- "modules.builtin")))
+ (match (append-map
+ (cut find-files <>
+ (lambda (file stat)
+ (string=? (basename file)
+ "modules.builtin")))
+ module-dirs)
((file . _)
(call-with-input-file file
(lambda (port)
@@ -157,7 +167,7 @@ (define (flat-linux-module-directory linux modules)
(lset-difference string=? '#$modules builtin-modules))
(define modules
- (let* ((lookup (cut find-module-file module-dir <>))
+ (let* ((lookup (cut find-module-file module-dirs <>))
(modules (map lookup modules-to-lookup)))
(append modules
(recursive-module-dependencies
@@ -192,6 +202,7 @@ (define* (raw-initrd file-systems
#:key
(linux linux-libre)
(linux-modules '())
+ (linux-extra-module-directories '())
(pre-mount #t)
(mapped-devices '())
(keyboard-layout #f)
@@ -199,15 +210,16 @@ (define* (raw-initrd file-systems
qemu-networking?
volatile-root?
(on-error 'debug))
- "Return as a file-like object a raw initrd, with kernel
-modules taken from LINUX. FILE-SYSTEMS is a list of file-systems to be
-mounted by the initrd, possibly in addition to the root file system specified
-on the kernel command line via 'root'. LINUX-MODULES is a list of kernel
-modules to be loaded at boot time. MAPPED-DEVICES is a list of device
-mappings to realize before FILE-SYSTEMS are mounted. PRE-MOUNT is a
-G-expression to evaluate before realizing MAPPED-DEVICES.
-HELPER-PACKAGES is a list of packages to be copied in the initrd. It may include
-e2fsck/static or other packages needed by the initrd to check root partition.
+ "Return as a file-like object a raw initrd, with kernel modules taken from
+LINUX. FILE-SYSTEMS is a list of file-systems to be mounted by the initrd,
+possibly in addition to the root file system specified on the kernel command
+line via 'root'. LINUX-MODULES is a list of kernel modules to be loaded at
+boot time. LINUX-EXTRA-MODULE-DIRECTORIES is a list of file-like objects which
+will be searched for modules in addition to the linux kernel. MAPPED-DEVICES
+is a list of device mappings to realize before FILE-SYSTEMS are mounted.
+HELPER-PACKAGES is a list of packages to be copied in the initrd. It may
+include e2fsck/static or other packages needed by the initrd to check root
+partition.
When true, KEYBOARD-LAYOUT is a <keyboard-layout> record denoting the desired
console keyboard layout. This is done before MAPPED-DEVICES are set up and
@@ -244,7 +256,8 @@ (define* (raw-initrd file-systems
#~())))
(define kodir
- (flat-linux-module-directory linux linux-modules))
+ (flat-linux-module-directory (cons linux linux-extra-module-directories)
+ linux-modules))
(expression->initrd
(with-imported-modules (source-module-closure
@@ -392,6 +405,7 @@ (define* (base-initrd file-systems
#:key
(linux linux-libre)
(linux-modules '())
+ (linux-extra-module-directories '())
(mapped-devices '())
(keyboard-layout #f)
qemu-networking?
@@ -412,9 +426,10 @@ (define* (base-initrd file-systems
QEMU-NETWORKING? and VOLATILE-ROOT? behaves as in raw-initrd.
The initrd is automatically populated with all the kernel modules necessary
-for FILE-SYSTEMS and for the given options. Additional kernel
-modules can be listed in LINUX-MODULES. They will be added to the initrd, and
-loaded at boot time in the order in which they appear."
+for FILE-SYSTEMS and for the given options. Additional kernel modules can be
+listed in LINUX-MODULES. Additional directories for modules can be listed in
+LINUX-EXTRA-MODULE-DIRECTORIES. They will be added to the initrd, and loaded
+at boot time in the order in which they appear."
(define linux-modules*
;; Modules added to the initrd and loaded from the initrd.
`(,@linux-modules
@@ -434,6 +449,7 @@ (define* (base-initrd file-systems
(raw-initrd file-systems
#:linux linux
#:linux-modules linux-modules*
+ #:linux-extra-module-directories linux-extra-module-directories
#:mapped-devices mapped-devices
#:helper-packages helper-packages
#:keyboard-layout keyboard-layout
base-commit: 6174b135ffa3328fd7ad404b15b1586fc64e5666
prerequisite-patch-id: f71061d735b69d75799eb03df6215bbcb20d53b2
prerequisite-patch-id: 88337e68e714f3b1fe0d8e6588a1a4f423251610
--
2.51.0