Cet article est extrait du chapitre 15 de Linux in Action, publié par Manning.
Linux gère les périphériques matériels à l'aide de modules du noyau. Voici comment cela fonctionne.
Un noyau Linux en cours d'exécution est l'une de ces choses que vous ne voulez pas déranger. Après tout, le noyau est le logiciel qui pilote tout ce que fait votre ordinateur. Compte tenu du nombre de détails qui doivent être gérés simultanément sur un système en direct, il est préférable de laisser le noyau faire son travail avec le moins de distractions possible. Mais s'il est impossible d'apporter même de petites modifications à l'environnement de calcul sans redémarrer l'ensemble du système, le branchement d'une nouvelle webcam ou d'une nouvelle imprimante pourrait perturber douloureusement votre flux de travail. Devoir redémarrer chaque fois que vous ajoutez un appareil pour que le système le reconnaisse n'est guère efficace.
Pour créer un équilibre efficace entre les vertus opposées de la stabilité et de la convivialité, Linux isole le noyau, mais vous permet d'ajouter des fonctionnalités spécifiques à la volée via des modules de noyau chargeables (LKM). Comme le montre la figure ci-dessous, vous pouvez considérer un module comme un logiciel qui indique au noyau où trouver un périphérique et quoi en faire. À son tour, le noyau met l'appareil à la disposition des utilisateurs et des processus et supervise son fonctionnement.
Rien ne vous empêche d'écrire votre propre module pour prendre en charge un appareil exactement comme vous le souhaitez, mais pourquoi s'en soucier ? La bibliothèque de modules Linux est déjà si robuste qu'il n'est généralement pas nécessaire de lancer la vôtre. Et la grande majorité du temps, Linux chargera automatiquement le module d'un nouveau périphérique sans même que vous le sachiez.
Pourtant, il y a des moments où, pour une raison quelconque, cela ne se produit pas tout seul. (Vous ne voulez pas laisser ce responsable du recrutement attendre avec impatience votre visage souriant pour rejoindre l'entretien d'embauche par vidéoconférence pendant trop longtemps.) Pour faire avancer les choses, vous voudrez en savoir un peu plus sur les modules du noyau et, en particulier , comment trouver le module réel qui fera fonctionner votre périphérique, puis comment l'activer manuellement.
Rechercher des modules du noyau
Par convention acceptée, les modules sont des fichiers avec une extension .ko (objet noyau) qui vivent sous le /lib/modules/
annuaire. Cependant, avant de naviguer jusqu'à ces fichiers, vous devrez probablement faire un choix. Parce que vous avez la possibilité au démarrage d'en charger une à partir d'une liste de versions, le logiciel spécifique nécessaire pour prendre en charge votre choix (y compris les modules du noyau) doit exister quelque part. Eh bien, /lib/modules
/ est l'un de ces quelque part. Et c'est là que vous trouverez des répertoires remplis de modules pour chaque version disponible du noyau Linux; par exemple :
$ ls /lib/modules
4.4.0-101-generic
4.4.0-103-generic
4.4.0-104-generic
Dans mon cas, le noyau actif est la version avec le numéro de version le plus élevé (4.4.0-104-generic), mais rien ne garantit qu'il en sera de même pour vous (les noyaux sont fréquemment mis à jour). Si vous allez travailler avec des modules que vous aimeriez utiliser sur un système en direct, vous devez vous assurer que vous avez la bonne arborescence de répertoires.
Plus de ressources Linux
- Aide-mémoire des commandes Linux
- Aide-mémoire des commandes Linux avancées
- Cours en ligne gratuit :Présentation technique de RHEL
- Aide-mémoire sur le réseau Linux
- Aide-mémoire SELinux
- Aide-mémoire sur les commandes courantes de Linux
- Que sont les conteneurs Linux ?
- Nos derniers articles Linux
Bonne nouvelle :il existe une astuce fiable. Plutôt que d'identifier le répertoire par son nom et d'espérer trouver le bon, utilisez la variable système qui pointe toujours vers le nom du noyau actif. Vous pouvez invoquer cette variable en utilisant uname -r
(le -r
spécifie le numéro de version du noyau à partir des informations système qui seraient normalement affichées) :
$ uname -r
4.4.0-104-generic
Avec ces informations, vous pouvez incorporer uname
dans vos références de système de fichiers à l'aide d'un processus appelé substitution de commande . Pour naviguer vers le bon répertoire, par exemple, vous devez l'ajouter à /lib/modules
. Pour indiquer à Linux que "uname" n'est pas un emplacement de système de fichiers, incluez le uname
partie en backticks, comme ceci :
$ ls /lib/modules/`uname -r`
build modules.alias modules.dep modules.softdep
initrd modules.alias.bin modules.dep.bin modules.symbols
kernel modules.builtin modules.devname modules.symbols.bin
misc modules.builtin.bin modules.order vdso
Vous trouverez la plupart des modules organisés dans leurs sous-répertoires sous le kernel/
annuaire. Prenez quelques minutes pour parcourir ces répertoires pour avoir une idée de la façon dont les choses sont organisées et de ce qui est disponible. Les noms de fichiers vous donnent généralement une bonne idée de ce que vous regardez.
$ ls /lib/modules/`uname -r`/kernel
arch crypto drivers fs kernel lib mm
net sound ubuntu virt zfs
C'est une façon de localiser les modules du noyau; en fait, c'est la façon rapide et sale de s'y prendre. Mais ce n'est pas le seul moyen. Si vous souhaitez obtenir l'ensemble complet, vous pouvez répertorier tous les modules actuellement chargés, ainsi que quelques informations de base, en utilisant lsmod
. La première colonne de cette sortie tronquée (il y en aurait beaucoup trop pour les énumérer ici) est le nom du module, suivi de la taille et du nombre de fichiers, puis des noms des autres modules dont chacun dépend :
$ lsmod
[...]
vboxdrv 454656 3 vboxnetadp,vboxnetflt,vboxpci
rt2x00usb 24576 1 rt2800usb
rt2800lib 94208 1 rt2800usb
[...]
Combien sont beaucoup trop nombreux ? Eh bien, lançons lsmod
encore une fois, mais cette fois en redirigeant la sortie vers wc -l
pour obtenir un décompte des lignes :
$ lsmod | wc -l
113
Ce sont les modules chargés. Combien sont disponibles au total ? Exécution de modprobe -c
et compter les lignes nous donnera ce nombre :
$ modprobe -c | wc -l
33350
Il y a 33 350 modules disponibles !?! Il semble que quelqu'un ait travaillé dur au fil des ans pour nous fournir le logiciel permettant de faire fonctionner nos appareils physiques.
Plus de ressources Linux
- Aide-mémoire des commandes Linux
- Aide-mémoire des commandes Linux avancées
- Cours en ligne gratuit :Présentation technique de RHEL
- Aide-mémoire sur le réseau Linux
- Aide-mémoire SELinux
- Aide-mémoire sur les commandes courantes de Linux
- Que sont les conteneurs Linux ?
- Nos derniers articles Linux
Remarque :Sur certains systèmes, vous pouvez rencontrer des modules personnalisés qui sont référencés soit avec leurs entrées uniques dans le /etc/modules
fichier ou en tant que fichier de configuration enregistré dans /etc/modules-load.d/
. Il y a fort à parier que ces modules sont le fruit de projets de développement local, impliquant peut-être des expérimentations de pointe. Quoi qu'il en soit, il est bon d'avoir une idée de ce que vous regardez.
C'est ainsi que vous trouvez les modules. Votre prochaine tâche consiste à comprendre comment charger manuellement un module inactif si, pour une raison quelconque, cela ne s'est pas produit tout seul.
Charger manuellement les modules du noyau
Avant de pouvoir charger un module du noyau, la logique veut que vous deviez confirmer son existence. Et avant de pouvoir le faire, vous devez savoir comment cela s'appelle. Pour obtenir cette partie, il faut parfois de la magie et de la chance à parts égales et de l'aide du travail acharné des auteurs de documentation en ligne.
Je vais illustrer le processus en décrivant un problème que j'ai rencontré il y a quelque temps. Un beau jour, pour une raison qui m'échappe encore, l'interface WiFi d'un ordinateur portable a cessé de fonctionner. Juste comme ça. Peut-être qu'une mise à jour logicielle l'a fait tomber. Qui sait? J'ai exécuté lshw -c network
et a eu droit à cette information très étrange :
network UNCLAIMED
AR9485 Wireless Network Adapter
Linux a reconnu l'interface (l'Atheros AR9485) mais l'a répertoriée comme non réclamée. Eh bien, comme on dit, "Quand les choses se compliquent, les durs recherchent sur Internet." J'ai lancé une recherche sur module atheros ar9 linux et, après avoir parcouru des pages et des pages de résultats vieux de cinq et même de 10 ans me conseillant soit d'écrire mon propre module, soit d'abandonner, j'ai finalement découvert que (avec Ubuntu 16.04, au moins) un module fonctionnel existait. Son nom est ath9k.
Oui! La bataille est presque gagnée ! Ajouter un module au noyau est beaucoup plus facile qu'il n'y paraît. Pour vérifier qu'il est disponible, vous pouvez exécuter find
contre l'arborescence du répertoire du module, spécifiez -type f
pour indiquer à Linux que vous recherchez un fichier, puis ajoutez la chaîne ath9k
avec un astérisque glob pour inclure tous les noms de fichiers commençant par votre chaîne :
$ find /lib/modules/$(uname -r) -type f -name ath9k*
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_common.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_htc.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_hw.ko
Encore une étape, chargez le module :
# modprobe ath9k
C'est ça. Aucun redémarrage. Pas de chichi.
Voici un autre exemple pour vous montrer comment travailler avec des modules actifs qui ont été corrompus. Il fut un temps où l'utilisation de ma webcam Logitech avec un logiciel particulier rendait la caméra inaccessible à tout autre programme jusqu'au prochain démarrage du système. Parfois, j'avais besoin d'ouvrir la caméra dans une autre application, mais je n'avais pas le temps de l'éteindre et de la redémarrer. (J'exécute de nombreuses applications, et il faut du temps pour les mettre toutes en place après le démarrage.)
Parce que ce module est vraisemblablement actif, en utilisant lsmod
pour rechercher le mot vidéo devrait me donner un indice sur le nom du module concerné. En fait, c'est mieux qu'un indice :le seul module décrit avec le mot vidéo est uvcvidéo (comme vous pouvez le voir dans ce qui suit):
$ lsmod | grep video
uvcvideo 90112 0
videobuf2_vmalloc 16384 1 uvcvideo
videobuf2_v4l2 28672 1 uvcvideo
videobuf2_core 36864 2 uvcvideo,videobuf2_v4l2
videodev 176128 4 uvcvideo,v4l2_common,videobuf2_core,videobuf2_v4l2
media 24576 2 uvcvideo,videodev
Il y avait probablement quelque chose que j'aurais pu contrôler qui provoquait l'accident, et je suppose que j'aurais pu creuser un peu plus pour voir si je pouvais réparer les choses de la bonne façon. Mais tu sais comment c'est; parfois, vous ne vous souciez pas de la théorie et vous voulez simplement que votre appareil fonctionne. J'ai donc utilisé rmmod
pour tuer le module uvcvideo et modprobe
pour tout recommencer tout frais :
# rmmod uvcvideo
# modprobe uvcvideo
Encore une fois:pas de redémarrage. Pas de taches de sang tenaces.