« Précédent
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 :
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.
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.
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
Commentaire(s)
7 Réponses
BertrandP
08/06/10
Milles merci….ça fait 2 heures que je cherche des infos sur les options de compilation du noyau. Je vais tester dans le cadre de la sécurisation d’un nouveau serveur que j’installe dans le Cloud 1&1. Avec ces info je devrais parvenir à quelque chose… en espérant ne pas avoir à réinitialiser la machine. Encore merci.
BarbUk
09/06/10
Mais avec plaisir. Si tu as des questions, n’hésite pas surtout.
dim
27/11/10
Trop bien ton tuto, juste une question :
Ya pas moyen qu’il détecte tout seul les trucs à cocher dans « device driver » ? Vu qu’il existe des commandes qui listent le matos -> lspci et hwdetect –modules
BarbUk
27/11/10
Si bien sur. La commande
make localmodconfig
permet de modifier le .config en ajoutant seulement les modules chargés dans le système.Le problème de cette commande est que dès que tu voudra brancher un périphérique usb (genre une clef ou une webcam) dont le module n’était pas chargé dans le système, le module ne sera pas disponible avec ton nouveau noyau. Donc en gros, si tu veux te faire un noyau propre, branche sur ton pc tout ce que t’as besoin (souris, clef usb, imprimante, baladeur mp3 etc..), et utilise la commande
make localmodconfig
.source : http://kernelnewbies.org/Linux_2_6_32#head-11f54cdac41ad6150ef817fd68597554d9d05a5f
Tom
16/06/11
Salut,
Un petit mot pendant que mon kernel compile. Apparemment ma vieille machine rame un peu, j’en suis déjà à mon troisième café, et je ne sais combien de cigarettes
Donc j en profite pour vous remercier de ce rafraîchissement de mémoire très sympa. La dernière fois que j avais compilé un noyau linux c était en 1999! ça ne me rajeunit pas (et c est grosso modo la même procédure). Par contre j ai commencé par make xconfig, basé sous qt plutôt que sur ncurses comme le menuconfig, mais je suis finalement revenu à ce dernier moins fouilli finalement
Juste une précision pour vos lecteurs utilisant grub2 comme moi, il faut modifier le fichier /etc/default/grub, puis faire un update-grub2 après.
Merci encore et bonne continuation
Gaulthier
29/10/11
Pour ma part je me lance aussi dans une nouvelle compilation de noyau, je vais tenter avec local mod config quand j’aurais tout mes periphériques a portée.
Histoire de voir un peu ce que ca donne Apres tout, je pense pas avoir réellement besoin de recompiler, mais comme beaucoup de gens, et comme le dis un de tes articles, linux c’est marrant, je decouvre des choses, je m’instruit dans un univers autre que celui e wndows
Merci a toi quoi qu’il en soit
Lucas
05/12/11
Merci pour cette explication très claire.
Je me suis personnellement attaché à Archlinux que j’utilise depuis près de 4 mois (seulement)
Et maintenant, en plus d’une distribution légerissime (pekwm & co), j’ai mon propre noyau optimisé pour le p’tit Eeepc!
Merci beaucoup, ça fait plaisir
Bonne continuation !