Noyau Linux

Gestion des modules du noyau Linux

Gestion des modules du noyau Linux

Comprendre le noyau Linux

Le noyau Linux est le cœur du système d'exploitation Linux. Il contient les principaux composants pour adresser le matériel et permet à la fois la communication et l'interaction entre l'utilisateur et le matériel. Le noyau Linux n'est pas un système monolithique mais assez flexible, et le noyau est étendu par ce qu'on appelle des modules de noyau.

Qu'est-ce qu'un module noyau?

En général, un module de noyau est un « morceau de code qui peut être chargé et déchargé dans le noyau à la demande. Ils étendent les fonctionnalités du noyau sans avoir besoin de redémarrer le système" [1]. Cela conduit à une très grande flexibilité pendant le fonctionnement.

De plus, « un module de noyau peut être configuré comme intégré ou chargeable. Pour charger ou supprimer dynamiquement un module, il doit être configuré en tant que module chargeable dans la configuration du noyau » [1]. Cela se fait dans le fichier source du noyau /usr/src/linux/.configuration [2]. Les modules intégrés sont marqués d'un « y » et les modules chargeables d'un « m ». À titre d'exemple, la liste 1 montre ceci pour le module SCSI :

Listing 1 : déclaration d'utilisation du module SCSI

CONFIG_SCSI=y # module intégré
CONFIG_SCSI=m # module chargeable
# CONFIG_SCSI # la variable n'est pas définie

Nous vous déconseillons d'éditer directement le fichier de configuration, mais d'utiliser soit la commande « make config », « make menuconfig », soit « make xconfig » pour définir l'usage du module correspondant dans le noyau Linux.

Commandes des modules

Le système Linux est livré avec un certain nombre de commandes différentes pour gérer les modules du noyau. Cela inclut la liste des modules actuellement chargés dans le noyau Linux, l'affichage des informations sur les modules, ainsi que le chargement et le déchargement des modules du noyau. Ci-dessous, nous expliquerons ces commandes plus en détail.

Pour les noyaux Linux actuels, les commandes suivantes sont fournies par le package kmod [3]. Toutes les commandes sont des liens symboliques vers kmod.

La liste des modules actuellement chargés avec lsmod

On commence par la commande lsmod. lsmod abrège "list modules" et affiche tous les modules actuellement chargés dans le noyau Linux en formatant joliment le contenu du fichier /proc/modules. Le listing 2 montre sa sortie qui se compose de trois colonnes : le nom du module, la taille utilisée en mémoire et les autres modules du noyau qui utilisent celui-ci spécifique.

Liste 2 : Utilisation de lsmod

$ lsmod
Taille du module utilisé par
ctr 12927 2
cmc 17534 2
snd_hrtimer 12604 1
snd_seq 57112 1
snd_seq_device 13132 1 snd_seq

$

Trouver les modules disponibles pour votre noyau actuel

Il peut y avoir des modules de noyau disponibles dont vous n'êtes pas encore au courant. Ils sont stockés dans le répertoire /lib/modules. Avec l'aide de find, combinée à la commande uname, vous pouvez imprimer une liste de ces modules. "uname -r" imprime simplement la version du noyau Linux en cours d'exécution. Le listing 3 le démontre pour un 3 plus ancien.16.0-7 Linux
noyau, et montre les modules pour IPv6 et IRDA.

Listing 3 : Affichage des modules disponibles (sélection)

$ find /lib/modules/$(uname -r) -name '*.ko'
/lib/modules/3.16.0-7-amd64/kernel/net/ipv6/ip6_vti.ko
/lib/modules/3.16.0-7-amd64/kernel/net/ipv6/xfrm6_tunnel.ko
/lib/modules/3.16.0-7-amd64/kernel/net/ipv6/ip6_tunnel.ko
/lib/modules/3.16.0-7-amd64/kernel/net/ipv6/ip6_gre.ko
/lib/modules/3.16.0-7-amd64/noyau/net/irda/irnet/irnet.ko
/lib/modules/3.16.0-7-amd64/kernel/net/irda/irlan/irlan.ko
/lib/modules/3.16.0-7-amd64/noyau/net/irda/irda.ko
/lib/modules/3.16.0-7-amd64/kernel/net/irda/ircomm/ircomm.ko
/lib/modules/3.16.0-7-amd64/kernel/net/irda/ircomm/ircomm-tty.ko

$

Afficher les informations du module à l'aide de modinfo

La commande modinfo vous en dit plus sur le module du noyau demandé (« informations sur le module »). En tant que paramètre, modinfo nécessite soit le chemin complet du module, soit simplement le nom du module. Le listing 4 le montre pour le module du noyau IrDA traitant de la pile de protocoles d'accès direct infrarouge.

Listing 4 : Afficher les informations du module

$ /sbin/modinfo irda
nom de fichier : /lib/modules/3.16.0-7-amd64/noyau/net/irda/irda.ko
alias : net-pf-23
licence : GPL
description : La pile de protocoles Linux IrDA
auteur : Dag Brattli & Jean Tourrilhes
dépend: crc-ccitt
vermagique : 3.16.0-7-amd64 SMP mod_unload modversions
$

La sortie contient différents champs d'informations tels que le chemin complet du module du noyau, son nom d'alias, la licence du logiciel, la description du module, les auteurs, ainsi que les éléments internes du noyau. Le champ "dépend" montre de quels autres modules du noyau il dépend.

Les champs d'information diffèrent d'un module à l'autre. Afin de limiter la sortie à un champ d'information spécifique, modinfo accepte le paramètre "-F" (abréviation de "-field") suivi du nom du champ. Dans la liste 5, la sortie est limitée aux informations de licence mises à disposition à l'aide du champ de licence.

Listing 5 : Afficher un champ spécifique uniquement.

$ /sbin/modinfo -F licence irda
GPL
$

Dans les noyaux Linux plus récents, une fonction de sécurité utile est disponible. Cela couvre les modules du noyau signés cryptographiquement. Comme expliqué sur le site Web du projet du noyau Linux [4], « cela permet une sécurité accrue du noyau en interdisant le chargement de modules ou de modules non signés
signé avec une clé invalide. La signature de module augmente la sécurité en rendant plus difficile le chargement d'un module malveillant dans le noyau. La vérification de la signature du module est effectuée par le noyau de sorte qu'il n'est pas nécessaire d'avoir des « bits d'espace utilisateur de confiance.” La figure ci-dessous le montre pour le
module parport_pc.

Afficher la configuration du module à l'aide de modprobe

Chaque module du noyau est livré avec une configuration spécifique. La commande modprobe suivie de l'option "-c" (abréviation de "-showconfig") liste la configuration du module. En combinaison avec grep, cette sortie est limitée à un symbole spécifique. Le listing 6 le montre pour les options IPv6.

Liste 6 : Afficher la configuration du module

$ /sbin/modprobe -c | grep ipv6
alias net_pf_10_proto_0_type_6 dccp_ipv6
alias net_pf_10_proto_33_type_6 dccp_ipv6
alias nf_conntrack_10 nf_conntrack_ipv6
alias nf_nat_10 nf_nat_ipv6
alias nft_afinfo_10 nf_tables_ipv6
alias nft_chain_10_nat nft_chain_nat_ipv6
alias nft_chain_10_route nft_chain_route_ipv6
alias nft_expr_10_reject nft_reject_ipv6
symbole d'alias : nf_defrag_ipv6_enable nf_defrag_ipv6
symbole d'alias : nf_nat_icmpv6_reply_translation nf_nat_ipv6
symbole d'alias :nft_af_ipv6 nf_tables_ipv6
symbole d'alias : nft_reject_ipv6_eval nft_reject_ipv6
$

Afficher les dépendances du module

Le noyau Linux est conçu pour être modulaire et les fonctionnalités sont réparties sur un certain nombre de modules. Cela conduit à plusieurs dépendances de module qui peuvent être affichées en utilisant à nouveau modprobe. Le listing 7 utilise l'option "-show-depends" afin de lister les dépendances pour le module i915.

Listing 7 : Afficher les dépendances du module

$ /sbin/modprobe --show-depends i915
insmod /lib/modules/3.16.0-7-amd64/kernel/drivers/i2c/i2c-core.ko
insmod /lib/modules/3.16.0-7-amd64/kernel/drivers/i2c/algos/i2c-algo-bit.ko
insmod /lib/modules/3.16.0-7-amd64/kernel/drivers/thermal/thermal_sys.ko
insmod /lib/modules/3.16.0-7-amd64/kernel/drivers/gpu/drm/drm.ko
insmod /lib/modules/3.16.0-7-amd64/kernel/drivers/gpu/drm/drm_kms_helper.ko
insmod /lib/modules/3.16.0-7-amd64/kernel/drivers/acpi/video.ko
insmod /lib/modules/3.16.0-7-amd64/kernel/drivers/acpi/button.ko
insmod /lib/modules/3.16.0-7-amd64/kernel/drivers/gpu/drm/i915/i915.ko
$

Afin d'afficher les dépendances sous forme d'arborescence similaire à la commande "tree" ou "lsblk", le projet modtree [5] peut vous aider (voir la figure ci-dessous pour l'arborescence du module i915). Bien qu'il soit disponible gratuitement sur GitHub, il nécessite quelques adaptations pour se conformer aux règles du logiciel libre et pour faire partie d'une distribution Linux en tant que package.

Chargement des modules

Le chargement d'un module dans un noyau en cours d'exécution peut être effectué par deux commandes - insmod ("insérer le module") et modprobe. Sachez qu'il y a une différence légère mais importante entre ces deux : insmod ne résout pas les dépendances de module, mais modprobe est plus intelligent et le fait.

Le listing 8 montre comment insérer le module noyau IrDA. Veuillez noter qu'insmode fonctionne avec le chemin complet du module, alors que modprobe se contente du nom du module et le recherche lui-même dans l'arborescence des modules pour le noyau Linux actuel.

Listing 8 : Insertion d'un module de noyau

# insmod /lib/modules/3.16.0-7-amd64/noyau/net/irda/irda.ko

# modprobe irda

Modules de déchargement

La dernière étape concerne le déchargement des modules d'un noyau en cours d'exécution. Encore une fois, il y a deux commandes disponibles pour cette tâche - modprobe et rmmod ("supprimer le module"). Les deux commandes attendent le nom du module comme paramètre. Le listing 9 montre ceci pour supprimer le module IrDA du noyau Linux en cours d'exécution.

Listing 9 : Suppression d'un module de noyau

# rmmod irda

# modprobe -r irda

Conclusion

La gestion des modules du noyau Linux n'est pas une grande magie. Juste quelques commandes à apprendre, et vous êtes le maître de la cuisine.

Merci

L'auteur tient à remercier Axel Beckert (ETH Zürich) et Saif du Plessis (Hothead Studio Cape Town) pour leur aide lors de la préparation de l'article.

Liens et références

  • [1] Module noyau, wiki Arch Linux, https://wiki.archlinux.org/index.php/module_noyau
  • [2] Configuration du noyau, https://tldp.org/HOWTO/SCSI-2.4-HOWTO/kconfig.html
  • [3] kmod, https://git.noyau.org/pub/scm/utils/kernel/kmod/kmod.git
  • [4] Fonction de signature de module de noyau, https://www.noyau.org/doc/html/v4.15/guide-admin/signature-module.html
  • [5] arbre mod, https://github.com/falconindy/modtree
Meilleures applications de mappage de manette de jeu pour Linux
Si vous aimez jouer à des jeux sur Linux avec une manette de jeu au lieu d'un système de saisie clavier et souris typique, il existe des applications ...
Outils utiles pour les joueurs Linux
Si vous aimez jouer à des jeux sur Linux, il est probable que vous ayez utilisé des applications et des utilitaires comme Wine, Lutris et OBS Studio p...
Jeux HD remasterisés pour Linux qui n'ont jamais eu de version Linux plus tôt
De nombreux développeurs et éditeurs de jeux proposent une remasterisation HD d'anciens jeux pour prolonger la durée de vie de la franchise, veuillez ...