GNU/Linux >> Tutoriels Linux >  >> Linux

Comment charger ou décharger un module du noyau Linux

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.


Linux
  1. Comment mettre à niveau le noyau sur Linux Desktop

  2. Comment charger le module SELinux pour Oracleasm

  3. Comment charger les modules du noyau Linux à partir du code C ?

  4. Comment coder un module du noyau Linux ?

  5. Comment transmettre une valeur à un module de noyau Linux intégré au démarrage ?

Comment vérifier la version du noyau sous Linux

Commande Modprobe sous Linux

Comment vérifier la charge de votre serveur sous Linux

Comment installer le module 'Python-Pexpect' sous Linux

Comment construire le noyau Linux à partir de zéro

Comment Linux charge-t-il l'image 'initrd' ?