Configurer, Compiler et Installer un noyau Linux personnalisé

Aller à : navigation, rechercher
Internet.png Cette page n'existe pas encore dans le wiki de référence

Cet article devrait être traduit dans le wiki de référence anglais pour être profitable à tous les autres wikis localisés. Merci de participer au travail si vous en avez le temps et la compétence.
Si vous cherchez quelque chose à faire, regardez les autres Pages à traduire en anglais.

Cette page détaille la procédure à accomplir pour recompiler le kernel Linux. Elle est plus orientée sur la distribution openSUSE, mais moyennant quelques petites adaptations mineures, elle devrait également s'appliquer à la majorité des distributions à base de RPM.

Aussi, il existe maintes procédures variant dans les petits détails, le but étant de trouver et retenir votre procédure afin de pouvoir l'appliquer.

Introduction


Recompiler le noyau... une tâche qui semble ardue pour le nouveau venu sous Linux, et même pour les plus anciens qui ne se sont jamais lancés dans cette faramineuse besogne.

On dit souvent que recompiler son kernel est une chose difficile et très dangereuse. Ce n'est pas tout faux. Le noyau est le coeur du système GNU/Linux, c'est l'équivalent du "cerveau" software de votre machine, et l'altérer peut nuire à sa fonction première : faire fonctionner votre ordinateur. Cependant, la difficulté de compilation n'est en fait qu'affaire d'habitude, et en cas de problème, il y a toujours moyen de s'en sortir (avec plus ou moins "sans trop de casse" selon les cas).

Pour indication, voilà ce qu'a donné le reboot après ma première compilation de kernel :

Kernel panic: VFS: Unable to mount root fs

( non, ne partez pas !!! ;) )

Mais même là, un boot sur le dvd et une réparation par YaST via une simple réinstallation des rpm du kernel original a résolu le problème.


Ce tutoriel et vous


Pour ce tutorial, l'utilisation de Grub est ici supposée, car c'est le chargeur par défaut d'openSUSE. Egalement, ce tutoriel a été écrit pour un kernel 2.6.11 ou plus récent. Pour ceux qui utiliserait LILO ou un kernel antérieur, veuillez vous adresser à Google pour de plus amples informations.

Ai-je besoin d'un nouveau noyau ?

Vous avez besoin d'un nouveau noyau si :

  • Vous avez un matériel dont le support a été ajouté dans une nouvelle version du noyau
  • Un trou de sécurité a été découvert dans le noyau actuel, ce problème étant réglé dans une nouvelle version
  • Vous voulez absolument avoir la dernière version possible

Dans la plupart des cas, une simple mise à jour de votre kernel via openSUSE-updater peut suffire à votre bonheur. En effet, openSUSE fourni une version modifiée du kernel officiel, et est (en gros) une version officielle stabilisée munie de quelques “backports” et régulièrement mis à jour pour garantir la sécurité du système. Mais il est également possible d'utiliser une version du kernel openSUSE plus réçente comportant des fonctionnalités supplémentaires via Zypper/YaST, ou directement une version officielle issues des développeurs du noyau Linux.

Notez que pour un ordinateur en production, seule l'utilisation d'un kernel openSUSE stable est préconisé. A la maison ou pour une machine de test, on fait ce que l'on veut.

Ai-je besoin de recompiler le noyau ?

Vous avez besoin de recompiler votre noyau si :

  • vous voulez optimiser votre système
  • vous voulez tester des fonctionnalités encore au stade expérimentales
  • vous avez l'âme d'un aventurier, c'est votre première compilation
  • comme tout bon Geek, vous aimez compiler votre kernel ;o)

Dans la plupart des cas, vous n'avez PAS besoin de recompiler votre kernel.


Notions de base


Il existe une large variété de composants matériels pour PC. Pour utiliser ce matériel correctement, vous avez besoin d'un driver (ou pilote) grâce auquel le système d'exploitation (dans le monde Linux, le noyau) peut accéder au matériel.

Version du noyau

Comment fonctionne la notation du kernel linux ?

La <version> d'un noyau linux est formée d'une suite de 3 ou 4 nombres sous la forme suivante : 2.6.x ou 2.6.x.y.

  • 2 : Numéro de version majeure du noyau. Le nombre correspond à la “génération” du noyau.
  • 6 : Numéro de version mineure du noyau.
  • x : Numéro de révision du noyau.
  • y : Numéro de “patch level” du noyau.

Exemple : 2.6.22.1

Le temps de 2 à 3 mois entre chaque version 2.6.x majeures permet aux développeurs d'ajouter de nouvelles fonctionnalités et de les stabiliser pour la prochaine version stable 2.6.x+1.

En parallèle, une branche “stable”, notée à l'aide de l'introduction d’un 4e nombre y, est utilisée pour backporter à un niveau plus petit les corrections de bugs majeurs et les mises à jour de sécurité issues de la branches de développement du noyau, jusqu'à l'arrivée de la prochaine version stable 2.6.x+1

2.6.22
  ¦------------- 2.6.22.1
2.6.23-rc1         ¦
  ¦              2.6.22.2         2.6.x & 2.6.x.y : Branche stable
2.6.23-rc2         ¦              2.6.x-rcy       : Branche de développement
  ¦              2.6.22.3
2.6.23-rc3         ¦
  ¦              2.6.22.4
 ...
  ¦
2.6.23
  ¦------------- 2.6.23.1
2.6.24-rc1         ¦
  ¦              2.6.23.2
 ...               ¦

La notation chez openSUSE suit évidemment le mouvement et a donc la forme w.x.y.z-a.b. C'est une notation interne à openSUSE pour distinguer les modifications que l'entreprise entreprend.

Exemple : 2.6.18.8-0.5

Si vous avez déjà télécharger une ancienne version entière des sources du noyau, vous pouvez simplement utiliser des patchs à appliquer à ces sources sources, afin d'obtenir la version la plus récente.

Quels patchs appliquer à quelle version ?

Un patch noyau vas mettre à jour le code source seulement d'une version spécifique du noyau à une autre version spécifique. Voici comment les différents patchs peuvent être appliqués :

  • Les patchs pour noyau stable s'appliquent sur une version de base du noyau.

Exemple : Le patch 2.6.21.10 s'applique uniquement sur une version 2.6.21. Un 2.6.21.10 ne s'applique pas sur une version 2.6.21.9, ou sur tout autre version.

  • Les patchs pour noyau de base s'appliquent seulement sur la version précédente de version de base du noyau.

Exemple : Le patch 2.6.23 s'applique seulement sur la version 2.6.22 du noyau. Il ne s'applique pas sur une version 2.6.22.y, ou sur tout autre version.

  • Les patchs incrémentaux mettent à jour une version spécifique vers une autre version spécifique.

Exemple : Le patch 2.6.22.10-11 s'applique sur une version 2.6.22-10 uniquement pour obtenir une version 2.6.22.11

Qu'est ce qu'un kernel "vanilla" ?

Vanilla est le nom pour quelque chose qui ne contient aucun patch, modifications ou autres extras ce-que-vous-voulez. Dans le monde logiciel, vanilla signifie donc usuellement le "package original". Dans le cas du noyau Linux, c'est une référence au noyau officiel, disponible sur kernel.org.

Comment déterminer la version de mon kernel courant ?

Exécutez cette commande et regardez la chaîne de caractère qui est retournée.

$ uname -r

Noyau et modules

Il y a typiquement 2 voies pour intégrer un driver dans votre système :

  • le driver peut être compilé directement dans le noyau (compilation en dur). Un tel noyau (en une pièce) est appelé un noyau monolithique. Quelques drivers n'existent que sous cette forme.
  • le driver peut être chargé dans le noyau à la demande. Dans ce cas, le noyau est appelé noyau modulaire. Ceci à l'avantage que seuls les drivers réellement requis par le système sont chargés et que le noyau ne contient rien qui ne soit pas nécessaire.

Que compiler en dur et que compiler en module ?

Le noyau Linux est modulaire la plupart du temps (sauf pour des kernels embarqués), mais de nombreux drivers et fonctions sont intégrées au noyau.

Le choix des drivers qui doivent être compilés dans le noyau et ceux qui doivent être chargés à la demande est définit par la configuration du noyau.

Quels drivers compiler dans le noyau, et lesquels doivent être compilés comme modules ?

Basiquement, les composants non requis pour le démarrage du système doivent être compilés comme modules. Ceci assure que le kernel ne devient pas tros gros et ne puisse être chargé par le BIOS ou par un chargeur de démarrage. Aussi, intégrer le driver ou la fonction dans le noyau le rend (en théorie) plus stable et plus sécurisé.

Exemple : Les drivers pour ext3, les drivers SCSI sur les systèmes basés sur SCSI et les drivers similaires devraientt être compilés dans le noyau. En contraste, les autres, comme isofs, msdos, ou le son, qui ne sont pas requis pour le démarrage du système, devraient être compilés comme modules.

Mais notez que ce n'est pas forcément une règle stricte à respecter. Les drivers scsi ne sont pas forcément intégrés au noyau. Il faut alors que le ramdisk intègre les drivers et que le noyau les monte tout de suite après. Idemmement, les drivers sons peuvent être intégrés au noyau sans problème. C'est même obligatoire pour certaines cartes. Le problème est que s'il y a des mises à jour d'alsa par exemple, il faut recompiler le noyau, alors qu'une mise à jour du modules correspondant est plus rapide.

Ou sont situés tous ces fichiers ?

  • Les sources du noyau sont situés dans /usr/src/linux-<version>/. Il y a également un lien symbolique /usr/src/linux/ qui pointe vers ce répertoire.
  • Le noyau est situé dans le repertoire /boot/.
  • Les modules noyau sont situés dans /lib/modules/<version>/.

Quels fichiers composent le noyau ?

Le noyau est composé de 3 parties :

  • vmlinuz est l'image du noyau - le fichier qui contient le noyau.
  • System.map est le fichier qui contient les symboles noyau requis par les modules pour assurer le lancement avec succès des fonctions du noyau.
  • initrd - initial ram disk - est un fichier qui charge les drivers compilés en modules nécessaire au démarrage du noyau.

Ces trois fichiers sont dépendants et chacun est regénéré à chaque compilation.


Les sources


Il existe plusieurs variantes des sources :

  • Fournisseur Type Statut Paquet Remarques (par rapport au noyau par défaut)
  • openSUSE openSUSE Stable RPM Noyau installé par défaut, uniquement security-update
  • openSUSE vanilla Stable RPM Similaire au noyau par défaut, démuni des patchs additionnels openSUSE
  • openSUSE openSUSE ~Mis à jour RPM Intégre de nouvelles fonctionnalités
  • openSUSE vanilla ~Mis à jour RPM Similaire au noyau officiel, démuni des patchs additionnels openSUSE, intégre de nouvelles fonctionnalités
  • Kernel.org vanilla Stable tar.gz, tar.bz2 Noyau officiel, démuni des patchs additionnels openSUSE, intégre de nouvelles fonctionnalités, nécessite peut être se procurer des patchs additionnels
  • Kernel.org vanilla Developpement tar.gz, tar.bz2 Noyau similaire au kernel officiel, intégre de nouvelles fonctionnalités encore au stade expérimentales. C'est un snapshot de la version en cours de développement.

Qu'utiliser comme sources ?

Il est préférable d'utiliser les sources openSUSE (stables ou non, vanilla ou non) que les sources officielles. Parce que :

  • les sources vanilla peuvent ne pas compiler correctement (rare)
  • les sources vanilla peuvent ne pas contenir certaines fonctionnalités intéressantes ( backports d'openSUSE )
  • il faudra peut être ajouter certains drivers non libres qui ne sont pas inclus dans les sources vanilla et indispensables pour votre système en manuel.
  • openSUSE fourni des sources stables vanilla pour les intéressés.

De plus, avec les modifications apportées par openSUSE, le kernel vanilla officiel subit une étape de test supplémentaire avant d'être distribué au public, pour s'assurer que le package se compilera correctement. Et les ingénieurs de SUSE ont aussi openSUSE, comme vous. Si la compilation se passe bien pour eux, elle se passera bien pour vous. Personne ne pourra vous aider si ça plante encore chez vous

Néanmoins, "revers" de la médaille, les noyaux openSUSE sont patchés (et ce n'est pas peu dire), avec des drivers non-officiels et autres... Ce qui permet à openSUSE de fournir un noyau stable et comportant un maximum de fonctions. Cette dernière remarque ne concerne évidemment pas le noyau vanilla fourni par openSUSE, mais une version récente de celui-ci n'est pas disponible sans délai.

Alors pourquoi utiliser les sources vanilla ?

  • vous voulez avoir le dernier kernel sans délai
  • vous voulez un kernel 100% GPL
  • vous aimez bidouiller
  • vous avez l'âme d'un aventurier

Avec un noyau vanilla, il faudra appliquer les patchs additionnels correspondants à votre matériel pour obtenir l'équivalents des noyaux openSUSE.

Notez aussi que l'utilisation des sources vanilla est très aisées sur certaines distributions restant très près des sources et apportant peu de modifications, comme Slackware pour ne pas la citer.

Où les trouver ?

  • Noyau openSUSE de sécurité : package kernel-source-<version>.<arch>.rpm via openSUSE-updater.
  • Noyau openSUSE mis à jour: package kernel-source-<version>.<arch>.rpm via le BuildService openSUSE
  • Noyau officiel vanilla (stable ou devel) : package kernel-<version>.tar.gz ou kernel-<version>.tar.bz2 sur Kernel.org

Préparation


Pré-requis

Avant de commencer l'opération, il est obligatoire de posséder certains outils et fichiers, sinon aucune compilation ne sera possible.

Veillez à ce que ces packages soient installés :

  • les outils de développement noyau. Les packages ncurses, ncurses-dev, automake, autoconf, Qt3 (pour la configuration graphique) sont requis. Les autres sont des dépendances.
  • les sources du noyau, à jour si possible.

Analyse du système

Il existe 3 commandes de base permettant de savoir ce que son matériel a dans le ventre.

  • lspci : Permet d'afficher tous les dispositifs PCI. Utilisez la commande lspci -v pour obtenir plus d'informations, ou lspci -vv pour en obtenir encore plus
  • lsusb : Permet de connaître la liste du matériel usb connecté à votre machine
  • lsmod : Permet de lister tous les modules du noyau qui sont actuellement chargés.

Il vous sera sans doute nécessaire de faire une petite analyse de votre système afin de déterminer quels modules peuvent être compilés en dur, si vous souhaiter alléger votre noyau en incluant uniquement les modules correspondants à votre système ou si vous voulez gagner du temps à la compilation.

Notez que vous pouvez sans autre compiler tous les modules livrés avec les sources pour éviter les mauvaises surprises (oubli d'un module), au prix d'un temps de compilation plus long et d'un espace sur le disque dur légèrement réduit.


Installation des sources


Par défaut les sources seront installées dans /usr/src/linux-<version>.

Un lien symbolique /usr/src/linux pointe vers le répertoire des sources courantes.

Noyau openSUSE

Vous pouvez installer les sources

  • à partir de zypper/YaST ou similaire, pour le noyau par défaut (vanilla ou non)
  • à partir de zypper/YaST ou similaire, pour un noyau plus à jour, en ajoutant ce dépôt :
# zypper ar http://software.opensuse.org/download/Kernel:/Vanilla/openSUSE_<version>/ BS::Kernel:Vanilla

Installez les sources du noyau avec la commande suivante :

  • # zypper in kernel-source

Le lien symbolique est automatiquement mis à jour.

Noyau vanilla

Téléchargement

Vous trouverez sur Kernel.org, toutes les sources des noyaux actuels, précédents ou en développement.

  • linux-<version>.tar.gz ou linux-<version>.tar.bz2 contient toutes les sources du noyau.
  • patch-<version>.tar.gz ou patch-<version>.tar.bz2 contient la mise à jour des sources du noyau.

L'archive complète des sources pèse > 35 à 45 Mo, les patchs env. 5 Mo.

Téléchargez les sources actuelles via le fichier unique, ou si vous possédez déjà une ancienne version des sources, vous pouvez récupérer uniquement les mises à jours (un patch pour chaque changement de version mineure).

Récupérez les archives via votre navigateur préféré et copiez-les dans le dossier /usr/src/.

# cp archive /usr/src/

Vous pouvez aussi récupérer les différentes archives directement dans le dossier /usr/src/ en exécutant les commandes suivantes.

# cd /usr/src
# wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-<version>.tar.gz

ou bien

# cd /usr/src
# wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-<version>.tar.bz2

Installation

Décompressez l'archive principales des sources.

# tar -xzf linux-<version>.tar.gz

ou bien

# tar -xjf linux-<version>.tar.bz2

Il est nécessaire que les sources de votre nouveau noyau pointent vers /usr/src/linux.

Il est également probable que vous ayez les sources de votre ancien noyau. Il est conseillé de les supprimer avant de créer le nouveau lien pointant au bon endroit.

# rm /usr/src/linux
# ln -s /usr/src/linux-<version> /usr/src/linux

Mise à jour

Pour installer un patch pour passer d'une version à l'autre, récupérez les archives via votre navigateur préféré, puis décompressez-les :

# bzip2 -d patch-<version>.tar.bz2 /usr/src/

ou bien

# gunzip -d patch-<version>.tar.gz /usr/src/

Ensuite, appliquez les patchs sur les sources comme ceci :

# cd /usr/src/linux
# patch -p1 < patch-<version> 

Vous pouvez également utiliser ceci :

# bzip2 -dc /usr/src/patch-<version>.bz2 | patch -p1 --dry-run
# bzip2 -dc /usr/src/patch-<version>.bz2 | patch -p1

ou bien

# gunzip -c /usr/src/patch-<version>.gz | patch -p1 --dry-run
# gunzip -c /usr/src/patch-<version>.gz | patch -p1

La première commande est juste un test, mais n'affecte pas l'état de vos sources. S'il ne semble pas avoir d'erreur, vous pouvez exécuter la deuxième commande qui applique effectivement le patch.

Pour installer une série de patchs incrémentaux placés dans /usr/src/, utilisez cette commande automatique pour vous simplifier la vie :

# linux/scripts/patch-kernel linux

Vérification

Vous pouvez vérifier que le patching des sources s'est bien effectué en tapant

# make kernelversion
2.6.22.1

ou

# head -n 5 Makefile
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 22
EXTRAVERSION = .1
NAME = Holy Dancing Manatees, Batman!

Autres

Renommez ensuite le dossier des sources pour refléter sa version mise à jour et recréez le lien symbolique.

# mv linux-<version-old> linux-<version>
# ln -s -f linux-<version> linux

Téléchargez optionnellement maintenant les éventuels patchs non-officiels dont vous avez besoin, puis appliquez-les comme précédemment.


Configuration


Soyez sûr d'être dans le repertoire des sources du noyau.

# cd /usr/src/linux/

Nettoyage

Cette étape peut s'appliquer dans le cas où vous avez déjà des sources compilées dans le dossier /usr/src/linux/. Elle s'utilise principalement lorsque vous avez modifier plusieurs fois votre configuration et que vous avez passé certains modules dans le kernel.

En effet, il peut être parfois utile de supprimer les fichiers compilés de l'arborescence des sources avant de commencer la procédure de compilation.

Il existe plusieurs commande pour effectuer cette étape de “nettoyage” :

# make clean

et

# make mrproper
  • make clean supprime tous les fichiers compilés.
  • make mrproper supprime tous les fichiers compilés ainsi que le fichier de configuration .config qui contient les options de configuration du kernel.

Notez que la compilation durera plus longtemps, tous les fichiers devant être recompilés à nouveau. En effet, par défaut, seules les options modifiées sont recompilées.

Récupération de la configuration

Cette étape optionnelle permet de récuperer les paramètres déjà définis dans le noyau courant, ce qui est intéressant si vous avez déjà personnalisé votre noyau courant et que vous désirez l'utiliser comme base pour le nouveau noyau. Pour effectuer ceci, récutez les commandes suivantes :

# zcat /proc/config.gz > .config
# make oldconfig.

La configuration du noyau courant est contenu dans le fichier /proc/config.gz. La commande make oldconfig utilise le fichier /usr/src/linux/.config (issu de la commande précédente) comme modèle pour la configuration du nouveau kernel. Si le fichier .config n'existe pas, la configuration par défaut incluse dans les sources du noyau sera utilisée.

Sur les sources de noyau openSUSE, ces 2 opérations peuvent être simplement faites par l'alias suivant :

  1. make cloneconfig

Configuration

Démarrez ensuite la configuration :

# make menuconfig

Notez que vous pouvez aussi utiliser les commandes suivantes :

  • make config propose une longue suite de questions-réponses (y/n/m).
  • sux puis make xconfig propose une configuration en mode graphique (Qt).
  • sux puis make gconfig propose une configuration en mode graphique (GTK).

Toutes les options de configuration du noyau ne peuvent malheureusement pas être décrites ici en détail. Utilisez les nombreux textes d'aide intégrés pour la configuration. La documentation mise à jour du noyau est également placée dans /usr/src/linux/Documentation.

Naviguez ensuite à travers le menu de ocnfiguration du noyau et effectuez vos modifications et choix.

Soyez sur de spécifier une chaîne d'identification de version du noyau dans

General Setup --->
   (-default) Local version - append to kernel release

La chaîne standard est -default, mais vous pouvez mettre une châine différente qui vous aide à identifier spécifiquement vos changements effectués sur la configuration du noyau (par ex. -custom ou ce que vous voulez).

A noter que si vous compilez 2 versions différentes à partir des mêmes sources, il est primordial d'utiliser une chaîne différente, sinon le deuxième noyau risque d'écraser le premier (si installation en manuel) ou de ne pas pouvoir être installé du tout (si installation via RPM).


Compilation


Passons à la compilation du noyau et des modules proprement dite. Soyez patient durant cette étape, la compilation du noyau peut prendre du temps, selon la configuration choisie et votre matériel.

Compilation manuelle

# make

Après une compilation passée avec succès, le noyau compressé est situé dans /usr/src/linux/arch/i386/boot/bzImage.

Compilation via RPM

Alternativement, vous pouvez compiler et construire un paquet RPM du nouveau kernel en exécutant simplement cette commande :

# make rpm

Après une compilation passée avec succès, un fichier src.rpm et un paquet rpm sont créés.

  • Le paquet src.rpm<tt/> peut être trouvé dans le répertoire <tt>/usr/src/packages/SRPMS/.
  • Le paquet rpm<tt/> peut être trouvé dans le répertoire <tt>/usr/src/packages/RPMS/<arch>/, ou <arch> est l'architecture sélectionnée dans les options de configuration du noyau.


Installation


Installation manuelle

Maintenant, les modules compilés doivent être installés.

# make modules_install

Après que le noyau est compilé, il doit être installé pour que le système puisse booter dessus.

# make install

Installation via RPM

Installer maintenant votre paquet RPM du noyau comme ceci :

# cd /usr/src/packages/RPMS/<arch>/
# rpm -ivh kernel-<version>.<arch>.rpm

Notez que vous pouvez transférer ce paquet RPM sur un autre système openSUSE et l'installer de la même manière, ce qui signifie que vous n'avez pas besoin de compiler à nouveau le noyau pour ce système.


Autres


Réinitialisation du secteur de démarrage

Il faut maintenant recréer le ram disk initial pour le nouveau noyau, sinon le système ne sera certainement pas capable de redémarrer le nouveau noyau.

# mkinitrd

Notons que cette commande recréer un nouveau ram disk pour chacun des noyaux en présence détectés dans /boot/.

Contrôle du chargeur de démarrage

Vérifiez le fichier /boot/grub/menu.lst afin de voir si la nouvelle entrée permettant à Grub de booter sur le nouveau kernel a été créée. Si besoin, copiez la section concernant votre noyau actuel et adaptez-là au nouveau noyau. Ceci vous permettra de booter sur votre ancien noyau si un problème se présente.

Une section-type se présente comme ceci :

title openSUSE 11.x
root (hd0,0)
kernel /boot/vmlinuz root=/dev/hda1 vga=0x31a resume=/dev/hda3 splash=silent showopts
initrd /boot/initrd-<version>

Notez qu'en cas de besoin, Grub vous permet en tout temps de booter sur n'importe quel kernel, mais au prix de quelques commandes à taper.

Redémarrage

Enfin, redémarrez.

# reboot

Si tout se passe bien, vous pouvez supprimer votre ancien noyau et éventuellement purger vos sources si vous n'en avez plus l'utilité.