« Kernel-modules » : différence entre les versions

De Lea Linux
Aller à la navigation Aller à la recherche
(licence)
 
(12 versions intermédiaires par 5 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
[[Category:Configurer votre noyau]]
[[Catégorie:Noyau et modules]]
 
= Les modules de Linux =
= Les modules de Linux =


<div class="leatitre">Les modules de Linux</div><div class="leapar">par Jean-Christophe</div><div class="leadesc">Comment fonctionnent ces mystérieux modules ?</div>
par [[Utilisateur:LeaJice|Jean-Christophe]]
----
 
Comment fonctionnent ces mystérieux modules ?
 
{{Historique}}


Si vous ne savez pas ce que sont les modules, allez voir le glossaire !
Si vous ne savez pas ce que sont les modules, allez voir le [[Glossaire#module|glossaire]] !


== A quoi ça sert ? ==
== A quoi ça sert ? ==


; Bon, puisque vous avez pas été lire le glosssaire, voici la définition qui en est donnée :
; Bon, puisque vous n'avez pas été lire le glossaire, voici la définition qui en est donnée :
: Les modules sont une façon qui a été trouvée pour rendre Linux (le noyau) plus modulaire (!) et plus léger. En effet, ce sont le plus souvent des drivers qui ont été "sortis" du noyau dans des fichiers séparés, et qui sont chargés en mémoire, soit automatiquement lorsqu'on se sert du périphérique concerné, soit manuellement. Ils permettent de réduire la taille mémoire utilisée par le noyau lui-même. Le concept de modules permet aussi d'ajouter des drivers de périphériques au système sans devoir recompiler le noyau.
: Les modules sont une façon qui a été trouvée pour rendre Linux (le noyau) plus modulaire (!) et plus léger. En effet, ce sont le plus souvent des pilotes qui ont été "sortis" du noyau dans des fichiers séparés, et qui sont chargés en mémoire, soit automatiquement lorsqu'on se sert du périphérique concerné, soit manuellement. Ils permettent de réduire la taille mémoire utilisée par le noyau lui-même. Le concept de modules permet aussi d'ajouter des pilotes de périphériques au système sans devoir recompiler le noyau.


Bon, c'est clair il me semble (normal, c'est moi qui aie écrit ça ;). Les modules permettent aussi d'ajouter des drivers 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 drivers, 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 driver, mais aussi un protocole de communication (par ex. <tt>ppp</tt>) ou n'importe quoi d'autre.
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. <tt>ppp</tt>) ou n'importe quoi d'autre.


== Où se trouvent-ils ? ==
== Où se trouvent-ils ? ==


Ils résident dans <tt>/lib/modules/version_du_noyau</tt>. exemple : <tt>/lib/modules/2.2.15</tt>.
Ils résident dans <tt>/lib/modules/version_du_noyau</tt>. exemple : <tt>/lib/modules/2.4.17</tt>.


Ce répertoire contient les dossiers suivants qui permettent de séparer les modules selon leur type : <br /> 
Ce répertoire contient les dossiers suivants qui permettent de séparer les modules selon leur type : <br />  


<center>
<center>
Ligne 33 : Ligne 37 :
|-
|-
| <tt>net/</tt>
| <tt>net/</tt>
| drivers des cartes réseaux et protocoles
| pilotes des cartes réseaux et protocoles
|-
|-
| <tt>scsi/</tt>
| <tt>scsi/</tt>
Ligne 39 : Ligne 43 :
|-
|-
| <tt>cdrom/</tt>
| <tt>cdrom/</tt>
| drivers CDROM non IDE (anciens CD-ROMs)
| pilotes CDROM non IDE (anciens CD-ROMs)
|-
|-
| <tt>ipv4/</tt><br /><tt>ipv6/</tt>
| <tt>ipv4/</tt><br /><tt>ipv6/</tt>
Ligne 53 : Ligne 57 :
</center>
</center>


Ce répertoire peut contenir d'autres dossiers, plus un fichier nommé <tt>modules.dep</tt>, 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.
Ce répertoire peut contenir d'autres dossiers, plus un fichier nommé <tt>modules.dep</tt>, 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 <span class="code">depmod -a</span> placée dans les scripts de démarrage.


== Comment les manipuler ? ==
== Comment ajouter des modules, les recompiler ? ==
 
=== Modules livrés avec le noyau ===


Avec les programmes <tt>lsmod</tt>, <tt>insmod</tt>, <tt>rmmod</tt> et <tt>modprobe</tt> qui se situent dans <tt>/sbin</tt>.
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 <span class="code">M</span> voulue dans la config du noyau, puis enregistrer la configuration noyau et compiler le tout : <br/>
<span class="code"># make && su -c 'make modules_install'</span><br/>
(voir aussi la rubrique [[Kernel-kernel|noyau]])


* <tt>lsmod</tt> : voir quels modules sont chargés à l'heure actuelle. Cette commande affiche la liste des modules chargés, les dépendances entre les modules chargés, et dit si les modules sont utilisés ou non.
=== Modules livrés en dehors du noyau ===
* <tt>insmod module</tt> : charger un module en mémoire. Si "<tt>module</tt>" est spécifié sans extension (en général "<tt>.o</tt>"), <tt>insmod</tt> cherchera le module dans des répertoires par défaut, en général <tt>/lib/module/version_du_noyau</tt>. Sinon, il faut donner le chemin où trouver le module. (Par exemple : "<tt>insmod -f ./module.o</tt>" ; le "<tt>-f</tt>" permet de forcer le chargement d'un module qui a été compilé avec une version du noyau différente de celle du noyau qui tourne actuellement.)
* <tt>rmmod module</tt> : décharger un module, où "<tt>module</tt>" est le nom donné par <tt>lsmod</tt>.
* <tt>modprobe</tt> : la commande la plus puissante. "<tt>modprobe module</tt>" permet de charger en mémoire un module ainsi que tous les modules dont il dépend (en lisant le fichier <tt>modules.dep</tt>). "<tt>modprobe -r module</tt>" permet d'enlever un module de la mémoire, ainsi que tous les modules dont il dépend, sauf s'ils sont utilisés par un autre module bien sûr.


== Comment les recompiler / en ajouter ? ==
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 [http://www.o2.net/~gromitkc/winmodem.html cette page]. <br />Certains de ces modules sont livrés sous forme binaire, on peut alors s'en servir tel quels (<span class="code">insmod -f ./le_module</span>). 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).


=== Modules livrés avec le noyau ===
=== Prise en compte des nouveaux modules ===
 
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 <tt>/lib/modules/version_du_noyau/misc</tt> (pour les modules "noyau", la commande <span class="code">make modules_install</span> fait ça) <br />Il faut aussi faire un : <br /><span class="code"># depmod -a</span><br />Cette commande remet à jour le fichier <tt>modules.dep</tt>, en fonction du ou des nouveaux modules. <br />Ainsi, vous pourrez charger le module par <span class="code">modprobe le_module</span>.


Voir la rubrique [kernel.php3 noyau]. Pour ajouter un module, il faut éditer la configuration du noyau, cocher l'option 'M' voulue dans la config du noyau, puis enregistrer la configuration noyau, faire : <br /><tt><nowiki># make dep ; make modules ; make modules_install</nowiki></tt><br />(Si vous modifiez également la configuration du noyau lui-même, par exemple en supprimant ou ajoutant des options qui sont incluses dans le noyau, vous devez aussi recompiler/réinstaller le noyau comme indiqué dans la rubrique [kernel.php3 noyau].)
&rarr; Plus d'infos dans la page man de <tt>depmod</tt>


=== Modules livrés en dehors du noyau ===
== Comment les manipuler ? ==


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 [http://www.o2.net/~gromitkc/winmodem.html cette page]. <br />Certains de ces modules sont livrés sous forme binaire, on peut alors s'en servir tel quels (<tt>insmod -f ./le_module</tt>). 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).
Avec les programmes <span class="code">lsmod</span>, <span class="code">insmod</span>, <span class="code">rmmod</span> et <span class="code">modprobe</span> qui se situent dans <tt>/sbin</tt>.


=== Prise en compte des nouveaux modules ===
* <span class="code">lsmod</span> : voir quels modules sont chargés à l'heure actuelle. Cette commande affiche la liste des modules chargés, les dépendances entre les modules chargés, et dit si les modules sont utilisés ou non.
* <span class="code">insmod module</span> : charger un module en mémoire. Si <span class="code">module</span> est spécifié sans extension (en général <span class="code">.o</span>), <span class="code">insmod</span> cherchera le module dans des répertoires par défaut, en général <tt>/lib/module/version_du_noyau</tt>. Sinon, il faut donner le chemin où trouver le module. (Par exemple : <span class="code">insmod -f ./module.o</span> ; le <span class="code">-f</span> permet de forcer le chargement d'un module qui a été compilé avec une version du noyau différente de celle du noyau qui tourne actuellement.)
* <span class="code">rmmod module</span> : décharger un module, où <span class="code">module</span> est le nom donné par <span class="code">lsmod</span>.
* <span class="code">modprobe</span> : exécuter les commandes <span class="code">insmod</span> et <span class="code">rmmod</span> à votre place. <span class="code">modprobe le_module</span> charge <tt>le_module</tt> en mémoire ainsi que tous les modules dont il dépend (en lisant le fichier <tt>modules.dep</tt>). <span class="code">modprobe -r le_module</span> enleve <tt>le_module</tt> de la mémoire, ainsi que tous les modules dont il dépend, sauf s'ils sont utilisés par un autre module bien sûr.


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 <tt>/lib/modules/version_du_noyau/misc</tt> (pour les modules "noyau", la commande "<tt>make modules_install</tt>" fait ça) <br />Il faut aussi faire un : <br /><tt><nowiki># depmod -a</nowiki></tt><br />Cette commande remet à jour le fichier <tt>modules.dep</tt>, en fonction du ou des nouveaux modules. <br />Ainsi, vous pourrez charger le module par "<tt>modprobe le_module</tt>".
&rarr; Plus d'infos dans les pages man de <tt>lsmod</tt>, <tt>insmod</tt>, <tt>rmmod</tt> et <tt>modprobe</tt>.


== Comment faire pour les charger automatiquement ? ==
== Comment faire pour les charger automatiquement ? ==


=== ou : le chargeur de modules et <tt>/etc/conf.modules</tt> ===
=== Chargeur dynamique pour les noyaux 2.4 et antérieurs ===


Tout ça c'est bien beau, mais si à chaque fois avant de regarder la télé, il faut faire "<tt>modprobe bttv</tt>", ou si à chaque fois qu'on veut lancer Xracer il faut faire "<tt>modprobe 3dfx</tt>", ça va vite devenir fastidieux.
Tout ça c'est bien beau, mais si à chaque fois avant de regarder la télé, il faut faire <span class="code">modprobe bttv</span>, ou si à chaque fois qu'on veut lancer Xracer il faut faire <span class="code">modprobe 3dfx</span>, ça va vite devenir fastidieux.


Ce qu'on veut, c'est que le bon module se charge lorsqu'on utilise le périphérique (<tt>/dev/le_periph</tt>) correspondant. C'est simple. Il faut indiquer au chargeur de modules que pour acceder à ce périphérique il doit charger le module <tt>le_module</tt>. Cela se fait via son fichier de configuration : <tt>/etc/conf.modules</tt>.
Ce qu'on veut, c'est que le bon module se charge lorsqu'on utilise le périphérique (<tt>/dev/le_periph</tt>) correspondant. C'est simple. Il faut indiquer au chargeur de modules que pour acceder à ce périphérique il doit charger le module <tt>le_module</tt>. Cela se fait via son fichier de configuration <tt>/etc/modules.conf</tt> (pour les versions de modutils antérieures à 2.3.5-1, ce fichier s'appelle <tt>/etc/conf.modules</tt>).


Pour qu'un module soit chargé automatiquement, faire : <br /><tt><nowiki># ls -l /dev/le_periph</nowiki></tt><br />qui affiche une ligne ressemblant à : <br /><tt>crw-------   1 user     group '''<u>144</u>''', ''<u>12</u>'' May 25  2000 /dev/le_periph</tt><br />Dans la ligne qui s'affiche, noter le numéro dit "majeur",  c'est à dire le premier numéro qui suit le groupe, ici "'''144'''". Notez ce numéro.
Pour qu'un module soit chargé automatiquement, faire : <br /><span class="code"># ls -l /dev/le_periph</span><br />qui affiche une ligne ressemblant à : <br/><tt>crw-------   1 user    group '''<u>144</u>''', ''<u>12</u>'' May 25  2000 /dev/le_periph</tt><br/>
Pour chaque ligne est affiché :
* Un numéro majeur (ici '''144''') : il identifie le pilote du périphérique,
* Un numéro mineur (ici '''12''') : il sert à différencier les périphériques utilisant un même pilote.
 
Editez le fichier <tt>/etc/modules.conf</tt> dans votre éditeur de texte préféré et ajoutez une ligne : <br/><span class="code">alias char-major-144 le_module</span><br/>en remplaçant bien sûr <span class="code">144</span> par votre numéro, et <span class="code">le_module</span> par votre module. <br/>Par exemple, pour charger le module gérant la carte 3dfx, j'ai dans mon <tt>modules.conf</tt> la ligne suivante : <br /><span class="code">alias char-major-107 3dfx</span>


; <u>Remarque</u> :
; <u>Remarque</u> :
: Le numéro majeur (ici '''144''') sert à déterminer quel driver est nécessaire pour piloter ce périphérique, le numéro mineur (ici ''12'') sert à différencier les périphériques utilisant un même driver.
: Il existe des aliases prédéfinis pour remplacer <tt>char-major-xxx</tt> pour les périphériques courants : <tt>eth0</tt> pour la première carte ethernet (<tt>eth1</tt> pour la suivante, etc.), <tt>parport_lowlevel</tt> pour le port parallèle, <tt>sound</tt> pour la carte son, <tt>midi</tt> pour la partie midi de la carte son, etc.
 
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 : <br /><span class="code">options le_module irq=5 dma=0 dma2=1 mpu_io=0x388 io=0x370</span><br/>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 : <br/><span class="code">pre-install le_module la_commande</span>, ou : <br/><span class="code">post-install le_module la_commande</span>
 
&rarr; Plus d'infos dans la page man de <tt>modules.conf</tt>
 
==== Chargeur dynamique de modules sur Debian ====
 
Debian juge que l'édition du fichier <tt>modules.conf</tt> par l'utilisateur est trop risquée. A la place, elle propose d'éditer des fichiers dans le répertoire <tt>/etc/modutils/</tt>. Ces fichiers ont la même syntaxe que <tt>modules.conf</tt>. Il existe trois fichiers par défault :
* <tt>/etc/modutils/actions</tt> : regroupe toutes les actions sur les modules,
* <tt>/etc/modutils/aliases</tt> : regroupe tous les alias,
* <tt>/etc/modutils/paths</tt> : regroupe tous les chemins.
Une fois les fichiers mis à jour, la commande <span class="code">update-modules</span> lit les fichiers présents dans <tt>/etc/modutils/</tt> et regénère <tt>modules.conf</tt>.
 
&rarr; Plus d'infos dans la page man de <tt>update-modules</tt>
 
=== Chargeur dynamique pour les noyaux 2.6 et à venir ===


Editez le fichier <tt>/etc/conf.modules</tt> dans votre éditeur de texte préféré et ajoutez une ligne : <br /><tt>alias char-major-144 le_module</tt><br />en remplaçant bien sûr 144 par votre numéro, et <tt>le_module</tt> par votre module. <br />Par exemple, pour charger le module gérant la carte 3dfx, j'ai dans mon <tt>conf.modules</tt> la ligne suivante : <br /><tt>alias char-major-107 3dfx</tt>
Le fichier <tt>/etc/modules.conf</tt> ne sert plus et le fichier <tt>/etc/modprobe.conf</tt> est utilisé à la place. Sa syntaxe est une simplification de la syntaxe de <tt>modules.conf</tt>. Par exemple, à la place de
<span class="code">pre-install le_module une_commande_1
post-install le_module une_commande_2</span>
on aura
<span class="code">install le_module une_commande_1; modprobe --ignore-install le_module;une_commande_2</span>


; <u>Remarque</u> :
&rarr; Plus d'infos dans la page man de <tt>modprobe.conf</tt>
: Il existe des aliases prédéfinis pour remplacer <tt>char-major-xxx</tt> pour les périphériques courants : <tt>eth0</tt> pour la première carte ethernet (<tt>eth1</tt> pour la suivante, etc.), <tt>parport_lowlevel</tt> pour le port parallèle, <tt>sound</tt> pour la carte son, <tt>midi</tt> pour la partie midi de la carte son, etc.


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 : <br /><tt>options le_module irq=5 dma=0 dma2=1 mpu_io=0x388 io=0x370</tt><br />Chaque module a ses propres options, reportez-vous à la documentation de votre module afin de les connaître.
=== Chargeur statique de modules ===


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 : <br /><tt>pre-install le_module la_commande</tt> , ou : <br /><tt>post-install le_module la_commande</tt>
Il est possible de charger un module au démarrage de Linux en ajoutant une ligne avec le nom du module dans le fichier <tt>/etc/modules</tt>. 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.
Voilà, c'est tout, maintenant lorsqu'un programme utilisera le periphérique, plus besoin de charger le module à la main, cela se fera automatiquement.


Pour plus d'infos, regardez la page man de <tt>depmod</tt>, et des autres programmes (<tt>insmod</tt>, <tt>lsmod</tt>, etc.).
; <u>Remarque</u> :
: on peut faire des tas de choses "intéressantes" avec les modules, allez voir [http://www.safenetworks.com/Linux/modules.html cette page] par exemple... En résumé, si vous êtes un paranoïaque de la sécurité, n'utilisez pas les modules et compilez-vous un noyau complètement monolithique sans chargeur de modules (merci à [http://www.bruhat.net BooK] pour l'info).


<u>Remarque</u> : on peut faire des tas de choses "intéressantes" avec les modules, allez voir [http://www.safenetworks.com/Linux/modules.html cette page] par exemple... En résumé, si vous êtes un paranoïaque de la sécurité, n'utilisez pas les modules et compilez-vous un noyau complètement monolithique sans chargeur de modules (merci à [http://www.bruhat.net BooK] pour l'info).
<br/>
<br/>
'''<b>[[Kernel-index|@ Retour à la rubrique Noyau et modules]]</b>'''
<br/>


<div class="merci">Cette page est issue de la documentation 'pré-wiki' de Léa a été convertie avec HTML::WikiConverter. Elle fut créée par Jean-Christophe Cardot le 25/05/2000.</div>
<div class="merci">Cette page est issue de la documentation 'pré-wiki' de Léa et a été convertie avec HTML::WikiConverter. Elle fut créée par Jean-Christophe Cardot le 25/05/2000.</div>


= Copyright =
{{Copy|25/05/2000|[[Utilisateur:LeaJice|Jean-Christophe Cardot]]|CC-BY-SA}}
Copyright &copy; 25/05/2000, Jean-Christophe Cardot
{{CC-BY-NC-SA}}

Dernière version du 23 septembre 2013 à 14:09


Les modules de Linux

par Jean-Christophe

Comment fonctionnent ces mystérieux modules ?

[[Catégorie:{{{1}}} Documentations obsolètes]]

Cette documentation est considérée comme étant obsolète.

Cela signifie que la documentation sur cette page est dépassée. Léa-Linux vous incite à ne pas suivre cette documentation dans votre utilisation d'une distribution récente. Cette documentation est conservée uniquement dans un souci de curiosité et d'archive documentaire, mais au moins une partie des informations qui la compose n'est plus valide.

Trouvez des articles plus à jour dans la rubrique [[{{{1}}}]].

Si vous ne savez pas ce que sont les modules, allez voir le glossaire !

A quoi ça sert ?

Bon, puisque vous n'avez pas été lire le glossaire, voici la définition qui en est donnée
Les modules sont une façon qui a été trouvée pour rendre Linux (le noyau) plus modulaire (!) et plus léger. En effet, ce sont le plus souvent des pilotes qui ont été "sortis" du noyau dans des fichiers séparés, et qui sont chargés en mémoire, soit automatiquement lorsqu'on se sert du périphérique concerné, soit manuellement. Ils permettent de réduire la taille mémoire utilisée par le noyau lui-même. Le concept de modules permet aussi d'ajouter des pilotes de périphériques au système sans devoir recompiler le noyau.

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.

Où se trouvent-ils ?

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.

Comment ajouter des modules, les recompiler ?

Modules livrés avec le noyau

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)

Modules livrés en dehors du 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).

Prise en compte des nouveaux modules

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

Comment les manipuler ?

Avec les programmes lsmod, insmod, rmmod et modprobe qui se situent dans /sbin.

  • lsmod : voir quels modules sont chargés à l'heure actuelle. Cette commande affiche la liste des modules chargés, les dépendances entre les modules chargés, et dit si les modules sont utilisés ou non.
  • insmod module : charger un module en mémoire. Si module est spécifié sans extension (en général .o), insmod cherchera le module dans des répertoires par défaut, en général /lib/module/version_du_noyau. Sinon, il faut donner le chemin où trouver le module. (Par exemple : insmod -f ./module.o ; le -f permet de forcer le chargement d'un module qui a été compilé avec une version du noyau différente de celle du noyau qui tourne actuellement.)
  • rmmod module : décharger un module, où module est le nom donné par lsmod.
  • modprobe : exécuter les commandes insmod et rmmod à votre place. modprobe le_module charge le_module en mémoire ainsi que tous les modules dont il dépend (en lisant le fichier modules.dep). modprobe -r le_module enleve le_module de la mémoire, ainsi que tous les modules dont il dépend, sauf s'ils sont utilisés par un autre module bien sûr.

→ Plus d'infos dans les pages man de lsmod, insmod, rmmod et modprobe.

Comment faire pour les charger automatiquement ?

Chargeur dynamique pour les noyaux 2.4 et antérieurs

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é :

  • Un numéro majeur (ici 144) : il identifie le pilote du périphérique,
  • Un numéro mineur (ici 12) : il sert à différencier les périphériques utilisant un même pilote.

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

Remarque
Il existe des aliases prédéfinis pour remplacer char-major-xxx pour les périphériques courants : eth0 pour la première carte ethernet (eth1 pour la suivante, etc.), parport_lowlevel pour le port parallèle, sound pour la carte son, midi pour la partie midi de la carte son, etc.

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

Chargeur dynamique de modules sur Debian

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 :

  • /etc/modutils/actions : regroupe toutes les actions sur les modules,
  • /etc/modutils/aliases : regroupe tous les alias,
  • /etc/modutils/paths : regroupe tous les chemins.

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

Chargeur dynamique pour les noyaux 2.6 et à venir

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

Chargeur statique de modules

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.

Remarque
on peut faire des tas de choses "intéressantes" avec les modules, allez voir cette page par exemple... En résumé, si vous êtes un paranoïaque de la sécurité, n'utilisez pas les modules et compilez-vous un noyau complètement monolithique sans chargeur de modules (merci à BooK pour l'info).



@ Retour à la rubrique Noyau et modules

Cette page est issue de la documentation 'pré-wiki' de Léa et a été convertie avec HTML::WikiConverter. Elle fut créée par Jean-Christophe Cardot le 25/05/2000.

Copyright

© 25/05/2000 Jean-Christophe Cardot

Creative Commons License
Creative Commons Attribution iconCreative Commons Share Alike icon
Ce document est publié sous licence Creative Commons
Attribution, Partage à l'identique 4.0 :
https://creativecommons.org/licenses/by-sa/4.0/