par Jean-Christophe
Comment fonctionnent ces mystérieux modules ?
<cadre type=alert> Cette page est considérée comme étant obsolète.
C'est à dire que les informations qu'elle contient ne sont plus du tout à jour par rapport aux évolutions de GNU/Linux et des autres logiciels libres. Il peut même s'avérer risqué d'essayer de suivre les recommandations de cette page. Cette page n'est donc conservée que pour des raisons historiques ou les gens qui utiliseraient de vieilles distributions GNU/Linux. </cadre>
Si vous ne savez pas ce que sont les modules, allez voir le glossaire !
Bon, c'est clair il me semble (normal, c'est moi qui ai écrit ça ;). Les modules permettent aussi d'ajouter des pilotes distribués uniquement sous forme binaire ; on ne peut pas les recompiler, mais on peut s'en servir (ce qui est assez intéressant finalement ;). Les modules ne sont pas que des pilotes, d'une façon générale, ça peut être tout morceau de code qu'on a décidé d'externaliser par rapport au noyau, comme bien sûr un pilote, mais aussi un protocole de communication (par ex. ppp) ou n'importe quoi d'autre.
Ils résident dans /lib/modules/version_du_noyau. exemple : /lib/modules/2.4.17.
Ce répertoire contient les dossiers suivants qui permettent de séparer les modules selon leur type :
block/ | périphériques de type bloc |
fs/ | systèmes de fichier (FAT, ext2, etc.) |
misc/ | périphériques divers (carte tuner TV, port parallèle, carte son, joystick, etc.) |
net/ | pilotes des cartes réseaux et protocoles |
scsi/ | périphériques SCSI |
cdrom/ | pilotes CDROM non IDE (anciens CD-ROMs) |
ipv4/ ipv6/ |
protocole IP v4 et v6(protocole réseau) |
pcmcia/ | modules pour gérer les cartes PCMCIA |
video/ | gestion des cartes video en console, framebuffer |
Ce répertoire peut contenir d'autres dossiers, plus un fichier nommé modules.dep, qui contient les dépendances entre modules (le module parport_ide à besoin du module parport, etc.). Ce fichier est généralement regénéré à chaque boot par la commande depmod -a placée dans les scripts de démarrage.
Si vous avez compilé votre noyau vous même et que vous désirez ajouter un module livré avec le noyau, il faut éditer la configuration du noyau, cocher l'option M voulue dans la config du noyau, puis enregistrer la configuration noyau et compiler le tout :
# make && su -c 'make modules_install'
(voir aussi la rubrique noyau)
Parfois, des modules peuvent être trouvés en dehors de l'arborescence des sources du noyau. Par exemple, vous pouvez télécharger un driver pour certains winmodems (hé oui ça arrive !!!) sur cette page.
Certains de ces modules sont livrés sous forme binaire, on peut alors s'en servir tel quels (insmod -f ./le_module). D'autres sont livrés sous forme source sous license GPL ou non ; il faut d'abord les compiler (lisez la doc fournie avec ; cela nécessite en général d'avoir installé les sources du noyau).
Pour que les modules nouvellement installés soient pris en compte, si ce sont des modules "hors noyau", il est bon de les copier dans /lib/modules/version_du_noyau/misc (pour les modules "noyau", la commande make modules_install fait ça)
Il faut aussi faire un :
# depmod -a
Cette commande remet à jour le fichier modules.dep, en fonction du ou des nouveaux modules.
Ainsi, vous pourrez charger le module par modprobe le_module.
→ Plus d'infos dans la page man de depmod
Avec les programmes lsmod, insmod, rmmod et modprobe qui se situent dans /sbin.
→ Plus d'infos dans les pages man de lsmod, insmod, rmmod et modprobe.
Tout ça c'est bien beau, mais si à chaque fois avant de regarder la télé, il faut faire modprobe bttv, ou si à chaque fois qu'on veut lancer Xracer il faut faire modprobe 3dfx, ça va vite devenir fastidieux.
Ce qu'on veut, c'est que le bon module se charge lorsqu'on utilise le périphérique (/dev/le_periph) correspondant. C'est simple. Il faut indiquer au chargeur de modules que pour acceder à ce périphérique il doit charger le module le_module. Cela se fait via son fichier de configuration /etc/modules.conf (pour les versions de modutils antérieures à 2.3.5-1, ce fichier s'appelle /etc/conf.modules).
Pour qu'un module soit chargé automatiquement, faire :
# ls -l /dev/le_periph
qui affiche une ligne ressemblant à :
crw------- 1 user group 144, 12 May 25 2000 /dev/le_periph
Pour chaque ligne est affiché :
Editez le fichier /etc/modules.conf dans votre éditeur de texte préféré et ajoutez une ligne :
alias char-major-144 le_module
en remplaçant bien sûr 144 par votre numéro, et le_module par votre module.
Par exemple, pour charger le module gérant la carte 3dfx, j'ai dans mon modules.conf la ligne suivante :
alias char-major-107 3dfx
Si votre module a besoin d'options, par exemple pour connaître une adresse ou une interruption, vous pouvez aussi ajouter une ligne du type :
options le_module irq=5 dma=0 dma2=1 mpu_io=0x388 io=0x370
Chaque module a ses propres options, reportez-vous à la documentation de votre module afin de les connaître.
Enfin, si vous voulez lancer une commande avant ou après que le module soit chargé en mémoire, vous pouvez ajouter une ligne du type :
pre-install le_module la_commande, ou :
post-install le_module la_commande
→ Plus d'infos dans la page man de modules.conf
Debian juge que l'édition du fichier modules.conf par l'utilisateur est trop risquée. A la place, elle propose d'éditer des fichiers dans le répertoire /etc/modutils/. Ces fichiers ont la même syntaxe que modules.conf. Il existe trois fichiers par défault :
Une fois les fichiers mis à jour, la commande update-modules lit les fichiers présents dans /etc/modutils/ et regénère modules.conf.
→ Plus d'infos dans la page man de update-modules
Le fichier /etc/modules.conf ne sert plus et le fichier /etc/modprobe.conf est utilisé à la place. Sa syntaxe est une simplification de la syntaxe de modules.conf. Par exemple, à la place de pre-install le_module une_commande_1 post-install le_module une_commande_2 on aura install le_module une_commande_1; modprobe --ignore-install le_module;une_commande_2
→ Plus d'infos dans la page man de modprobe.conf
Il est possible de charger un module au démarrage de Linux en ajoutant une ligne avec le nom du module dans le fichier /etc/modules. Cependant, on perd l'intérêt de la modularité puisqu'il est chargé même s'il n'est pas utilisé.
Voilà, c'est tout, maintenant lorsqu'un programme utilisera le periphérique, plus besoin de charger le module à la main, cela se fera automatiquement.
@ Retour à la rubrique Noyau et modules
© 25/05/2000 Jean-Christophe Cardot
![]() ![]() ![]() |
Ce document est publié sous licence Creative Commons Attribution, Partage à l'identique 3.0 : http://creativecommons.org/licenses/by-sa/3.0/ |