[bug#68162] initrd: Parse kernel command line and pass module parameters
Commit Message
GUIX's initrd code ignores the kernel command line and always passes no parameters to the modules it loads.
This fixes it with command line parsing code that is accurate to what modprobe does.
The user's module options, like somemodule.param=val, are properly passed now.
It also allows the modprobe.blacklist option to optionally be quoted and normalizes the module names given in the blacklist.
modprobe.blacklist="module1,mod-ule2" -> '("module1" "mod_ule2")
I tested passing module options with the command line in a VM and on my real system.
Tested blacklist code in a VM.
I've also attached my code I used to test the commandline parsing function manually.
fix bug#55907
https://lists.gnu.org/archive/html/bug-guix/2022-06/msg00157.html
From 0cd4f6fb19c96a6be4a0d0851e1cf6dfd7046a27 Mon Sep 17 00:00:00 2001
Message-ID: <0cd4f6fb19c96a6be4a0d0851e1cf6dfd7046a27.1703992381.git.nathan_mail@nborghese.com>
In-Reply-To: <626930cbad11e7f5546589fc290b2c95fee97b80.1703992381.git.nathan_mail@nborghese.com>
References: <626930cbad11e7f5546589fc290b2c95fee97b80.1703992381.git.nathan_mail@nborghese.com>
From: nathan <nathan_mail@nborghese.com>
Date: Sat, 30 Dec 2023 22:12:19 -0500
Subject: [PATCH 3/3] linux-modules: Rewrite module-black-list with
parse-kernel-cmdline
* gnu/build/linux-modules.scm
(module-black-list): Use parse-kernel-cmdline. Strip quotes from module names.
Normalize module names so they can be properly compared with strings from
file-name->module-name.
Change-Id: I318006f98844593863246fc89ed1703767794702
---
gnu/build/linux-modules.scm | 31 +++++++++++++++++++------------
1 file changed, 19 insertions(+), 12 deletions(-)
@@ -397,18 +397,25 @@ (define (module-black-list)
is specified using 'modprobe.blacklist=MODULE1,MODULE2,...' on the kernel
command line; it is honored by libkmod for users that pass
'KMOD_PROBE_APPLY_BLACKLIST', which includes 'modprobe --use-blacklist' and
-udev."
- (define parameter
- "modprobe.blacklist=")
-
- (let ((command (call-with-input-file "/proc/cmdline"
- get-string-all)))
- (append-map (lambda (arg)
- (if (string-prefix? parameter arg)
- (string-tokenize (string-drop arg (string-length parameter))
- %not-comma)
- '()))
- (string-tokenize command))))
+udev. The names in the returned list are normalized with `normalize-module-name'."
+ (define target-parameter "blacklist=")
+
+ (let* ((cmdline (parse-kernel-cmdline (call-with-input-file "/proc/cmdline"
+ get-string-all)))
+ (modprobe-pair (vhash-assoc "modprobe" cmdline)))
+ (if modprobe-pair
+ (map normalize-module-name
+ (append-map
+ (lambda (param)
+ (if (string-prefix? target-parameter param)
+ (string-tokenize
+ (string-delete
+ #\"
+ (string-drop param (string-length target-parameter)))
+ %not-comma)
+ '()))
+ (cdr modprobe-pair)))
+ '())))
(define (module-loaded? module)
"Return #t if MODULE is already loaded. MODULE must be a Linux module name,
--
2.41.0