We sometimes see that a module that is automatically loaded causes
problems, either because of a bug or because of a driver conflict.
Therefore, it would be nice to be able to have a generic facility to
blacklist modules for the installer and to have those carried over into
the installed system.
I propose to implement something like the patch below to rootskel.
Note that debconf cannot be used as the blacklisting needs to happen
_before_ udev is run for the first time.
Patch has been tested and seems to work nicely.
Current format is "blacklist=module1,module2".
Alternative formats could be "module.blacklist" or "module.off" (possibly
a bit harder to implement).
A last option could be "module.blacklist=yes", which is probably most
consistent with "module.param=value".
I have not checked if the parameter accidentally ends up in e.g. grub
config. It should be possible to avoid that. The last alternative format
is least likely to cause problems in that respect.
Copying the resulting blacklist.local file into /target would be done in a
post-base-installer.d hook script.
While working on this I noticed a fairly structural issue.
The module-init-tools udeb still contains an /etc/modprobe.conf, which
means that anything under /etc/modprobe.d/ gets ignored. But the udev
udeb _does_ contain a few files in /etc/modprobe.d/.
Marco is going to fix module-init-tools, but that means we may see some
changes in behavior in d-i as a result.
Despite the slight risk, I still feel that this should be done.
Cheers,
FJP
Index: src/lib/debian-installer-startup.d/S02module-params
===================================================================
--- src/lib/debian-installer-startup.d/S02module-params (revision 43884)
+++ src/lib/debian-installer-startup.d/S02module-params (working copy)
@@ -1,16 +1,26 @@
# Before udev is started, parse kernel command word for module params of
# the form module.param=value and register them so they will be used when
-# modules are loaded.
+# modules are loaded. Also check for modules to be blacklisted.
+
for word in $(cat /proc/cmdline); do
var="${word%=*}"
val="${word#[!=]*=}"
# grep out the normal variables with no dots
varnodot="${var##*.*}"
+
if [ "$var" != "" ] && [ "$varnodot" = "" ]; then
module="${var%.*}"
param="${var#[!.]*.}"
if [ "$module" != "" ] && [ "$param" != "" ]; then
register-module -p -a "$module" "$param=$val"
fi
+ elif [ "$var" = blacklist ] && [ -d /etc/modprobe.d ]; then
+ echo "# Modules blacklisted during installation" \
+ >/etc/modprobe.d/blacklist.local
+ # We need comma-separation
+ for module in $(echo $val | sed 's/,/ /g'); do
+ echo "blacklist $module" \
+ >>/etc/modprobe.d/blacklist.local
+ done
fi
done
Attachment:
pgpX6mbi4r2jA.pgp
Description: PGP signature