Looking for Computer Science  & Information Technology online courses ?
Check my new web site: https://www.yesik.it !


Cet article décrit comment compiler un noyau Linux sous Debian. Il y a de nombreuses raisons pour lesquelles vous pourriez avoir envie de vous frotter à cet exercice: Pour optimiser votre système, parce que le noyau standard de votre distribution est incompatible avec votre matériel. Ou tout simplement par curiosité. Et ce ne sont là que quelques exemples.

Mais, si l'exercice est parfois redouté, vous allez voir qu'avec les outils disponibles dans une distribution comme Debian, c'est en fait une tâche presque triviale!

Avant de commencer

Sous Debian, la totalité des outils nécessaires à la compilation d'un noyau Linux sont disponibles dans les dépôts standards. A installer (apt-get install ...) s'ils ne sont pas déjà sur votre système:

linux-source-X.Y.ZZ (linux-source-2.6.32, linux-source-2.6.26, linux-source-2.6.24, ...)
le paquet de base puisqu'il contient les sources du noyau avec tous les patches Debian déjà appliqués. Prenez celui correspondant à la version du noyau que vous voulez compiler. Attention cependant, certaines versions ne sont pas forcément dans le dépôt de votre distribution – et, le cas échéant, il vous sera peut-être nécessaire de modifier /etc/apt/sources.list en conséquence;
libncurses5-dev
pour pouvoir configurer le kernel à construire avec menuconfig;
kernel-package
paquet contenant l'utilitaire make-kpkg qui permet de compiler un noyau et de générer un paquet Debian prêt à installer;
fakeroot
Pour pouvoir compiler le noyau en utilisateur.
sh# apt-get install linux-source-2.6.26 \
                    libncurses5-dev \
                    kernel-package \
                    fakeroot

Note:

Il est préférable d'utiliser les sources distribuées dans les dépôts de Debian plutôt que celles issues directement de kernel.org. En effet, ces dernières sont plus des bases auxquelles les mainteneurs des diverses distributions appliquent leurs patches spécifiques.

Dans le vif du sujet

Extraire les sources

Dans la distribution Debian, il est possible de compiler un nouveau kernel en utilisateur normal. C'est à dire sans nécessiter les privilèges root. Pour cette procédure, la première étape consiste à décompresser les sources dans votre répertoire de travail:

sh$ mkdir $HOME/kernel
sh$ cd $HOME/kernel
sh$ tar xjf /usr/src/linux-source-2.6.26.tar.bz2

Configuration

Une fois les sources décompressées, nous allons pouvoir passer à la phase de configuration du kernel à construire. Ici, je ferai la configuration en mode texte avec l'interface ncurses. D'autres choix sont possibles, mais celui-ci permet de faire la configuration de façon relativement agréable à partir d'un terminal texte (ce qui est bien pratique quand votre machine de compilation est un serveur distant auquel vous accédez via ssh):

sh$ cd linux-source-2.6.26
sh$ make menuconfig

.config

La configuration du kernel à construire est sauvegardée dans un fichier appelé .config. C'est donc un fichier caché puisque son nom commence par un point.

La configuration complète d'un kernel est une tâche complexe et fastidieuse à cause du nombre important d'options possibles – sans parler des interdépendances. Donc, plutôt que de partir de zéro, vous préférerez certainement commencer votre configuration à partir d'un modèle. Il y a plusieurs sources où vous pouvez trouver des configurations clé en main pour vous servir de point de départ:

  • http://merkel.debian.org/~jurij/ – Annuaire de configurations des kernels standard Debian:
    sh$ cd linux-source-2.6.26
    sh$ wget 'http://merkel.debian.org/~jurij/2.6.26-21lenny4/i386/config-2.6.26-2-686.gz'
    sh$ gunzip config-2.6.26-2-686.gz
    sh$ cp config-2.6.26-2-686 .config
    sh$ make menuconfig
    
  • /boot/config-* – sur votre système Debian, le répertoire boot contient la (les) configuration(s) du (des) kernel(s) installé(s):
    sh$ cd linux-source-2.6.26
    sh$ cp /boot/config-2.6.26-2-686 .config
    sh$ make menuconfig
    
  • Enfin, les sources du kernel contiennent aussi des configurations par défaut pour l'ensemble des architectures supportées:
    sh$ cd linux-source-2.6.26
    sh$ find . -name "*_defconfig" | grep x86
    ./arch/x86/configs/x86_64_defconfig
    ./arch/x86/configs/i386_defconfig
    sh$ cp ./arch/x86/configs/i386_defconfig .config
    sh$ make menuconfig
    

Compilation et construction du paquet

Une fois la configuration terminée, reste la construction du kernel (et de ses modules) à proprement parler. Pour faciliter notre vie, Debian propose l'utilitaire make-kpkg: outre la construction à proprement parlée, celui-ci s'acquittera de toutes les tâches nécessaires jusqu'à l'obtention d'un paquet Debian.

Compilation concurrente

Si vous avez plusieurs processeurs – ou plusieurs core – définissez la variable d'environnement Modèle:Variable d'environnement avant de lancer make-kpkg. Une bonne valeur de base est 1 de plus que le nombre de processeurs et/ou core à votre disposition. Sur ma machine de compilation avec deux processeurs dual core j'utilise la valeur 5:

sh$ export CONCURRENCY_LEVEL=5
# Tout d'abord on nettoie les traces laissées par un éventuel build précédent 
sh$ make-kpkg clean
# Puis on passe à la construction du paquet kernel personnalisé 
sh$ make-kpkg --rootcmd fakeroot \
              --config oldconfig \
              --initrd \
              --append-to-version=-demo.chicoree.fr \
              --revision=1.0 \
              kernel-image

Profitons de la compilation, qui peut durer un bon moment, pour faire le détail des options que j'ai utilisées:

--rootcmd fakeroot
Cette option précise que nous souhaitons compiler sans privilèges root.
--config oldconfig
pas de re-configuration avant le build. C'est la valeur par défaut – donc vous pouvez éventuellement laisser cette option de côté.
--initrd
indispensable si votre bootloader et la configuration de votre kernel nécessitent un ram-disk initial. Sur les distributions modernes, c'est souvent le cas par défaut.
--append-to-version=-demo.chicoree.fr
un numéro de version à ajouter après la version officielle du kernel. Pratique pour faciliter votre gestion de vos différents noyaux personnalisés. Ici, j'utilise le nom de l'hôte auquel ce noyau est destiné.
--revision=1.0
un numéro de révision utilisé notamment par dpkg pour trier les révisions d'un même paquet.

Installation du paquet

Une fois la compilation terminée, vous aurez dans le répertoire de niveau supérieur un fichier .deb. il s'agit du paquet Debian à installer pour ... installer votre kernel. L'installation se faisant sous l'identité root à l'aide de la commande dpkg:

sh$ cd ..
sh$ ls *.deb
ls *.deb
linux-image-2.6.26-demo.chicoree.fr_1.0_i386.deb
# Le nom exact du fichier varie en fonction de la version du kernel et de la config.
sh$ sudo dpkg -i linux-image-2.6.26-demo.chicoree.fr_1.0_i386.deb

Et voilà: au prochain redémarrage de la machine, grub vous proposera de booter avec ce nouveau kernel.

Le futur

Depuis quelques temps, le paquet kernel-package n'est plus consisdéré comme le moyen privilégié pour construire un noyau sous Debian. En effet, une cible spécifique a été ajoutée au makefile du kernel:

sh$ make deb-pkg

Néanmoins, cette alternative n'est pas encore tout à fait prête (prévu pour 2.6.32). Par ailleurs, make-kpkg semble encore avoir suffisamment de fidèle pour qu'il ne soit pas près de devenir obsolète [1].

Références