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 :
Sommaire
Pré-requis
- Niveau LPIC 1
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.
Pour créer une image de noyau compressée avec Gzip, on utilisera : make zImage. L'image du noyau sera :
/usr/src/linux/arch/i386/boot/zImage
Pour utiliser un algorithme de compression plus efficace, on créera l'image avec make BzImage. Vous obtiendrez ainsi l'image :
/usr/src/linux/arch/i386/boot/bzImage
On peut également utiliser: make zdisk ou make bzdisk pour copier l'image du noyau compressée sur une disquette. L'image sera écrite sur :
/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 :
- ne pas utiliser le module (n)
- intègre le module directement dans le noyau (y)
- compile le module de façon a être chargé dynamiquement (m)
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 306 fois