Debian logo [inetdoc.LINUX]

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.

1.

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

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 :

$ dpkg -l manpages* |grep ^ii
ii  manpages            3.05-1   Manual pages about using a GNU/Linux system
ii  manpages-dev        3.05-1   Manual pages about using GNU/Linux for devel
ii  manpages-fr         3.03.1-1 French version of the manual pages about usi
ii  manpages-fr-dev     3.03.1-1 French version of the development manual pag
ii  manpages-fr-extra   20080719 French version of the manual pages

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

<snip/>
$ apropos "current kernel"
oldolduname (2)      - get name and information about current kernel
olduname (2)         - get name and information about current kernel
uname (2)            - get name and information about current kernel

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

$ uname -a
Linux vm0 2.6.26-1-amd64 #1 SMP Wed Sep 10 15:31:12 UTC 2008 x86_64 GNU/Linux

2.

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

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.

$ dpkg -l linux-image* |grep ^ii
ii  linux-image-2.6-amd64       2.6.26+16  Linux 2.6 image on AMD64
ii  linux-image-2.6.26-1-amd64  2.6.26-5   Linux 2.6.26 image on AMD64

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 -lAh /boot
total 17M
-rw-r--r-- 1 root root  84K sep 10 19:33 config-2.6.26-1-amd641
drwxr-xr-x 2 root root 1,0K oct  5 15:43 grub
-rw-r--r-- 1 root root 6,7M oct  8 21:01 initrd.img-2.6.26-1-amd642
drwx------ 2 root root  12K mai 12 14:55 lost+found
-rw-r--r-- 1 root root 1,2M sep 10 19:33 System.map-2.6.26-1-amd643
-rw-r--r-- 1 root root 1,7M sep 10 19:32 vmlinuz-2.6.26-1-amd644

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.

3.

Où sont placés les fichiers des modules correspondant au noyau courant ? Où est placé l'image du disque RAM utilisé lors de l'initialisation du système ? Dans quels cas de figure utilise-t-on l'arborescence ou le disque RAM ?

Dans la question précédente, on a identifié le noyau en cours d'exécution, sa version et le paquet qui le contient. On utilise ces mêmes informations pour répondre aux questions sur les 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-2.6.26-1-amd64  | less
<snip/>
/lib
/lib/modules
/lib/modules/2.6.26-1-amd64
/lib/modules/2.6.26-1-amd64/kernel
/lib/modules/2.6.26-1-amd64/kernel/sound
/lib/modules/2.6.26-1-amd64/kernel/sound/usb
<snip/>

La liste ci-dessus montre que les modules du noyau sont placés dans le répertoire /lib/modules/2.6.26-1-amd64/kernel/.

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`/.

4.

Que contiennent les arborescences /proc et /sys ?

Consulter le document ressource The Wonderful World of Linux 2.6.

L'arborescence /sys est une représentation visible de l'arbre des périphériques physiques vus par le noyau. Cette arborescence a été introduite avec les noyaux de la série 2.6.xx. 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 commande ls /proc/sys/net/ipv4/ en donne un aperçu.

5.

Quelle est la commande qui permet de lister les modules chargés en mémoire ? À quel paquet appartient elle ?

La commande lsmod :

$ lsmod | less
Module                  Size  Used by
ipv6                  288328  40
video                  24084  0
output                  7808  1 video
ac                      9352  0
battery                16904  0
loop                   19468  0
snd_pcm                81800  0
snd_timer              25744  1 snd_pcm
snd                    63688  2 snd_pcm,snd_timer
soundcore              12064  1 snd
snd_page_alloc         13072  1 snd_pcm
<snip/>

Cette commande appartient au paquet module-init-tools. En listant le contenu de ce paquet on obtient les noms des commandes associées et les pages de manuels correspondantes.

$ dpkg -S `which lsmod`
module-init-tools: /sbin/lsmod

$ dpkg -L module-init-tools | less
/.
/etc
/etc/init.d
/etc/init.d/module-init-tools
/etc/modprobe.d
/etc/modprobe.d/aliases
/etc/modprobe.d/arch
/etc/modprobe.d/arch/x86_64
/sbin
/sbin/modprobe
/sbin/insmod
/sbin/rmmod
/sbin/depmod
/sbin/update-modules
/sbin/modinfo
<snip/>

6.

Quelles sont les commandes qui permettent de charger un module en mémoire «manuellement» ? Identifier celle qui traite automatiquement les dépendances entre modules.

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 pilote d'interface RNIS :

# modprobe -v hisax_st5481
insmod /lib/modules/2.6.26-1-amd64/kernel/lib/crc-ccitt.ko
insmod /lib/modules/2.6.26-1-amd64/kernel/drivers/isdn/hisax/isdnhdlc.ko
insmod /lib/modules/2.6.26-1-amd64/kernel/drivers/net/slhc.ko
insmod /lib/modules/2.6.26-1-amd64/kernel/drivers/isdn/i4l/isdn.ko
insmod /lib/modules/2.6.26-1-amd64/kernel/drivers/isdn/hisax/hisax.ko
insmod /lib/modules/2.6.26-1-amd64/kernel/drivers/isdn/hisax/hisax_st5481.ko

7.

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.

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. Toujours avec le pilote d'interface RNIS :

# modprobe -rv hisax_st5481
rmmod /lib/modules/2.6.26-1-amd64/kernel/drivers/isdn/hisax/hisax_st5481.ko
rmmod /lib/modules/2.6.26-1-amd64/kernel/drivers/isdn/hisax/hisax.ko
rmmod /lib/modules/2.6.26-1-amd64/kernel/drivers/isdn/i4l/isdn.ko
rmmod /lib/modules/2.6.26-1-amd64/kernel/drivers/net/slhc.ko
rmmod /lib/modules/2.6.26-1-amd64/kernel/drivers/isdn/hisax/isdnhdlc.ko
rmmod /lib/modules/2.6.26-1-amd64/kernel/lib/crc-ccitt.ko