Mise à jour : Debian 9.4
Ce document décrit comment forcer, interdire ou paramétrer le chargement d'un module.
L'empêchement du chargement d'un module pendant le démarrage du noyau peut-être spécifié
soit dans la ligne de commande du noyau, cette solution semble la plus efficace
soit dans un fichier .conf du répertoire modprobe.d.
A noter que
Ce blocage ne bloque pas le chargement du module en tant que dépendance d'un autre module.
Les modules présents dans initrd.img ne peuvent pas être bloqués.
Exemple : Blocage du chargement du module bluetooth.ko
Par défaut le module bluetooth est chargé
# lsmod |grep "bluetooth "
bluetooth 548864 9 btrtl,btintel,bnep,btbcm,btusb
Avant de bloquer le module, vérifier qu'il n'est pas présent dans initrd.img
$ lsinitramfs /initrd.img |grep bluetooth.ko
Ajouter dans la ligne de commande du noyau : module_blacklist=module1,module2,module3. Exemple :
linux vmlinuz /vmlinuz root=/dev/sda1 quiet splash module_blacklist=bluetooth
Au redémarrage suivant, le module bluetooth n'est pas chargé :
$ lsmod |grep "bluetooth "
Et son chargement n'est pas autorisé !
# modprobe bluetooth
modprobe: ERROR: could not insert 'bluetooth': Operation not permitte
Créer un fichier.conf dans le répertoire modprobe.d :
Il n'est pas suffisant de bloquer le module bluetooth, il faut également bloquer le module btusb
$ cat /etc/modprobe.d/nobluetooth.conf
# Blacklist du bluetooth
blacklist bluetooth
blacklist btusb
Puis mettre à jour initrd :
# update-initramfs -u
Au redémarrage suivant, le module bluetooth n'est pas chargé :
$ lsmod |grep "bluetooth "
Mais son chargement est autorisé !
# modprobe bluetooth
Les paramètres modifiés peuvent être spécifiés
soit dans la ligne de commande du noyau
soit dans un fichier .conf du répertoire modprobe.d.
A noter que
La modification peut s'effectuer sur un module présent dans initrd.img
Exemple : Suppression du modesetting du module i915
Les valeurs possibles du modesetting du module d'affichage i915 sont 0, 1 et -1 :
# modinfo i915 |grep modesetting
parm: modeset:Use kernel modesetting [KMS] (0=disable, 1=on, -1=force vga console preference [default]) (int)
Par défaut, le modesetting vaut -1 et est autorisé :
# systool -v -m i915 |grep modeset
modeset = "-1"
Le framebuffer inteldrmfb est activé :
# dmesg |grep inteldrmfb
[ 1.580936] fbcon: inteldrmfb (fb0) is primary device
[ 2.403081] i915 0000:00:02.0: fb0: inteldrmfb frame buffer device
Pour supprimer le modesetting :
Pour charger un module avec un paramètre donné, ajouter dans la ligne de commande du noyau, nom_du_module.nom_du_paramètre=valeur
linux vmlinuz /vmlinuz root=/dev/sda1 quiet splash i915.modeset=0
Au redémarrage suivant, la console est en mode texte, le framebuffer est
# systool -v -m i915 |grep modeset
0
Le framebuffer interldrmfb est absent
# dmesg |grep inteldrmfb
Créer un fichier .conf dans le répertoire modprobe.d :
$ cat /etc/modprobe.d/nomodeset.conf
# nomodeset
options i915 modeset=0
Puis mettre à jour initrd :
# update-initramfs -u
Au redémarrage suivant, le modesetting est supprimé, comme dans la solution 1.
L'objectif est de forcer le chargement d'un module.
Ajouter les noms des modules à charger dans des fichiers xxxx.conf du répertoire /etc/modules-load.d. Exemple, chargement du module fan, qui n'est pas chargé par défaut :
$ cat /etc/modules-load.d/fan.conf
# kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
fan
Puis mettre à jour initrd
# update-initramfs -u
Au redémarrage suivant, le module fan est chargé.
Cette méthode permet un chargement du module pendant les toutes premières phases du chargement du noyau.
$ cat /etc/initramfs-tools/modules
# List of modules that you want to include in your initramfs.
# They will be loaded at boot time in the order below.
#
# Syntax: module_name [args ...]
#
# You must run update-initramfs(8) to effect this change.
#
# Examples:
#
# raid1
# sd_mod
pcspkr
# update-initrafms -u
On peut vérifier que le module (s'il n'était pas déjà présent) a été ajouté dans initrd.img
# lsinitramfs /initrd.img |grep pcspkr.ko
lib/modules/4.9.0-0.bpo.1-amd64/kernel/drivers/input/misc/pcspkr.ko
Au démarrage suivant, le module est installé et chargé :
# dmesg |grep pcspkr
[ 2.522073] input: PC Speaker as /devices/platform/pcspkr/input/input16
$ lsmod |grep pcspkr
pcspkr 16384 0