Intéressé par des cours d'informatique en ligne ?
Visitez mon nouveau 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!
Sommaire
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
- Debian Linux Kernel Handbook, Chapter 4: Common kernel-related tasks – Construire un Kernel Debian sans make-kpkg
- http://d-kriptik.com/blog/2005/09/14/custom-kernel-build-on-debian/ – Construire un Kernel Debian avec make-kpkg
- https://help.ubuntu.com/community/Kernel/Compile – Construire un Kernel Ubuntu avec make-kpkg