Compiler un noyau Linux
Cette documentation est désormais rendue obsolète par une version plus récente : http://www.evolix.fr/linux/compilation.html
Sommaire
Les bases
Pour connaitre la version du noyau animant le système :uname -r
On remarque la présence à la racine d'un lien de vmlinuz vers /boot/vmlinuz-2.x.x (où 2.x.x est la version du noyau)
Le noyau en lui même se trouve donc dans /boot
Dans /boot, on trouve :
vmlinuz-2.x.x et System.map-2.x.x
Dans /lib/modules, on trouve :
Les modules regroupés dans un rep 2.x.x
Dans /usr/src, on trouve :
Les sources (si le noyau a déjà été recompilé) sous forme de répertoires kernel-source-2.x.x (ou linux-2.x.x) et les entêtes sous forme de répertoire kernel-headers-2.x.x
Un lien symbolique linux pointe vers les sources les plus récentes kernel-source-2.x.x
Pour recupérer les dernières sources, il faut les récupérer sur www.kernel.org et les mettre dans /tmp par exemple, les désarchiver dans /usr/src et changer le lien linux vers ces dernières sources:
cd /usr/src tar zxvf /tmp/linux-2.x.x.tar.gz ln -s linux-2.x.xx linuxOu bien, si vous utilisez Debian, vous pouvez aussi utiliser les sources Debian (un brin patchée) en faisant:
apt-cache search kernel-source apt-get install kernel-source-2.x.x cd /usr/src tar xvfj kernel-source-2.x.xx.tar.bz2 ln -s kernel-source-2.x.xx linux
Le choix des options du noyau
Commençons :cd /usr/src/linux make xconfigVoici ce que l'on obtient avec un noyau 2.4.x:
Voici ce que l'on obtient avec un noyau 2.6.x:
On peut choisir les options en mode console par
make menuconfigVoici ce que l'on obtient:
Ou encore tout simplement
make configVoici ce que l'on obtient:
Attention l'installation de paquets spécifiques peut-être nécessaire, notamment :
kernel-package bin86 dpkg-dev libncurses5-dev gcc make libc6-dev binutils debianutils modutils debhelper tcl8.4 tk8.4 perl perl-modules
Pour l'interface graphique xconfig des versions 2.6.x, on aura besoin de libqt3-dev et pour les modules, on aura besoin (sous Debian) du paquet module-init-tools
Les options du noyau sont contenues dans le fichier .config
Pour deux compilations successives, il suffit donc de changer les éléments différents de la compilation précédentes et non de tout reconfigurer.
Voici les options classiques, légérèment commentées, pour un noyau 2.4.x:
options d'un noyau 2.4.x
À titre d'exemple, voici le .config (2.4.22) correspondant à l'un de mes postes de travail
Et voici le .config (2.6.0) correspondant à la même machine
Une fois le choix des options terminés, on obtient souvent un message:
end of Linux kernel configuration. Check the top-level Makefile for additional configuration. Next, you must run 'make dep'.
Il faut donc maintenant compiler ce noyau. Choisissez la méthode classique, ou la méthode Debian si vous avez une Debian.
Compilation classique
make dep vérifie les dépendancesmake clean fait un peu le ménage
make bzImage compile le noyau
make modules compile les modules
makes modules_install
(Eventuellement make bzlilo mais le faire à la main est plus conseillé, voir la procédure ci-dessous)
cp arch/i386/boot/bzImage /boot/vmlinuz-new
Editer lilo.conf et ajouter :
image=/boot/vmlinuz-new
label=new
root=/dev/hdan où hdan est votre partition racine
read-only
puis faire :
#lilo
Compilation "à la sauce debian"
cd /usr/src/linux make configApres avoir installé le paquet kernel-package contenant les outils debian,
la compilation est assez aisée, car on vérifie les dépendances et compile notre noyau puis dépose un paquet .deb dans le /usr/src avec la commande :
make-kpkg clean make-kpkg kernel_imageIl nous suffit ensuite d'installer ce paquet kernel_image:
dpkg -i kernel-image-2.x.x.xxx_i386.debCe qui va installer le noyau vmlinuz-2.x.x dans /boot, mais aussi le System.map-2.x.x, sauvegarder le .config utilisé dans /boot/config-2.x.x, installer les modules dans le répertoires /lib/modules/2.x.x, vous proposer de créer une disquette de boot, créer le lien symbolique /vmlinuz qui pointe vers votre noyau, modifier le lien /vmliz.old si il existe vers le noyau actuel et enfin vous proposer d'exécuter lilo.
Afin de pouvoir rebooter avec son noyau actuel en cas de pépins ;) je vous conseille de bien vous assurez de la présence de vmlinuz.old et d'une section le concernant dans lilo.conf, vous pouvez ensuite rebooter.
À noter que l'on peut passer en l'argument --append-to-version=machinchose lors de la compilation du kernel :
make-kpkg --append-to-version=mon_ptit_noyau kernel_imageUne fois l'installation terminée, vérifiez bien que votre ancien noyau est présent dans lilo pour rebooter dessus en cas de pépin. L'un des avantages de la méthode Debian est que l'on peut désinstaller le noyau comme un paquet Debian:
apt-get remove --purge kernel-image-2.x.xx
Vous pouvez générer d'autres paquets intéressants:
Un paquet contenant les entêtes du noyau par:
make-kpkg kernel_headersUn paquet contenant les sources du noyau par:
make-kpkg kernel_sourceUn paquet contenant la documentation du noyau par:
make-kpkg kernel_docPuis vous pouvez installer ces paquets Debian par 'dpkg -i'
Il est recommandé d'installer au moins les entêtes du noyau.
Pour recompiler à nouveau ce noyau, pas de problèmes car le .config a gardé toutes vos options en mémoire, il suffit donc de modifier les options que vous voulez par la commande
make xconfigIl faudra ensuite faire:
make-kpkg clean make-kpkg --revision mon_ptit_noyau kernel_imageSi vous n'avez pas mis l'argument --revision lors de la première compilation, remplacer mon_ptit_noyau par 10.00.Custom
Lorsque l'on a déjà compilé un noyau, et que l'on change de version. Il suffit de télécharger les nouvelles sources du noyau, de les décompresser puis de placer l'ancien .config que l'on trouvera souvent dans /boot, par exemple:
# cp /boot/config-2.4.22 /usr/src/linux-2.4.23/.config # make oldconfigCela va poser des questions pour les nouveaux paramètres du noyau, ce qui permet de gagner du temps. On pourra toujours aller revérifier les options par make config/menuconfig/xconfig..
À noter, la commande magique qui fait tout tout seul est:
make-kpkg buildpackageA savoir :
make-kpkg clean
make-kpkg --revision 10.00.Custom kernel_image
make-kpkg kernel_doc
make-kpkg kernel_source
make-kpkg kernel_headers