Le noyau Linux

Cette partie décrit l'organisation des sources du noyau et sa documentation. Nous verrons comment appliquer un patch et recompiler un noyau patché. Nous essaierons également de vous éclairer sur les informations que vous pouvez trouver dans le répertoire /proc.

État : {publie}

Retour au document principal

Pré-requis

Les composants du noyau

Les modules

Les modules dans l'arborescence des sources

Les composants du noyau sont situés dans différents sous-répertoire des sources du noyau /usr/src/linux :

Sous-répertoire

Description

Exemple

./drivers

contient le code pour différents éléments matérielles

pcmcia

./fs

Code pour les systèmes de fichiers supportés

nfs

./net

Code pour le support réseau

ipx

Ces composants peuvent être sélectionnés pendant la configuration du noyau (voir '''Compiler un noyau''').

Les modules du noyau pendant l'exécution

Le répertoire /lib/modules/<Version_du_noyau>/kernel contient de nombreux sous-répertoires présents dans les sources du noyau. Cependant, on y retrouve uniquement les modules compilés sont stockés.

Les types d'images du noyau

Les différents types d'images du noyau diffèrent seulement par le type de compression utilisé pour compresser le noyau.

L'utilitaire make lit le fichier /usr/src/linux/Makefile pour compiler.

/usr/src/linux/arch/i386/boot/zImage

/usr/src/linux/arch/i386/boot/bzImage

/dev/fd0

N'oubliez pas de mettre une disquette dans le lecteur !

La documentation

La plus grande partie de la documentation se trouve dans le répertoire /usr/src/linux-source-2.6.x/Documentation. Les fichiers principaux sont les suivants :

Fichier

Description

00-INDEX

Résumé du contenu de chaque fichier de la Documentation

Configure.help

Contient l'aide affichée pendant la configuration du noyau

Le fichier Configure.help fournit également des informations supplémentaires lorsque un module du noyau ne se charge pas correctement. On y trouve également les options spécifiques et les alias pour /etc/modules.conf.

Le fichier /usr/src/linux/README contient les informations au sujet de la compilation et de la documentation.

La version du noyau est définie dans le fichier Makefile présent dans /usr/src/linux-source-2.6.x/Makefile.

VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 22
EXTRAVERSION =

Vous pouvez ajouter une information dans la partie EXTRAVERSION par exemple :

EXTRAVERSION = -test

Ainsi, l'image du noyau compilé portera le nom 2.4.22-test.

Remarque : Le signe - est obligatoire dans EXTRAVERSION, sinon la version sera 2.4.22test.

Compilation du noyau

On peut décrire la compilation et l'installation d'un noyau en 3 étapes.

Etape 1 : Configuration du noyau

À cette étape, nous devons sélectionner le type de matériel (NdT : les pilotes), de réseau, etc. à inclure dans l'image du noyau ainsi que le type d'image du noyau que nous souhaitons compiler (modulaire ou monolithique).

Ces choix seront sauvegardés dans le fichier : /usr/src/linux/.config.

Création du fichier .config

Commande

Description

Make config

Édite chacune des lignes du fichier .config , les unes après les autres.

Make menuconfig

Édite le fichier .config via un menu (utilise ncurses)

Make xconfig

Édite le fichier .config via un menu (utilise une interface graphique)

Quand on édite le fichier .config en utilisant l'une de ces méthodes, chaque option présente plusieurs choix, dans la plupart des cas :

Notez que certains composants du noyau doivent être inclus au noyau. On ne peut donc pas avoir un noyau totalement modulaire.

Lors de la compilation d'un noyau monolithique aucun des composants n'est compilé dynamiquement.

Etape 2 : Compiler les modules et le noyau

Le tableau suivant décrit les différentes commandes make et leurs fonctions à cette étape. Vous noterez que toutes les commandes ne sont pas destinées à compiler du code et que nous avons inclus make modules_install.

Compilation

Commande

Description

Make clean

Permet de s'assurer que les fichiers .O issues d'une précédente compilation ont été enlevé

Make dep

Ajoute un fichier .depend avec les entêtes spécifique au composant du noyau

Make

Construit le noyau

Make modules

Construit les modules dynamiques

Make modules_install

installe les modules dans /lib/modules/kernel-version/

Etape 3 : Installer l'image du noyau

Cette étape se limite à copier l'image du noyau manuellement dans le répertoire boot et à configurer le chargeur d'amorçage (LiLO ou Grub) pour qu'il pointe sur notre nouveau noyau.

Patcher un noyau

Il est possible de mettre a jour la version d'un noyau sur des sources déjà existante en appliquant un correctif (patch). Si vous avez téléchargé les sources du noyau linux-2.4.21.tgz et que vous voulez le mettre à jour vers une version plus récente 2.4.22 par exemple, vous devez télécharger le correctif : patch-2.4.22.gz

Appliquer le Patch

Le patch 2.4.22 que vous allez appliquer va écrire dans l'arborescence des sources du noyau 2.4.21 situé dans /usr/src/Linux-version. Le fichier de patch doit être situé dans /usr/src/ :

cd /usr/src/
zcat patch-2.4.22.gz | patch -p0

L'option -p permet de situer le patch par rapport au sources du noyau dans l'arborescence. Dans l'exemple précédent le patch est au même niveau dans l'arborescence /usr/src/ :

--- linux-2.4.21/...
+++ linux-2.4.22/...

Cela indique que le patch peut être appliqué dans le répertoire Linux-2.4.21.

Toutefois si nous installons le patch directement dans le répertoire /usr/src/linux-2.4.21 nous passerons de :

--- linux-2.4.21/arch/arm/def-configs/adsagc
+++ linux-2.4.22/arch/arm/def-configs/adsagc

à

--- ./arch/arm/def-configs/adsagc
+++ ./arch/arm/def-configs/adsagc

Ceci est possible grâce a l'option -p1 qui indiquera que le patch est dans le répertoire des sources du noyau :

cd /usr/src/linux-2.4.21
zcat patch-2.4.22.gz | patch -p1

Tester le patch

Avant d'installer un patch nous allons pouvoir tester les modifications en le simulant :

patch -p1 -dry-run < fichier_du_patch

Rétablir l'ancienne arborescence

La commande patch fourni différentes méthodes pour récupérer les sources dans l'état où elles se trouvaient avant le patch.

Dans tous les cas, il faut effectuer une copie de l'ancien fichier de configuration .config. En le copiant par exemple dans le répertoire /boot :

cp .config /boot/config-2.4.21

Appliquer le patch à l'envers

On peut utiliser l'option -R de patch qui permet de retirer toutes les modifications apportées par ce patch.

Exemple : Considérons que nous avons appliqué le correctif patch-2.4.22.gz sur un noyau 2.4.21.

La commande qui permettra de retirer le patch est :

cd /usr/src/
zcat patch-2.4.22.gz | patch -p0 -R

Effectuer une sauvegarde avant d'appliquer le patch

Vous pouvez effectuer une sauvegarde des anciens fichiers dans un dossier avant modification par le patch :

mkdir oldfiles
patch -B oldfiles/ -p0 < patch-file

L'avantage est de créer une sauvegarde qui vous permet de restaurer les sources dans leurs état original :

diff -ur linux-2.4.21 oldfiles/linux-2.4.21 > recover-2.4.21-patch

Informations : Cette commande enlève le patch 2.4.22 appliqué précédemment et restaure les sources du noyau 2.4.21

Conserver les fichiers d'origine

Vous pouvez appliquer le patch avec l'option -b.

Par défaut cette option permet de garder les fichiers d'origines en leur ajoutant une extension .orig

patch -b -P0 < fichier_patch

Le patch peut être supprimé en récupérant les fichiers .orig avec les commandes suivantes :

for file in $(find linux-2.4.29 | grep orig)
do
FILENAME=$(echo $file | sed 's/\.orig//')
mv -f $file $FILENAME
done

Construire le noyau après l'application d'un patch

Effectuer une simple copie du fichier .config dans le fichier de source du noyau :

cp /boot/config-kernelversion /usr/src/linuxkernelversion/.config

Effectuer ensuite un make oldconfig avec l'invite de commande présent pour les nouvelles fonctionnalités :

make oldconfig
make dep
make clean bzImage modules modules_install

Personnalisation d'un noyau

Chargement des modules du noyau

Les modules sont insérés dans le noyau lors de l'exécution en utilisant différentes méthodes.

L'utilitaire modprobe peut être utiliser pour choisir les modules a insérés ou a enlever ainsi que leurs dépendances.

Le noyau peut insérer les modules automatiquement en utilisant le module kmod. Ce module a été remplacé par le module kerneld.

Quand le noyau utilise kmod, il utilise /proc/sys/kernel/modprobe qui contient le chemin du chargeur des modules du noyau a chaque fois qu'un module est nécessaire.

Le fichier /proc/sys/kernel/modprobe n'est présent que si le noyau est compilé avec l'option CONFIG_KMOD activée :

grep -i kmod /usr/src/linux/.config
CONFIG_KMOD=y

Quand on construit un noyau monolithique l'option CONFIG_MODULES peut être mise sur no.

Le répertoire /proc

Les fonctionnalités qui ont été sélectionnées dans le noyau sont affichées dans le répertoire /proc. Nous allons lister quelques un de ces fichiers contenant des informations utiles.

/proc/cmdline

Contient la ligne de commande passé au noyau pendant le boot par le chargeur de démarrage.

/proc/meminfo

Ce fichier contient les statistiques sur la mémoire de la machine.

/proc/cpuinfo

Ce fichier contient les informations sur le processeur.

/proc/filesystems

Ce fichier affiche une liste des types de système de fichiers actuellement pris en charge par le noyau.

/proc/partitions

Fournit des informations très détaillées sur les différentes partitions actuellement disponibles sur le système.

/proc/sys

Ce répertoire est le seul de /proc où les fichiers sont accessibles en écriture (le reste de /proc est en lecture seule). Ces valeurs peuvent être changé avec l'utilitaire sysctl ou défini dans /etc/sysctl.conf.

/proc/sys/kernel/hotplug

Contient l'emplacement de l'utilitaire qui gère les éléments hotplug ( Disque USB, PCI ..).

/proc/sys/kernel/modprobe

Contient le chemin de l'utilitaire utiliser par le noyau pour insérer un module.

/proc/sys/overflowgid/uid

Nombre maximum d'utilisateurs sur un système.

/proc/modules

Liste les modules actuellement chargés, équivaut a la commande lsmod.

Exercice

Nous allons patcher le noyau Linux 2.24.22-1.2149.nptl afin de prendre en charge les extensions d'attributs et les listes de contrôle d'accès( ACL ) pour les systèmes de fichier ext2 et ext3.

Les ACL vont au delà de ce cours. Tout ce dont nous avons besoin de savoir est qu'ils fournissent une plus grande souplesse sur les permissions des répertoires et des fichiers permettant à plusieurs groupes d'accéder à des ressources avec des autorisations différentes.

ATTENTION : Ce patch échouera sur des version plus anciennes du noyau (ex: linux-2.4.22-1.2115.nptl)

Installer le noyau 2.4.22-1.2149.nptl et placer les sources dans /usr/src/linux, puis tapez :

cd /usr/src/linux
bzcat /usr/src/ea+acl+nfsacl-2.4.22-0.8.65.patch.bz2 | patch -p1 –dry-run

Si vous n'avez pas d'erreur, appliquez patch en retirant l'option --dry-run. Nous pouvons ensuite compiler le nouveau noyau :

Etape 1 :

Utilisez un éditeur pour ajouter EXTRAVERSION=-acl au fichier Makefile.

Etape 2 :

make mrproper

cp configs/kernel-2.4.22-i686.config .config

make oldconfig (en répondant oui a toutes les questions relatives aux ACL)

make dep bzImage modules modules_install 

Test rapide :

Une fois que vous avez redémarré avec le nouveau noyau, ajoutez l'option acl dans /etc/fstab sur tous les systèmes de fichier ext3 :

LABEL=/usr /usr ext3 defaults,acl 1 2

Vous pouvez utiliser la commande setfacl pour ajouter des permissions pour différents groupes sur le même repertoire.

Nous allons créer en premier deux groupes ing et ventes :

groupadd ing
groupadd ventes

Ensuite ajoutez un répertoire appelé /usr/NEWS :

mkdir /usr/NEWS

getfacl est un outil qui permet de lister les droits ACL. Donc, avant de faire quoi que se soit, nous allons regarder la sortie de cette commande :

getfacl /usr/NEWS
# file: share
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

Ensuite ajoutez les permissions rwx sur le répertoire NEWS pour le groupe ventes :

setfacl -m g:ventes:rwx NEWS/

Lister les droits ACL :

getfacl NEWS/
# file: NEWS
# owner: root
# group: sales
user::rwx
group::r-x
group:ventes:rwx
mask::rwx
other::r-x

Finalement ajoutez les permissions r_x pour le groupe eng et listez les permissions :

setfacl -m g:ing:r-x NEWS/

getfacl NEWS/
# file: NEWS
# owner: root
# group: sales
user::rwx
group::r-x
group:ventes:rwx
group:ing:r-x
mask::rwx
other::r-x

Le patch a fonctionné. Les outils que nous venons de voir ne sont pas dans les objectifs 201.

Page consultée 25 fois