Le but de ce chapitre est de confectionner un noyau adapté au mieux à nos besoins afin de remplacer celui qui a été installé par la distribution. Nous nous basons pour cela sur l'installation qui a été réalisée lors du précédant chapitre, en partant du principe que le compilateur gcc et l'outil make fonctionnent correctement.
Le noyau de Linux qui est fourni avec votre distribution est un noyau qui a été spécialement conçu pour démarrer correctement sur le plus grand nombre de machines possibles. Il ne s'agit donc pas d'un noyau optimal, d'où l'interet de compiler un noyau plus adapté.
La compilation du noyau est une spécificité des systèmes libres, qui n'est possible que parce que l'on dispose des sources du noyau. Cependant, même pour certains Unix commerciaux, il est possible d'effectuer une édition de liens, les modules du noyau étant fournis sous la forme de fichiers objets. La compilation ou l'édition de liens du noyau est une opération technique qui peut surprendre un habitué des systèmes fermés que sont par exemple Windows ou OS/2. Cependant, elle permet d'obtenir un noyau très petit, optimisé pour la machine sur laquelle il tourne, et donc à la fois économe en mémoire et performant. Il est donc recommandé d'effectuer cette compilation : pourquoi conserver un monstre capable de gérer des périphériques qui ne sont pas et ne seront jamais installé sur votre système ?
La compilation du noyau de Linux nécessite de disposer des dernières sources du noyau (version 2.4.17. au 22/10/2001) et d'un compilateur. Il est évident que le compilateur idéal est le compilateur GNU C/C++ GCC. On utilisera la version la plus stable actuellement, à savoir la version 2.95.3. Je supposerai dans la suite de ce document que vous disposez de la dernière version du noyau, à savoir la version 2.4.17 [GIC02].
La compilation du noyau n'est pas très difficile, cependant, elle nécessite de répondre correctement aux questions de configuration. Les erreurs peuvent être multiples, et seront fatales. Il est donc fortement conseillé de disposer d'une disquette de démarrage afin de réparer le système en cas d'erreur. Par ailleurs, il faut toujours conserver le dernier noyau utilisable en sauvegarde dans le répertoire /boot/. Il faut également ajouter une entrée spécifiant ce noyau dans le programme de démarrage (lilo), afin de pouvoir sélectionner l'ancien noyau en cas d'erreur. Ces opérations seront également décrites en détail plus loin [GIC02].
La compilation du noyau se passe en quatre étapes :
Les sources les plus récentes du noyau peuvent être trouvées sur le site ``http://www.kernel.org''. Il est possible de récupérer les sources complètes, sous la forme d'une archive comprimée d'environ 24 Mo. Toutefois, dans un soucis de commodité, nous utiliserons dans ce chapitre les sources fournies avec notre distribution.
Généralement, les sources du noyaux Linux sont installés dans le répertoire /usr/src/linux/. On devra donc renommer temporairement le répertoire originel avant d'installer les sources du nouveau noyau, ou au moins en faire une sauvegarde. Une autre solution est d'installer les fichiers du noyau dans un répertoire /usr/src/linux_version/ et d'utiliser un lien symbolique /usr/src/linux/ pour sélectionner la version que l'on veut compiler. Cela permet de conserver plusieurs jeux de sources de versions différentes, et de travailler sur la version courante dans le répertoire /usr/src/linux/ facilement. Les commandes suivantes permettront d'extraire les sources dans le répertoire dédié au sources de Linux. Elles supposent qu'il existe déjà un lien symbolique /usr/src/linux/ vers le répertoire des fichiers sources actuels de Linux :
cd /usr/src rm linux mkdir linux-2.4.17 ln -s linux-2.4.17 linux tar xvfz linux-2.4.17.tar.gz
[GIC02]
Pour pouvoir paramétrer votre compilation, il est nécessaire de ce placer dans le répertoire contenant les sources du noyau. Pour cela, utilisez la commande :
La configuration du noyau peut se faire ``à l'ancienne'' avec la commande suivante :
Cette commande pose une série de questions auxquelles il faut pouvoir répondre correctement du premier coup. On n'a pas le droit à l'erreur ici, faute de quoi il faut tout reprendre à zéro.
Il est nettement plus convivial d'utiliser la version Tcl/Tk sous X11.
Cette version donne l'accès aux différentes options sans un ordre
quelconque, et ne présente que les options réalisables étant données
celles déjà fixées. Cette méthode est évidemment la méthode conseillée
(voir figure 7.1, page
). Pour l'utiliser, il suffit de taper la commande
suivante :
Si l'on ne dispose pas encore de X11 on peut utiliser la version texte avec menu en tapant la commande suivante :
Quelle que soit la méthode utilisée, il faut répondre par ``Y'' (pour ``Yes''), ``N'' (pour ``No'') ou ``M'' (pour ``Module'') lorsque c'est possible. ``Y'' et ``M'' incluent la fonctionnalité courante dans le noyau ou sous la forme d'un module, ``N'' la supprime. ``M'' permet d'utiliser la fonctionnalité en tant que module du noyau. En général, l'utilisation des modules permet d'alléger le noyau car les fonctionnalités sont chargées et déchargées dynamiquement. Cependant, les fonctionnalités nécessaires au démarrage de Linux, comme les gestionnaires de disques et systèmes de fichiers par exemple, ne doivent en aucun cas être placées dans des modules, car alors le système ne pourrait pas démarrer.
Quand vous avez configuré votre compilation, sortez de l'utilitaire en sauvegardant vos modifications (``Save and Exit'').
[GIC02]
Une fois la configuration du noyau réalisée, la compilation peut être lancée. Pour cela, il suffit de lancer les trois commandes suivantes dans le répertoire /usr/src/linux :
make dep make clean make bzImage
La première commande génère les dépendances entre les fichiers du noyau. Ces dépendances sont utilisées par les fichiers makefile. La deuxième commande effectue le ménage nécessaire pour supprimer tous les fichiers objets pouvant résulter d'une précédente compilation. Cette opération est nécessaire afin d'éviter de mélanger des fichiers ayant été compilés avec des options de configuration différentes. Enfin, la troisième commande lance la compilation et l'édition de lien proprement dite.
Une fois la compilation achevée, il faut installer le nouveau noyau. Cette opération nécessite beaucoup de prudence, car si le noyau nouvellement créé n'est pas bon, le système ne redémarrera plus. C'est pour cela qu'il est conseillé de conserver toujours deux versions du noyau, dont on est sûr que l'une d'entre elle fonctionne parfaitement. En pratique, cela revient à conserver la version originale du noyau installé par votre distribution. Pour cela, il faut en faire une copie de sauvegarde.
En général, le noyau est installé dans le répertoire /boot/. Il porte souvent le nom de ``vmlinuz'', pour le sauvegarder, il suffit donc de taper par exemple la commande suivante :
Il faut également indiquer au gestionnaire d'amorçage qu'il faut qu'il
donne maintenant la possibilité de démarrer l'ancienne version du
noyau sous ce nouveau nom. Pour LILO, il suffit d'éditer le fichier
/etc/lilo.conf et d'y ajouter une nouvelle configuration. En
pratique, cela revient à dupliquer la configuration du noyau actuel et
à changer simplement le nom du noyau à charger (paramètre ``image'' de
la configuration dans /etc/lilo.conf) et le nom de la
configuration (paramètre ``label''). Vous devrez aussi rajouter
l'option ``prompt'' si elle n'y est pas déjà, afin que LILO vous
demande la configuration à lancer à chaque démarrage. Dans notre
exemple, le nom du noyau à utiliser pour la configuration de
sauvegarde sera ``vmlinuz.old''. De même, si la configuration initiale
de Linux porte le nom ``linux'', vous pouvez utiliser le nom
``VieuxLinux'' pour la configuration de sauvegarde
(voir figure 7.2, page
).
Une fois le fichier /etc/lilo.conf mis à jour, il faut réinstaller LILO, ce qui se fait simplement en invoquant la commande lilo.
[root@pc1 linux]# lilo Added Linux * Added VieuxLinux Added Windows
Si l'on otient un message différent, il faut corriger son fichier /etc/lilo.conf et ne sourtout pas tenter de redémarrer le système avant la résolution du problème (il ne redemarrerait probablement pas et il faudrait utiliser la disquette de secour).
L'image du nouveau noyau a été créée dans le répertoire /usr/src/linux/arch/i386/boot/, sous le nom bzImage. L'installation se fait donc simplement par une copie dans /boot/ en écrasant le noyau actuel vmlinuz :
Il faut également copier le fichier System.map du répertoire /usr/src/linux/ dans le répertoire /boot/ :
Ce fichier contient la liste de tous les symboles du nouveau noyau, il est utilisé par quelques utilitaires systèmes.
Si vous utiliser LILO, il vous faudra le réinstaller à nouveau pour qu'il prennent en compte le nouveau noyau. Cela se fait avec la même commande que celle utilisée précédemment : lilo.
Il faut ensuite redémarrer la machine avec la commande reboot et vérifier que le nouveau noyau fonctionne bien. S'il ne se charge pas correctement, c'est que les options de configuration choisies ne sont pas correctes. Il faut donc utiliser le noyau sauvegardé, vérifier ses choix et tout recommencer. Attention cependant, cette fois, il ne faut pas recommencer la sauvegarde du noyau, puisque cette opération écraserait le bon noyau avec un noyau défectueux.
Si le nouveau noyau démarre correctement, il ne reste plus qu'à installer les modules [GIC02].
Si le système a redémarré correctement, on peut compiler les modules et les installer. Il n'est pas nécessaire de prendre les mêmes précautions pour les modules que pour le noyau. Il suffit donc ici de lancer la commande suivante dans le répertoire /usr/src/linux/ :
Les modules sélectionnés lors de la configuration sont alors compilés, il ne reste plus qu'à les installer.
Avant toute installation de nouveaux modules, il est recommandé de
décharger tous les modules présents en mémoire. Cette opération peut
être réalisée à l'aide de la commande modprobe -ar, qui va
tenter de décharger les modules non utilisés. Vous pouvez consulter la
liste des modules chargés à l'aide de la commande lsmod. S'il
reste des modules chargés, vous pouvez les supprimer à l'aide de la
commande rmmod suivie du nom du module à supprimer. Pour pouvoir
supprimer un module, il faut que ce dernier ne soit plus utilisé par
le système. Par exemple, pour pouvoir supprimer le module
, chargé de la gestion du système de fichier ISO9660
utilisé pour les CD-ROM, il faut démonter préalablement tous les
CD-ROM du système.
Une fois que tous les modules sont déchargés (la commande lsmod retourne une liste vide), l'installation des modules est alors très simple, puisqu'il suffit de lancer la commande make modules_install suivante dans le répertoire /usr/src/linux/.
Les modules sont installés dans le répertoire
/lib/module/version/, où est le
numéro de version du noyau courant. Il est possible que des modules
d'autres versions du noyau existent dans leurs répertoires respectifs.
Si vous n'en avez plus besoin, vous pouvez les effacer. Attention
cependant si vous avez installé des modules additionnels non fournis
avec le noyau dans ces répertoires, vous pourriez encore en avoir
besoin.
Les modules sont utilisés par le chargeur de module du noyau, grâce à la commande modprobe. Cette commande a besoin de connaître les dépendances entre les modules afin de les charger dans le bon ordre. Il faut donc impérativement mettre à jour le fichier /lib/modules/version/modules.dep à chaque fois que l'on installe les modules, à l'aide de la commande depmod -a.
Les modules doivent être installés après avoir installé le noyau et redémarré le système, faute de quoi la commande depmod peut ne pas trouver trouver tous les symboles utilisés par les modules dans le noyau en court d'exécution [GIC02].