Comprendre le noyau Linux
Le noyau Linux est le cœur du système d'exploitation Linux. Il contient les composants principaux pour aborder 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 des modules dits de noyau.
Qu'est-ce qu'un module de noyau?
En général, un module de noyau est un «morceau de code qui peut être chargé et déchargé dans le noyau sur demande. Ils étendent la fonctionnalité 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 chargé. Pour charger ou supprimer dynamiquement un module, il doit être configuré comme un module chargeable dans la configuration du noyau »[1]. Cela se fait dans le fichier source du noyau / usr / src / linux /.config [2]. Les modules intégrés sont marqués de «Y» et des modules chargeables avec «M». À titre d'exemple, la liste 1 le démontre 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 ne recommandons pas de modifier directement le fichier de configuration, mais pour utiliser soit la commande «faire la configuration», «faire menuconfig» ou «faire xconfig» pour définir l'utilisation du module correspondant dans le noyau Linux.
Commandes du module
Le système Linux est livré avec un certain nombre de commandes différentes pour gérer les modules de noyau. Cela comprend la liste des modules actuellement chargés dans le noyau Linux, affichant les informations du module, ainsi que le chargement et le déchargement des modules de 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
Nous commençons par la commande LSMOD. LSMOD abréviate «Liste des modules» et affiche tous les modules actuellement chargés dans le noyau Linux en formatant bien le contenu du fichier / proc / modules. Listing 2 montre sa sortie qui se compose de trois colonnes: nom du module, taille utilisée dans la mémoire et autres modules de noyau qui utilisent celui-ci spécifique.
Listing 2: Utilisation de LSMOD
$ lsmod
Taille du module utilisé par
CTR 12927 2
CCM 17534 2
snd_hrtimer 12604 1
snd_seq 57112 1
snd_seq_device 13132 1 snd_seq
…
$
Trouver des modules disponibles pour votre noyau actuel
Il pourrait y avoir des modules de noyau disponibles que vous n'êtes pas encore au courant. Ils sont stockés dans le répertoire / lib / modules. Avec l'aide de trouver, combinée avec 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. Listing 3 le démontre pour un plus ancien 3.16.0-7 Linux
noyau, et affiche des 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 / noyau / net / ipv6 / ip6_vti.ko
/ lib / modules / 3.16.0-7-amd64 / noyau / net / ipv6 / xfrm6_tunnel.ko
/ lib / modules / 3.16.0-7-amd64 / noyau / net / ipv6 / ip6_tunnel.ko
/ lib / modules / 3.16.0-7-amd64 / noyau / 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 / noyau / net / irda / irlan / irlan.ko
/ lib / modules / 3.16.0-7-amd64 / noyau / net / irda / irda.ko
/ lib / modules / 3.16.0-7-amd64 / noyau / net / irda / ircomm / ircomm.ko
/ lib / modules / 3.16.0-7-amd64 / noyau / 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 ou simplement le nom du module. Listing 4 le démontre pour le module du noyau IRDA traitant de la pile de protocole d'accès direct infrarouge.
Listing 4: Informations sur les modules d'affichage
$ / 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 protocole Linux Irda
Auteur: Dag Brattli& Jean Tourrilhes
dépend: CRC-Citt
vermagique: 3.16.0-7-AMD64 MOD_UNLOCK MODVERSIONS
$
La sortie contient différents champs d'information tels que le chemin complet du module du noyau, son nom d'alias, la licence logicielle, la description du module, les auteurs, ainsi que les internes du noyau. Le champ «dépend» montre de quels autres modules de noyau dont il dépend.
Les champs d'information diffèrent d'un module à un module. Afin de limiter la sortie à un champ d'information spécifique, Modinfo accepte le paramètre «-f» (abréviation de «-field») suivi du nom de champ. Dans Listing 5, la sortie est limitée aux informations de licence mise à 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 fonctionnalité de sécurité utile est disponible. Cela couvre les modules de noyau signé cryptographiquement. Comme expliqué sur le site Web du projet du noyau Linux [4], «Cela permet une augmentation de la sécurité du noyau en interdisant le chargement de modules ou de modules non signés
signé avec une clé non valide. La signature du 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 afin qu'il ne soit 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 de noyau est livré avec une configuration spécifique. La commande modprobe suivie de l'option «-c» (abréviation de «-showconfig») répertorie la configuration du module. En combinaison avec Grep, cette sortie est limitée à un symbole spécifique. Listing 6 le démontre pour les options IPv6.
Listing 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 la fonctionnalité est distribuée sur un certain nombre de modules. Cela conduit à plusieurs dépendances du module qui peuvent être affichées à nouveau à l'aide de modprobe. Listing 7 utilise l'option «-show-dépasse» afin de répertorier les dépendances du module I915.
Listing 7: Afficher les dépendances du module
$ / sbin / modprobe --show-dépend i915
insmod / lib / modules / 3.16.0-7-amd64 / noyau / pilotes / i2c / i2c-core.ko
insmod / lib / modules / 3.16.0-7-amd64 / noyau / pilotes / i2c / algos / i2c-algo-bit.ko
insmod / lib / modules / 3.16.0-7-amd64 / noyau / pilotes / thermal / thermal_sys.ko
insmod / lib / modules / 3.16.0-7-amd64 / noyau / pilotes / gpu / drm / drm.ko
insmod / lib / modules / 3.16.0-7-amd64 / noyau / pilotes / gpu / drm / drm_kms_helper.ko
insmod / lib / modules / 3.16.0-7-amd64 / noyau / pilotes / acpi / vidéo.ko
insmod / lib / modules / 3.16.0-7-amd64 / noyau / pilotes / acpi / bouton.ko
insmod / lib / modules / 3.16.0-7-amd64 / noyau / pilotes / gpu / drm / i915 / i915.ko
$
Afin d'afficher les dépendances en tant qu'arbre similaire à la commande «arbre» ou «LSBLK», le projet Modtree [5] peut aider (voir la figure ci-dessous pour l'arborescence du module i915). Bien qu'il soit disponible gratuitement sur GitHub, il nécessite que certaines adaptations se conforment aux règles de logiciel libre et pour faire partie d'une distribution Linux en tant que package.
Modules de chargement
Le chargement d'un module sur un noyau en cours d'exécution peut être effectué par deux commandes - INSMOD («Insert module») et modprobe. Sachez qu'il existe une légère mais importante différence entre ces deux: INSMOD ne résout pas les dépendances du module, mais le modprobe est plus intelligent et le fait.
Listing 8 montre comment insérer le module du noyau IRDA. Veuillez noter qu'InsMode fonctionne avec le chemin complet du module, tandis que Modprobe est satisfait du nom du module et le regarde lui-même dans l'arborescence du module 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 traite des modules de déchargement 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 s'attendent au nom du module comme paramètre. Listing 9 montre cela pour retirer 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
Gérer les modules de 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