Modules externes (loadable)

Modules externes (loadable)

Mise à jour : Debian 10.6

Les modules externes, par opposition aux modules internes, ne sont pas inclus dans le noyau vmlinuz, mais sont présents dans le système de fichier racine. Ils doivent être chargés pour être utilisés.

Référence

Sommaire

1 - Liste des modules

$ dpkg -L linux-image-$(uname -r) |grep .ko |head
/lib/modules/5.8.0-0.bpo.2-amd64/kernel/arch/x86/crypto/aegis128-aesni.ko
/lib/modules/5.8.0-0.bpo.2-amd64/kernel/arch/x86/crypto/aesni-intel.ko
/lib/modules/5.8.0-0.bpo.2-amd64/kernel/arch/x86/crypto/blake2s-x86_64.ko
/lib/modules/5.8.0-0.bpo.2-amd64/kernel/arch/x86/crypto/blowfish-x86_64.ko
/lib/modules/5.8.0-0.bpo.2-amd64/kernel/arch/x86/crypto/camellia-aesni-avx-x86_64.ko
/lib/modules/5.8.0-0.bpo.2-amd64/kernel/arch/x86/crypto/camellia-aesni-avx2.ko
/lib/modules/5.8.0-0.bpo.2-amd64/kernel/arch/x86/crypto/camellia-x86_64.ko
/lib/modules/5.8.0-0.bpo.2-amd64/kernel/arch/x86/crypto/cast5-avx-x86_64.ko
/lib/modules/5.8.0-0.bpo.2-amd64/kernel/arch/x86/crypto/cast6-avx-x86_64.ko
/lib/modules/5.8.0-0.bpo.2-amd64/kernel/arch/x86/crypto/chacha-x86_64.ko
$ ls -l /lib/modules/5.8.0-0.bpo.2-amd64/kernel/
total 40
drwxr-xr-x 3 root root 4096 oct. 10 11:52 arch
drwxr-xr-x 2 root root 4096 oct. 10 11:52 block
drwxr-xr-x 4 root root 4096 oct. 10 11:52 crypto
drwxr-xr-x 74 root root 4096 oct. 10 11:52 drivers
drwxr-xr-x 59 root root 4096 oct. 10 11:52 fs
drwxr-xr-x 8 root root 4096 oct. 10 11:52 lib
drwxr-xr-x 2 root root 4096 oct. 10 11:52 mm
drwxr-xr-x 52 root root 4096 oct. 10 11:52 net
drwxr-xr-x 15 root root 4096 oct. 10 11:52 sound
drwxr-xr-x 3 root root 4096 oct. 10 11:52 virt

2 - Propriétés d'un module

La commande modinfo permet d'obtenir des informations sur un module qu'il soit chargé ou non

$ sudo modinfo -F filename btusb 
/lib/modules/5.8.0-0.bpo.2-amd64/kernel/drivers/bluetooth/btusb.ko
$ sudo modinfo -a btusb 
Marcel Holtmann <marcel@holtmann.org>
$ sudo modinfo -d btusb 
Generic Bluetooth USB driver ver 0.8
$ sudo modinfo -p btusb
disable_scofix:Disable fixup of wrong SCO buffer size (bool)
force_scofix:Force fixup of wrong SCO buffers size (bool)
enable_autosuspend:Enable USB autosuspend by default (bool)
reset:Send HCI reset command on initialization (bool)
$ sudo modinfo -F version btusb
0.8
$ sudo modinfo -F depends btusb
usbcore,btbcm,btrtl,bluetooth,btintel

Cette liste ne comprend pas les dépendances des dépendances : voir modprobe -D

$ sudo modinfo -F firmware btusb
mediatek/mt7668pr2h.bin
mediatek/mt7663pr2h.bin

2.2 - Alias

$ sudo modinfo -F alias btusb |head
usb:v8087p0A5Ad*dc*dsc*dp*ic*isc*ip*in*
usb:v0930p*d*dc*dsc*dp*icFFisc01ip01in*
usb:v413Cp*d*dc*dsc*dp*icFFisc01ip01in*
usb:v13D3p*d*dc*dsc*dp*icFFisc01ip01in*
usb:v050Dp*d*dc*dsc*dp*icFFisc01ip01in*
usb:v0B05p*d*dc*dsc*dp*icFFisc01ip01in*
usb:v0A5Cp*d*dc*dsc*dp*icFFisc01ip01in*
usb:v04CAp*d*dc*dsc*dp*icFFisc01ip01in*
usb:v0489p*d*dc*dsc*dp*icFFisc01ip01in*
usb:v0BB4p*d*dc*dsc*dp*icFFisc01ip01in*

$ sudo modinfo -F alias iwlwifi |head
pci:v00008086d00007AF0sv*sd00000A10bc*sc*i*
pci:v00008086d00007AF0sv*sd00000510bc*sc*i*
pci:v00008086d00007AF0sv*sd00000310bc*sc*i*
pci:v00008086d00007AF0sv*sd000000B0bc*sc*i*
pci:v00008086d00007AF0sv*sd00000090bc*sc*i*
pci:v00008086d00007A70sv*sd00000A10bc*sc*i*
pci:v00008086d00007A70sv*sd00000510bc*sc*i*
pci:v00008086d00007A70sv*sd00000310bc*sc*i*
pci:v00008086d00007A70sv*sd000000B0bc*sc*i*
pci:v00008086d00007A70sv*sd00000090bc*sc*i*

Chaque ligne ci-dessus correspond à un alias et indique

3 - Chargement

3.1 - Principe

La commande modprobe, avec l'option -D, fournit la liste complète des dépendances et de leurs dépendances

$ sudo modprobe -D btusb
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/lib/crypto/libaes.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/lib/crc16.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/drivers/usb/common/usb-common.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/drivers/usb/core/usbcore.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/net/rfkill/rfkill.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/crypto/ecc.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/crypto/ecdh_generic.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/net/bluetooth/bluetooth.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/drivers/bluetooth/btintel.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/drivers/bluetooth/btbcm.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/drivers/bluetooth/btrtl.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/drivers/bluetooth/btusb.ko

3.2 - Liste des modules chargés

$ lsmod |head
Module Size Used by
ctr 16384 1
ccm 20480 3
rfcomm 90112 12
fuse 139264 3
cmac 16384 1
bnep 28672 2
intel_rapl_msr 20480 0
intel_rapl_common 32768 1 intel_rapl_msr
snd_hda_codec_hdmi 73728 1

3.2 - Chargement manuel

$ sudo modprobe btusub

Pour charger un module en spécifiant un ou des paramètres :

$ sudo modprobe btusb reset="N"

3.3 - Déchargement manuel

$ sudo modprobe -r btusb
$ sudo modprobe -r usbcore
modprobe: FATAL: Module usbcore is in use.
$ sudo modprobe -D btusb
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/lib/crypto/libaes.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/lib/crc16.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/drivers/usb/common/usb-common.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/drivers/usb/core/usbcore.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/net/rfkill/rfkill.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/crypto/ecc.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/crypto/ecdh_generic.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/net/bluetooth/bluetooth.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/drivers/bluetooth/btintel.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/drivers/bluetooth/btbcm.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/drivers/bluetooth/btrtl.ko
insmod /lib/modules/5.8.0-0.bpo.2-amd64/kernel/drivers/bluetooth/btusb.ko

4 - Modification des paramètres

$ ls  /sys/module/btusb
coresize holders initstate parameters sections taint version
drivers initsize notes refcnt srcversion uevent

$ ls /sys/module/btusb/parameters/
disable_scofix force_scofix reset

$ cat /sys/module/btusb/parameters/disable_scofix
N
$ systool -v -m btusb
Module = "btusb"
-v
Attributes:
coresize = "45056"
initsize = "0"
initstate = "live"
refcnt = "0"
srcversion = "AB62B47F0B3954E3AE1370B"
taint = "E"
uevent = <store method only>
version = "0.8"

Parameters:
disable_scofix = "N"
force_scofix = "N"
reset = "Y"
.......
# echo "N" > /sys/module/btusb/parameters/reset

Il peut-être nécessaire de décharger, recharger le module pour que la modification du paramètre soit acceptée ou prise en compte.

5 - Investigations

5.1 - Recherche du module à charger en fonction du périphérique

Utiliser le fichier modules.alias, pour rechercher le module correspondant à un composant dont on connaît

$ cat /lib/modules/$(uname -r)/modules.alias | grep -i 8086| grep -i 100E
alias pci:v00008086d0000100Esv*sd*bc*sc*i* e1000

Le module recherché a pour nom e1000.

5.2 - Recherche d'un module

$ ls /lib/modules/4.8.0-0.bpo.2-686-pae/kernel/
arch crypto drivers fs lib mm net security sound virt

et la liste des modules est donnée par :

$ find /lib/modules/$(uname -r) -name *.ko
$ find /lib/modules/$(uname -r) -name *.ko |grep asus
/lib/modules/4.8.0-0.bpo.2-686-pae/kernel/drivers/hid/hid-asus.ko
/lib/modules/4.8.0-0.bpo.2-686-pae/kernel/drivers/media/rc/keymaps/rc-asus-ps3-100.ko
/lib/modules/4.8.0-0.bpo.2-686-pae/kernel/drivers/media/rc/keymaps/rc-asus-pc39.ko
/lib/modules/4.8.0-0.bpo.2-686-pae/kernel/drivers/net/usb/pegasus.ko
/lib/modules/4.8.0-0.bpo.2-686-pae/kernel/drivers/platform/x86/asus-wmi.ko
/lib/modules/4.8.0-0.bpo.2-686-pae/kernel/drivers/platform/x86/asus-wireless.ko
/lib/modules/4.8.0-0.bpo.2-686-pae/kernel/drivers/platform/x86/asus-laptop.ko
/lib/modules/4.8.0-0.bpo.2-686-pae/kernel/drivers/platform/x86/asus-nb-wmi.ko
/lib/modules/4.8.0-0.bpo.2-686-pae/kernel/drivers/hwmon/asus_atk0110.ko

5.3 - Recherche des utilisant un module

# find /sys/bus/*/drivers/* -maxdepth 1 -lname '*devices*'
/sys/bus/acpi/drivers/ac/ACPI0003:00
/sys/bus/acpi/drivers/battery/PNP0C0A:00
/sys/bus/acpi/drivers/button/PNP0C0E:00
/sys/bus/acpi/drivers/button/PNP0C0D:00
/sys/bus/acpi/drivers/button/PNP0C0C:00
......
# find /sys/bus/*/drivers/* -maxdepth 1 -lname '*devices*' -ls |grep atl1c
9865 0 lrwxrwxrwx 1 root root 0 janv. 29 19:34 /sys/bus/pci/drivers/atl1c/0000:05:00.0 -> ../../../../devices/pci0000:00/0000:00:1c.5/0000:05:00.0

# lspci -s 00:05:00.0
05:00.0 Ethernet controller: Qualcomm Atheros AR8151 v2.0 Gigabit Ethernet (rev c0)

Le module atl1c est utilisé par le contrôleur ethernet Qualcomm Atheros

5.4 - Vérification de la détection d'un périphérique et du chargement d'un module

$ sudo dmesg |grep usb-storage
[ 4725.039088] usb-storage 5-2:1.0: USB Mass Storage device detected
[ 4725.041009] scsi host2: usb-storage 5-2:1.0
[ 4725.041330] usbcore: registered new interface driver usb-storage
$ sudo udevadm monitor & sudo modprobe -r iwlmvm iwlwifi
[5] 4389
KERNEL[2211.763603] change /devices/pci0000:00/0000:00:14.3/leds/phy0-led (leds)
KERNEL[2211.763627] change /devices/pci0000:00/0000:00:14.3/leds/phy0-led (leds)
KERNEL[2211.763636] change /devices/pci0000:00/0000:00:14.3/leds/phy0-led (leds)
KERNEL[2211.763636] change /devices/pci0000:00/0000:00:14.3/leds/phy0-led (leds)
KERNEL[2211.763968] remove /devices/pci0000:00/0000:00:14.3/leds/phy0-led (leds)
KERNEL[2211.763970] remove /devices/pci0000:00/0000:00:14.3/leds/phy0-led (leds)
KERNEL[2211.763972] remove /devices/pci0000:00/0000:00:14.3/leds/phy0-led (leds)
KERNEL[2211.763994] remove /devices/virtual/thermal/thermal_zone4/hwmon6 (hwmon)
......
# exit