Les modules Linux

Un module est un morceau de code permettant d'ajouter des fonctionnalités au noyau : pilotes de périphériques matériels, protocoles réseaux, etc…

Il peut être chargé dynamiquement sans avoir besoin de recompiler le noyau (avec la commande insmod ou modprobe) ou de redémarrer le système.

Les modules sont exécutés dans l'espace mémoire du noyau :

  • Ils possèdent le contrôle total de la machine
  • Ils peuvent détourner ou créer un appel système

Un petit schéma pour mieux comprendre :

Lister les modules actifs

On peut connaître tous les modules actifs en tapant lsmod dans un terminal (ajouter "| more" pour afficher page par page) :

$ lsmod | more
Module                  Size  Used by
rt2500                176612  1
ppdev                   9220  0
speedstep_lib           4484  0
cpufreq_userspace       4696  0
cpufreq_stats           5636  0
freq_table              4740  1 cpufreq_stats
....more...(Taper ESPACE)

On voit que le module "freq_table" est utilisé par "cpufreq_stats". Il y a des dépendances entre les modules. Il faut en tenir compte lorsque l'on veut décharger des modules.

Information sur un module

La commande modinfo peut rendre de bons services :

$ modinfo rt2500
filename: /lib/modules/2.6.15-28-386/kernel/drivers/net/wireless/rt2500/rt2500.ko
author:         http://rt2x00.serialmonkey.com
description:    Ralink RT2500 802.11g WLAN driver 1.1.0 CVS 2005/07/10
license:        GPL
vermagic:       2.6.15-28-386 preempt 486 gcc-4.0
depends:
alias:          pci:v00001814d00000201sv*sd*bc*sc*i*
srcversion:     87483C74300BD5B978A24E4
parm:           ifname:Network device name (default ra%d) (charp)\\
parm:           debug:Enable level: accepted values: 1 to switch debug on, 0 to switch debug off. (int)

On voit que rt2500 s'occupe de la gestion d'une interface wlan chipset Ralink rt2500 et on est bien content qu'elle fonctionne. (cette interface s'appelle ra*)

Si l'on ne désire qu'une information précise, on peut spécifier le champ (field) à afficher avec l'option -F. Par exemple, si nous ne voulons voir que la description du module rt2500 :

$ modinfo rt2500 -F description
Ralink RT2500 802.11g WLAN driver 1.1.0 CVS 2005/07/10

Sachez cependant que tous les modules ne fournissent pas les même informations, et qu'il se peut que ce type de commande ne renvoie rien. Par exemple, le module rt2500 n'a pas de champ "version", alors que le module 8139too en a un. Il y a cependant des champs standards que tous les modules devraient avoir, comme author, description, license, parm, depends, et alias.

Chargement/Déchargement d'un module

Pour ce qui est du chargement et du déchargement d'un module, il faut utiliser la commande modprobe :

Charger

Pour charger manuellement le module "3c59x" (il y a de grandes chances qu'il soit chargé si vous en avez besoin…) :

$ sudo modprobe -a 3c59x

Décharger

Pour décharger le module "3c59x" (imaginons que l'interface eth0 soit inutile et que celle-ci soit gérée par "3c59x"…) :

$ sudo modprobe -r 3c59x

Lister

Voir la liste des modules (on peut aussi utiliser l'utilitaire "modconf" - cf plus bas) :

lsmod

A utiliser avec "| grep" !!


Options d'un module

FIXME

Comme nous l'avons vu plus haut, certains modules possèdent des options ("parm"). Ces options permettent un plus grand contrôle sur le module en lui-même.

Ces options se chargent de plusieurs manières. Exemple :

modprobe snd_ens1371 joystick_port=1

les "parm" vous indique quoi mettre :

  • int = entier
  • bool = booléen (0 ou 1)
  • array of int = plusieurs entier
  • array of bool = plusieurs bits

FIXME

Pour que cela soit pris en compte directement au lancement il faut éditer le fichier /etc/modprobe.d/option et y ajouter une ligne.

Exemple :

options snd_ens1371 joystick_port=1

Modules au démarrage

Il est possible de spécifier des modules à charger au démarrage, même si le périphérique à piloter par un module n'a pas été trouvé.

Cela peut être utile pour les périphériques ne permettant pas d'auto-détection, comme les périphériques reliés au port parallèle.

La liste des modules à charger explicitement au démarrage est dressée dans le fichier /etc/modules. Chaque ligne de ce fichier représente un module à charger, sauf les lignes vides ou commençant par un #. Vous pouvez ajouter un module en éditant le fichier /etc/modules avec les droits d'administration.

Par exemple, si vous avez un lecteur Zip en parallèle, il vous sera sans doutes utile d'ajouter le module ppa dans cette liste. Chez moi, le fichier /etc/modules ressemble à ça :

# /etc/modules: 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.

ppa
lp
Les modules sont chargés dans l'ordre dans lequel ils sont listés. Faites bien attention à cela, car l'ordre peut être important dans certains cas.

Empêcher le chargement d'un module

Il peut parfois être utile d'empêcher le noyau de charger un module automatiquement, par exemple si celui-ci pose des problèmes de stabilité. Un module prohibé ne sera pas chargé au démarrage ou au branchement à chaud du périphérique, mais pourra quand-même être chargé à la main, par exemple à l'aide de modprobe.

La liste des modules que le noyau n'a pas le droit de charger se trouve principalement dans le fichier /etc/modprobe.d/blacklist.conf.

La structure de ce fichier est simple ; une ligne est construite comme suit :

blacklist nom-du-module


Pour prohiber un module, éditez le fichier /etc/modprobe.d/blacklist.conf avec les droits administrateur (root), et ajoutez en fin de fichier une ligne structurée comme ci-dessus.

Par exemple, si le module r818x vous pose problème, il faut ajouter au fichier /etc/modprobe.d/blacklist.conf la ligne suivante :

blacklist r818x

puis il faut exécuter :

sudo update-initramfs -u -k all
Facultatif : pour s'y retrouver plus tard, il est intéressant de préciser la date et le motif
# 
# suite au problème de...
blacklist r818x    # ajout en date du...
#

Tout ce qui est à droite d'un "#" sera ignoré par le système.

Lier un module à un périphérique

Il est possible de lier un module à un périphérique de façon à ce que le noyau puisse charger automatiquement ce module lors de la détection du périphérique, tout en respectant les deux règles présentées ci-dessus.

Il suffit d'ajouter la ligne suivante dans /etc/modprobe.conf :

alias périphérique module

Par exemple pour indiquer que le périphérique eth0 utilise le module tg3 :

alias eth0 tg3

module-assistant

Module-assistant est un outil simplifiant la création de paquets contenant des modules. Il aide les utilisateurs et contributeurs en s'occupant des modules externes du kernel empaquetés pour Debian. Il peut :

* Préparer automatiquement l'environnement de compilation (ex : détection et installation automatiques des sources et les headers du kernel requis)

* Téléchargements automatiques des codes sources des modules

* Configuration et maintien des paquets des modules externes et compilés localement

* Compilations multiples pour versions du kernel multiples semi-automatiques

Il contient également des Frameworks utilisés par les scripts de compilation qui accompagnent les paquets modules-source dans Debian.

module-assistant :

Pour installer module-assistant, installez le paquet module-assistant

$ sudo module-assistant

Hardinfo

Hardinfo n'est pas vraiment un programme spécifique pour les modules, mais il propose un grand nombres d'informations sur votre ordinateur, dont les modules utilisés par les périphériques.

Pour vous le procurer, il vous suffit d'installer le paquet hardinfo

Vous le trouverez ensuite dans Applications → Outils système → System Profiler and Benchmark


Plus d'infos sur :

  • tutoriel/tout_savoir_sur_les_modules_linux.txt
  • Dernière modification: Le 10/05/2018, 18:00
  • (modification externe)