summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Cully <bjc@spork.org>2022-05-02 15:11:30 -0400
committerGuix Patches Tester <>2022-05-02 20:56:21 +0100
commit35c9a79233577b4482e73d5b760c8b1f0dc8d6c8 (patch)
tree8e2a7fb10a4a08781ea59588a3d98cf245b67deb
parent098f2eea331121905e3c867f478b22cea3510841 (diff)
downloadguix-patches-35c9a79233577b4482e73d5b760c8b1f0dc8d6c8.tar
guix-patches-35c9a79233577b4482e73d5b760c8b1f0dc8d6c8.tar.gz
initrd: Allow extra search paths with ‘initrd-extra-module-paths’series-12244
This patch allows copying of out-of-tree kernel modules to the Linux initrd. For out-of-tree modules to found, an extra slot has been added to ‘operating-system’: ‘initrd-extra-module-paths’, which contains a list containing items of either FILE-LIKE or (FILE-LIKE OUTPUT) which will be searched for modules in addition to the standard Linux module path. The required modules can then be added to ‘initrd-modules’ as normal and all paths will be searched for it, including for any modules depended on. * 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.scm <operating-system>: Add INITRD-EXTRA-MODULE-PATHS field and accessor. Takes a list of file-like objects. * gnu/system/linux-initrd.scm (flat-linux-module-directory): change LINUX argument to PACKAGES. Now contains a list of file-likes to search for modules. (raw-initrd): Add LINUX-EXTRA-MODULE-PATHS keyword argument. Pass it to (flat-linux-extra-module-paths) along with the selected LINUX package. (base-initrd): Add LINUX-EXTRA-MODULE-PATHS keyword argument. Pass it to (raw-initrd).
-rw-r--r--gnu/build/linux-modules.scm19
-rw-r--r--gnu/system.scm5
-rw-r--r--gnu/system/linux-initrd.scm52
3 files changed, 51 insertions, 25 deletions
diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 053720574b..97b7e429ea 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -225,8 +225,8 @@ underscores."
'.ko[.gz|.xz]' 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.
@@ -247,16 +247,19 @@ whereas file names often, but not always, use hyphens. Examples:
(else chr)))
module))))
- (match (find-files directory
- (lambda (file stat)
- (member (strip-extension
- (basename file)) names)))
+ (match (append-map (lambda (directory)
+ (find-files directory
+ (lambda (file _stat)
+ (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 c3810cbeeb..15ac30c933 100644
--- a/gnu/system.scm
+++ b/gnu/system.scm
@@ -103,6 +103,7 @@
operating-system-label
operating-system-default-label
operating-system-initrd-modules
+ operating-system-initrd-extra-module-paths
operating-system-initrd
operating-system-users
operating-system-groups
@@ -232,6 +233,8 @@ VERSION is the target version of the boot-parameters record."
(initrd-modules operating-system-initrd-modules ; list of strings
(thunked) ; it's system-dependent
(default %base-initrd-modules))
+ (initrd-extra-module-paths operating-system-initrd-extra-module-paths ; list of file-likes
+ (default '()))
(firmware operating-system-firmware ; list of packages
(default %base-firmware))
@@ -1307,6 +1310,8 @@ we're running in the final root."
#:linux (operating-system-kernel os)
#:linux-modules
(operating-system-initrd-modules os)
+ #:linux-extra-module-paths
+ (operating-system-initrd-extra-module-paths 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 4c4c78e444..50a182d7d5 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -119,13 +119,23 @@ the derivations referenced by EXP are automatically copied to the initrd."
`(#: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+out->input package out)
+ (gexp-input package out))
+
+ (define package-inputs
+ (map (lambda (p)
+ (match p
+ ((p o) (package+out->input p o))
+ (p (package+out->input p "out"))))
+ packages))
+
(define build-exp
(with-imported-modules imported-modules
(with-extensions (list guile-zlib)
@@ -135,11 +145,12 @@ MODULES and taken from LINUX."
(srfi srfi-1)
(srfi srfi-26))
- (define module-dir
- (string-append #$linux "/lib/modules"))
+ (define module-dirs
+ (map (cut string-append <> "/lib/modules")
+ '#$package-inputs))
(define modules
- (let* ((lookup (cut find-module-file module-dir <>))
+ (let* ((lookup (cut find-module-file module-dirs <>))
(modules (map lookup '#$modules)))
(append modules
(recursive-module-dependencies
@@ -172,20 +183,23 @@ MODULES and taken from LINUX."
#:key
(linux linux-libre)
(linux-modules '())
+ (linux-extra-module-paths '())
(mapped-devices '())
(keyboard-layout #f)
(helper-packages '())
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.
-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-PATHS 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
@@ -221,7 +235,8 @@ upon error."
#~())))
(define kodir
- (flat-linux-module-directory linux linux-modules))
+ (flat-linux-module-directory (cons linux linux-extra-module-paths)
+ linux-modules))
(expression->initrd
(with-imported-modules (source-module-closure
@@ -366,6 +381,7 @@ FILE-SYSTEMS."
#:key
(linux linux-libre)
(linux-modules '())
+ (linux-extra-module-paths '())
(mapped-devices '())
(keyboard-layout #f)
qemu-networking?
@@ -386,9 +402,10 @@ passphrase or use the REPL, this happens using the intended keyboard layout.
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 search paths for modules can be listed in
+LINUX-EXTRA-MODULE-PATHS. 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
@@ -408,6 +425,7 @@ loaded at boot time in the order in which they appear."
(raw-initrd file-systems
#:linux linux
#:linux-modules linux-modules*
+ #:linux-extra-module-paths linux-extra-module-paths
#:mapped-devices mapped-devices
#:helper-packages helper-packages
#:keyboard-layout keyboard-layout