2. Le noyau courant et son arborescence

Avant d'attaquer la compilation d'un nouveau noyau à partir de ses sources, on doit identifier et localiser les différents composants du noyau en cours d'exécution sur le système.

Le jeu de questions ci-dessous suppose que la configuration système est directement issue de l'installation de la distribution Debian GNU/Linux. Le noyau courant exécuté est fourni via un paquet de la distribution.

Q1.

Quelle est la commande UNIX usuelle qui identifie le noyau et sa version ?

Effectuer une recherche dans les pages de manuels des commandes installées sur le système avec une requête du type : apropos informations, système.

C'est la commande uname qui identifie le noyau courant. Pour interroger les pages de manuels à l'aide de la commande apropos, il faut que les paquets correspondant soient installés et que l'index de recherche soit construit.

Pour interroger les pages de manuels, on contrôle la liste des paquets correspondants installés et on lance manuellement la construction de l'index de recherche :

$ aptitude search ~imanpages
i   manpages          - Pages de manuel pour le système GNU/Linux
i A manpages-dev      - Pages de manuel sur l'utilisation de GNU/Linux pour le développement
i   manpages-fr       - Version française des pages de manuel sur l'utilisation de GNU/Linux
i   manpages-fr-extra - Version française des pages de manuel

<snip/>
# /etc/cron.daily/man-db

<snip/>
$ apropos -a informations système
dumpe2fs (8)   - Afficher des informations sur le système de fichiers ext2/ext3/ext4
fstab (5)      - Informations statiques sur les systèmes de fichiers
proc (5)       - Pseudosystème de fichiers d'informations sur les processus
uname (1)      - Afficher des informations sur le système

Pour obtenir la version courante du noyau exécuté :

$ uname -a
Linux vm0 4.12.0-2-686-pae #1 SMP Debian 4.12.12-2 (2017-09-11) i686 GNU/Linux

Q2.

Où est placée l'image de la partie monolithique du noyau courant ?

Repérer le paquet Debian correspondant au noyau et retrouver l'image dans la liste des fichiers de ce paquet.

Une fois la version courante du noyau identifiée à l'aide de la commande uname, on peut faire la correspondance avec les paquets de noyau installés.

$ aptitude search ~ilinux-image
i A linux-image-4.12.0-1-686-pae - Linux 4.12 for modern PCs
i   linux-image-4.12.0-2-686-pae - Linux 4.12 for modern PCs
i   linux-image-686-pae          - Linux pour PC modernes - métapaquet

Connaissant le nom du paquet de noyau installé on peut lister les fichiers qu'il contient. À partir de cette liste on peut localiser la partie monolithique du noyau ainsi que ses modules dans l'arborescence du système de fichiers.

C'est dans le répertoire /boot que sont placées les images des noyaux disponibles sur un système GNU/Linux.

$ ls -A1 /boot/ | grep 4.12.0-2
config-4.12.0-2-686-pae 1
initrd.img-4.12.0-2-686-pae 2
System.map-4.12.0-2-686-pae 3
vmlinuz-4.12.0-2-686-pae 4

1

Fichier de configuration du noyau de la distribution. Il contient l'ensemble des options qui ont été sélectionnées par le responsable du paquet. C'est une configuration très complète dans la mesure où un noyau publié dans une distribution doit supporter le maximum de matériel.

2

Image compressée du disque RAM d'initialisation contenant une arborescence racine simplifée, des outils et l'ensemble des modules du noyau. Cette technique d'initialisation est la seule qui puisse fonctionner sur des systèmes sans disque dur où sur lesquels aucun système GNU/Linux n'a encore été installé.

3

Fichier de cartographie des appels de fonctions du noyau. Cette cartographie est une aide à la mise au point pour les développeurs. On y trouve une identification nominative des fonctions en cas de problème au lieu d'adresses numériques en hexadécimal.

4

Fichier image de la partie monolithique du noyau. C'est ce fichier qui est utilisé par le gestionnaire de démarrage pour lancer le système d'exploitation. Le gestionnaire de démarrage y accède directement à l'aide d'un appel BIOS.

Q3.

Où sont placés les fichiers des modules correspondant au noyau courant ?

Comme dans le cas précédent, la liste des fichiers du paquet permet de retrouver l'arborescence de stockage des modules.

On peut parcourir la liste des fichiers contenus dans le paquet de noyau et effectuer des recherches par mots clés en utilisant la commande suivante :

$ dpkg -L linux-image-4.12.0-2-686-pae | egrep -e 'kernel$'
/lib/modules/4.12.0-2-686-pae/kernel
/lib/modules/4.12.0-2-686-pae/kernel/arch/x86/kernel

La liste ci-dessus montre que les modules du noyau sont placés dans le répertoire /lib/modules/4.12.0-2-686-pae/kernel.

Q4.

Dans quel cas de figure utilise-t-on l'arborescence ou le disque RAM ?

Il faut bien différencier l'utilisation du disque RAM initrd-* de l'arborescence installée sur le disque du système.

Le fichier image du disque RAM d'initialisation a déjà été identifié ci-dessus.

Ce fichier est utilisé lors du lancement du système d'exploitation. Il est reconnu par le gestionnaire de démarrage de la même façon que la partie monolithique du noyau. Une fois le système complètement initialisé, les opérations de (chargement|déchargement) des modules utilisent l'arborescence du dique dur : /lib/modules/`uname -r`/.

Q5.

Que contiennent les arborescences /proc et /sys ?

Consulter les documents ressource sysfs et Linux Filesystem Hierarchy

L'arborescence /sys est une représentation visible de l'arbre des périphériques physiques vus par le noyau. Elle est construite dynamiquement en fonction des branchements «à chaud» effectués sur les différents bus de la machine. Les informations répertoriées dans cette arborescence sont du type : nom de périphérique, canal DMA, vecteur d'interruption, tensions d'alimentation, etc.

L'arborescence /proc comprend l'ensemble des paramètres du noyau en cours d'exécution. Ces paramètres sont modifiables en cours de fonctionnement. L'exemple emblématique, vis-à-vis de ces travaux pratiques est donné par l'ensemble des «réglages» possibles sur les machines d'états de la pile des protocoles réseau. La liste des paramètre donnée par la commande ls /proc/sys/net/ipv4/ en donne un aperçu.

Q6.

Quelle est la commande qui permet de lister les modules chargés en mémoire ?

À quel paquet appartient elle ?

Rechercher dans la base de données des paquets de la distribution les informations relatives aux manipulations sur les modules.

aptitude search '?description("modules du noyau Linux")'
i A kmod   - outils pour gérer les modules du noyau Linux

Le paquet kmod fournit la commande lsmod ainsi que les autres outils de manipulation sur les modules.

$ dpkg -L kmod | grep sbin/
/sbin/depmod
/sbin/insmod
/sbin/lsmod
/sbin/modinfo
/sbin/modprobe
/sbin/rmmod

Q7.

Quelles sont les commandes qui permettent de charger un module en mémoire «manuellement» ?

Identifier celle qui traite automatiquement les dépendances entre modules.

Rechercher les informations dans la liste des fichiers du paquet ainsi que dans les pages de manuels des commandes.

On dispose de deux commandes : insmod et modprobe. Seule la commande modprobe traite les dépendances au (chargement|déchargement) d'un module. Illustration avec un module de gestion des dispositifs de stockage sur le bus USB.

# modprobe -v usb-storage
insmod /lib/modules/4.12.0-2-686-pae/kernel/drivers/usb/storage/usb-storage.ko

Q8.

Quelles sont les commandes qui permettent de retirer un module de la mémoire «manuellement» ?

Identifier les options de la commande qui traite automatiquement les dépendances entre modules.

Rechercher les informations dans les pages de manuels des commandes.

Comme dans le cas précédent, c'est la commande modprobe qui retire de la mémoire les modules associés au déchargement.

# modprobe -rv usb-storage
rmmod usb_storage