Home > Blog > Compiler son kernel perso

Compiler son kernel perso

Publié le 17/05/10
par BarbUk

Commençons par le début : qu’est-ce qu’un kernel ? Le kernel, ou noyau en français, est un logiciel très important dans un système d’exploitation GNU/Linux. D’ailleurs, quand on parle de Linux, c’est le noyau qu’on désigne. Une distribution GNU/Linux comporte donc des logiciels GNU, et un noyau Linux. Mais que fait-il ce kernel ?

Le kernel gère les ressources de l’ordinateur, et permet surtout aux logiciels et au matériel de communiquer. Il fournit pour cela des mécanismes d’abstraction de la mémoire, du processeur et des divers périphériques de votre machine. C’est grâce au kernel que vous pouvez copier des tas de films de vacances sur votre disque dur de 2000 giga-octets par exemple.

Mais pourquoi compiler son kernel me direz-vous ?

Vous avez sans doute une magnifique distribution installée sur votre ordinateur, et tout fonctionne au mieux… Seulement voila, votre distribution à été compilée de manière très générique, pour fonctionner sur le maximum de machine. Si vous utilisez une distribution 32 bits x86, celle-ci est sensée fonctionner sur tous les systèmes pourvu d’un processeur 32 bits utilisant le jeu d’instructions intel 8086, donc tous les processeurs depuis 1985 et l’arrivée du 386 d’intel !

Ajoutez à cela que les kernels de maintenant sont compilés avec un maximum de drivers pour assurer à l’utilisateur néophyte le moins de manipulations possibles, et vous avez devant vous un monstre tentaculaire.

Compiler son kernel, ce n’est donc pas seulement rentrer quelques commandes dans un terminal pour dire « ouais, moi j’ai compilé mon kernel », c’est surtout une configuration poussée et réfléchie. Et pour cela, il faut connaitre son ordinateur, l’aimer, et vouloir en prendre soin quoi qu’il arrive… heu, bref, revenons à nos moutons.

Commencez donc par récupérer les sources du dernier kernel sur kernel.org. Je suppose que vous avez tout ce qu’il faut pour compiler (build-essential, les librairies ncurses etc..), sinon je vous invite à vous rendre sur le wiki de votre distribution pour installer les paquets nécessaires. Rendez-vous dans le dossier contenant l’archive et pratiquez une extraction. Vous pouvez utiliser pour cela la commande :

tar xaf linux-2.6.33.4.tar.bz2

Rendez-vous ensuite dans le répertoire fraichement extrait. La première chose à faire est de vérifier que le dossier est bien propre, qu’aucun fichier inutile n’a été laissé dans l’archive.

make mrproper

Et oui, comme vous pouvez le voir, on fait un ‘make monsieur propre’ :)

Copiez ensuite la configuration actuelle dans le dossier. Cela permet de partir d’une base fonctionnelle. Il faut ensuite mettre le fichier de config à jour.

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

Et c’est maintenant que nous allons préparer notre kernel aux petits oignons. Vous aurez pour cela besoin de la commande lspci, qui affichera le matériel de votre ordinateur, ainsi que de la commande :

hwdetect --modules

qui affichera tous les modules utilisés actuellement sur votre système. Allez, on se lance dans la config :

make menuconfig

Cela vous affichera un magnifique menu :

menuconfig

Premièrement, vous pouvez toujours avoir de l’aide en choisissant l’option Help ou en appuyant sur la touche H. Secondement, les options préfixées de [*] sont compilées en dur dans le kernel, [M] indique que l’option est compilée comme un module.

Commençons par le menu General Setup :

  • Le champs Local Version vous permet de personnaliser le nom du kernel. C’est une option utile si vous voulez faire plusieurs kernel de la même version. Un kernel 2.6.33.4-bluetooth devra avoir -bluetooth dans ce champs.
  • Le menu Kernel compression mode vous permet de choisir l’algorithme de compression du kernel. L’algo LZO permet d’avoir un petit kernel avec les meilleurs performances de décompression.
  • Support for swap permet d’avoir le support du swap, décochez le si vous n’utilisez pas de swap.
  • L’option Initial RAM filesystem permet de profiter d’un kernel modulaire. Je vous laisse lire cet article si vous souhaitez faire un kernel monolithique.
  • Il est intéressant de cocher l’option Optimize for size. Le kernel est alors compilé avec l’option -Os du compilateur plutôt que l’option -O2. Il est résultera un kernel plus petit.

Si vous faites un kernel modulaire, l’option Enable loadable module support doit bien sur être cochée. Passons au menu Processor type and features, c’est ici que nous allons configurer le noyau pour votre processeur :

  • Si vous avez un processeur avec plusieurs cœurs, il faut cocher Symetric multi-processing support. Sinon désactivez le.
  • Choisissez votre famille de processeur dans le menu Processor family.
  • Il est intéressant de compiler un kernel préemptible en choisissant Preemptible kernel dans preemption model.
  • Je vous laisse décocher les options dell laptop support et toshiba laptop support si vous ne possédez pas ces modèles.
  • Reste enfin à configurer la fréquence du timer. L’aide conseille de paramétrer cette option à 1000 hz pour une machine de bureau réactive. Sachez tout de même que certains serveurs seront plus efficaces avec une fréquence plus basse, le processeur subissant moins d’interruptions.

processor

Passons au menu power management and ACPI options :

  • Commencez par désactiver ce dont vous ne vous servez pas. Par exemple, je ne me sers jamais de l’hibernation ou de la mise en veille, je décoche donc Suspend to RAM and standby.
  • Dans CPU frequency scaling, vous pouvez choisir le gouverneur par défaut et surtout décocher les drivers ACPI que vous ne possédez pas.

Dans le menu Bus options, vous pouvez désactiver le support pour le PCI express, l’ISA ou encore le PCMCIA, si vous n’en possédez pas sur votre machine bien sur.

Dans networking support, vous pouvez désactiver à votre guise le support du Wifi, du Wimax, du bluetooth, de l’infrarouge… Si vous n’utilisez pas l’ipv6, vous pouvez également le désactiver dans Networking options/The ipv6 protocol.

C’est dans Device drivers que vous aurez le plus de boulot. C’est dans cette section que sont listés tous les drivers du kernel. Vous pouvez facilement choisir vos pilotes dans les sections network, Sound card, MMC/SD… et Graphic support.

radeon

Pour les plus chevronnés, désactivez toutes les conneries genre support de l’isdn, de la téléphonie, du RAID, des drivers macintosh… La section Staging drivers contient des drivers en développement, genre alpha release (ou pire). Si vous ne possédez aucun matériel dans cette section, désactivez la. Enfin, la section X86 Plateform Specific Device Drivers contient des pilotes généralement pour les portables, pour la gestion des touches spéciales etc. Cochez donc ce qui convient.

Le menu File Systems permet de gérer le support des différents systèmes de fichiers. Personnellement, j’essaye de garder le maximum de compatibilité ici. C’est toujours le système que je ne compile pas que je suis amené à utiliser peu après…

Vous pouvez décochez le menu Virtualisation si vous n’en avez pas l’utilité. Sachez toutefois que les drivers libres récents utilisent la virtualisation avec KVM (Kernel Virtual Machine) pour fonctionner.

N’oubliez pas de sauvegarder votre configuration, et sortez de cet enfer. Nous allons maintenant passer à la compilation. Il suffit pour cela de faire un make, et selon la vélocité de votre processeur, et du nombre de drivers inutiles que vous avez eu la flemme d’enlever dans la configuration du kernel, vous êtes partis pour environ 30 minutes de compilation (sur ma machine, avec un kernel bien configuré et un pentium M @ 1,60 ghz, cela dure entre 25 et 30 minutes, donc avec votre core quad @ 3 ghz, vous aurez à peine le temps de boire un café).

On installe ensuite les modules :

sudo make modules_install

Cela aura pour effet de copier les modules compilés dans /lib/modules/nom_kernel.

Puis on copie le kernel et le system.map dans /boot

sudo cp -v arch/x86/boot/bzImage /boot/vmlinuz-nom_kernel
sudo cp -v System.map /boot/System.map-nom_kernel

Le nom de votre kernel est son numéro de version suivi éventuellement de la variable Local_version que vous avez configuré tout à l’heure. Si vous voulez être sur, vous pouvez regarder dans /lib/modules le nom du dossier créé pour l’installation des modules.

Si vous avez fait un kernel modulaire, il faut créer un ramdisk avec mkinitcpio.

sudo mkinitcpio -k nom_kernel -p /boot/kernel-nom_kernel.img

Vous n’avez plus qu’à éditer votre grub pour rajouter le nouveau kernel.

sudo vim /boot/grub/menu.lst

Il suffit alors de copier l’entrée pour votre kernel courant, et de remplacer par le nouveau généré.

# (1) Arch linux barbuk
title   Arch Linux - 2.6.33.4-barbuk
root    (hd0,1)
kernel  /vmlinuz-2.6.33.4-barbuk root=/dev/disk/by-uuid/9cdc13ca-1793-4baf-a86b-b73074f453d0 ro quiet radeon.modeset=1
initrd  /kernel-2.6.33.4-barbuk.img

Vous n’avez plus qu’à redémarrer votre machine, et profiter de ce kernel aux petits oignons.

Encore debout ?

Les commentaires et le ping sont désactivés