Compiler un noyau Ubuntu

Ce tutoriel est une méthode se voulant synthétique et éprouvée pour Ubuntu 10.04 (Lucid Lynx) et Ubuntu 10.10 (Maverick Meerkat). Cette page n'a pas lieu de remplacer les tutoriaux Compiler Linux et Comment compiler un kernel sur mesure, auxquels il est fortement conseillé de se référer pour de plus amples informations sur la compilation d'un noyau Ubuntu et Linux en général. Néanmoins, les méthodes de compilation du noyau évoluent quelque peu d'une version à l'autre.

Version courante du kernel (stable) : 2.6.35

Pré-requis

sudo apt-get build-dep --no-install-recommends linux-image-$(uname -r)

Récupérer les sources du noyau

1) Via les archives sources

Créer un dossier où télécharger les sources et se déplacer à l'intérieur, exemple pour un dossier nommé src dans votre dossier personnel :

mkdir ~/src
cd ~/src

Après avoir pris bien soin de vérifier tous les Pré-Requis présentés plus haut (sauf l'étape concernant Git), lancer dans un terminal la commande suivante pour récupérer vos sources :

apt-get source linux-image-$(uname -r)
Notez que la commande uname -r sert à afficher la version courante de votre noyau

Ceci va créer un sous répertoire nommé linux-<version du noyau téléchargé> où seront extraites les sources de votre noyau courant. Déplacez-vous y par la commande :

cd linux-<version du noyau>

2) Via les dépôts Git

FIXME tOnI0 01/02/2011 - A venir

Editer votre configuration

Ce tutoriel ne traite pas des milles et unes façons de configurer son noyau, par conséquent nous assumons que vous savez à l'avance quelles options sont nécessaires à la compilation de votre noyau.

Deux méthodes sont proposées

  • La méthode basique, nécessitant uniquement une modification votre configuration actuelle
  • La méthode de création d'une nouvelle variante, à réserver aux personnes qui souhaitent compiler plusieurs versions d'un même noyau

Légèrement différentes dans leur approche, ces deux méthodes mènent au même résultat.

a) En réutilisant la configuration actuelle

Commencer par copier la configuration actuelle qui se trouve dans le dossier /boot vers votre dossier courant sous le nom de fichier .config

cp -vi /boot/config-`uname -r` .config

Vous pouvez également importer n'importe quel autre fichier de configuration en adéquation avec la version de votre noyau.

Il vous reste à entrer dans la configuration et à la modifier selon vos préférences. Bien qu'il soit possible d'éditer directement le fichier .config avec un éditeur de texte, je vous recommande la méthode graphique que l'on utilise en saisissant la commande suivante :

make menuconfig
Il est fortement conseillé de désactiver l'option Kernel Debugging sous peine de se retrouver avec un dossier source de plusieurs Gigaoctets à la compilation.
Kernel Hacking --->
    [ ] Kernel Debugging        <------------- A DÉSACTIVER

Enregistrez bien vos modifications avant de passer à la suite.

Les sources sont prêtes à être compilées.

b) En créant votre propre variante

Inspiré par cet article de Peter sur le site My Thoughts

Les sources du noyau ont l'avantage de proposer d'office plusieurs choix de configuration. La configuration installée par défaut sur Ubuntu est la configuration generic, vous avez dû vous apercevoir de cette extension lorsque vous démarrez votre ordinateur et que Grub vous affiche la liste des noyaux installés. Il existe cependant d'autres variantes (ou flavours en anglais) pour différences architectures (i386, amd64) et différents usages (generic, server, virtual, pae…)

Nous allons ici exploiter les scripts contenus dans le sous dossier debian/rules de votre dossier source pour éditer les configurations par défaut proposées par les sources du noyau. A titre d'information, ces fichiers de configuration se trouvent dans le sous-dossier debian/configs.

Dupliquer le fichier de configuration qui vous intéresse (generic, server, virtual, ou autre) et le renommer avec votre propre extension. Dans l'exemple suivant on choisit d'utiliser la configuration <conf> comme base et de créer le fichier config.flavour.<ma config>, en veillant à remplacer <conf> par la variante de votre choix (generic par défaut) et <ma config> par un mot de votre choix.

On peut pour cela utiliser la commande suivante en remplaçant <architecture> par i386 si vous avez installé un Ubuntu 32bits ou amd64 si vous avez installé un Ubuntu 64bits.

cp debian.master/config/<architecture>/config.flavour.<conf> debian.master/config/<architecture>/config.flavour.<ma config>

Pour plus de commodité dans la suite du tutoriel, les occurences suivantes vont être remplacées, prendre soin de les adapter à la suite des manipulation :

  • <conf> → generic
  • <architecture> → i386
  • <ma config> → mon_noyau

On fait appel au script suivant pour éditer la/les configurations que nous souhaitons.

debian/rules editconfigs

Dans le cas présent, nous souhaitons seulement modifier la configuration mon_noyau qui vient d'être créée. Il faut donc répondre *N* à toutes les questions posées, sauf à la question concernant votre propre configuration où il faudra répondre *Y*.

Do you want to edit config: i386/config.flavour.mon_noyau? [Y/n]

Il vous reste à la modifier selon vos préférences.

Il est fortement conseillé de désactiver l'option Kernel Debugging sous peine de se retrouver avec un dossier source de plusieurs Gigaoctets à la compilation.
Kernel Hacking --->
    [ ] Kernel Debugging        <------------- A DÉSACTIVER

Enregistrer les modifications avant de passer à la suite, et répondre *N* aux dernières questions s'il y a lieu.

On regénère les fichiers de config pour s'assurer qu'ils ne contiennent pas d'erreur.

debian/rules updateconfigs

Dupliquer ces deux autres fichiers et les renommer selon le nom de votre nouvelle configuration pour que la variante soit prise en compte lors de la compilation.

cp debian.master/abi/2.6.35-23.36/i386/generic debian.master/abi/2.6.35-23.36/i386/mon_noyau
cp debian.master/abi/2.6.35-23.36/i386/generic.modules debian.master/abi/2.6.35-23.36/i386/mon_noyau.modules

Ouvrir le fichier debian.master/etc/getabis

Ajouter mon_noyau à la fin de la ligne

getall i386 generic generic-pae virtual

Ouvrir le fichier debian.master/rules.d/i386.mk

Ajouter mon_noyau à la fin de la ligne

flavours        = generic generic-pae virtual

Enfin, dupliquer le fichier debian.master/control.d/vars.generic et le renommer en debian.master/control.d/vars.mon_noyau

cp debian.master/control.d/vars.generic debian.master/control.d/vars.mon_noyau

Les sources sont prêtes à être compilées.

Compilation

  • Si vous avez suivi la méthode a) précédemment , la compilation se lance ainsi, en remplaçant mon_noyau par ce que vous souhaitez :
fakeroot debian/rules clean  #nettoyage de l'arborescence des sources, pour éviter de laisser trainer des résidus d'anciennes compilations
CONCURRENCY_LEVEL=3 skipabi=true fakeroot make-kpkg --initrd --append-to-version=-mon_noyau kernel-image kernel-headers
  • Si vous avez suivi la méthode b), la compilation se lance ainsi :
fakeroot debian/rules clean  #nettoyage de l'arborescence des sources, pour éviter de laisser trainer des résidus d'anciennes compilations
CONCURRENCY_LEVEL=3 skipabi=true fakeroot debian/rules binary-mon_noyau

Des précisions :

  • skipabi=true sert à outrepasser les vérifications ABI (tests de compatibilité binaire) ce qui évite des erreurs très courantes
  • CONCURRENCY_LEVEL=3 est à adapter selon le nombre de coeurs que vous possédez sur votre machine. On prend une valeur égale au nombre de coeurs + 1 (soit 3 pour un processeur double coeur)
La compilation dure en moyenne entre 1 et 3 heures sur la plupart des machines.

Installation

Si tout s'est bien déroulé, deux fichier installeurs .deb devraient être créés à la racine de votre dossier courant (~/src/linux-<version du noyau> pour rappel). Leur nom doit ressembler à ceci :

linux-headers-2.6.35-23-mon_noyau_2.6.35-23.37_i386.deb
linux-image-2.6.35-23-mon_noyau_2.6.35-23.37_i386.deb

Dans un envrironnement de bureau, l'installation de votre nouveau noyau peut bien souvent se faire par un double clic sur chacun de ces fichiers. Dans un terminal, on peut utiliser la commande suivante :

sudo dpkg -i  linux-headers-2.6.35-23-mon_noyau_2.6.35-23.37_i386.deb linux-image-2.6.35-23-mon_noyau_2.6.35-23.37_i386.deb

En remplaçant bien sûr les noms de fichiers donnés en exemple par les vôtres.

Le nouveau noyau devrait apparaître dans votre menu GRUB au prochain redémarrage.

Voir aussi