Compilez votre propre noyau Linux

Kernel LogoCompiler votre propre noyau Linux est la première étape dans l’optimisation des performance de votre système. En le créant avec exactement ce dont vous avez besoin, vous diminuer votre temps de démarrage et votre utilisation mémoire. Ce sera également un bon moyen de prendre en charge des périphériques que le noyau de votre distribution ne gère pas encore. Néanmoins, il vous faudra une connaissance approfondie des capacités de votre ordinateur et des périphériques qu’il contiens. Comme exemple, je prendrais la famille de carte mère Intel DH67 avec un système Debian Squeeze de base correctement installé. Cette famille de carte utilise le nouveau chipset Sandy Bridge pour lequel la partie Ethernet n’est pris en charge que depuis la version 2.6.38 du noyau et la partie graphique la version 3.0.0. Pour pouvoir installer cette Debian Squeeze je fus donc forcé d’ajouter une carte réseau provisoire sur le seul port PCI de la carte (une carte de la famille RTL8139). Veuillez remarquer que certaine version de carte mère de cette famille ont un pont PCI-Express vers PCI non supportés (comme sur la DH67GD-B3, alors qu’il fonctionne sur une DH67BL-B3), vous pourriez donc avoir besoins d’une carte PCI-Express si vous êtes dans ce cas. Une autre possibilité pour installer le système de base et le nécessaire pour compiler votre propre noyau est de mettre votre disque dur dans un autre ordinateur avec des périphérique plus ancien et bien pris en charge. Notez que si vous procédez avec ce tutoriel sans modification vous devrez être super-utilisateur (root) en quasi-permanence. Par conséquent je recommande de vous logger en root maintenant soit avec “su” soit avec “sudo /bin/bash”. Tout ceci est complètement fonctionnel sur les distributions basés sur Debian (incluant Ubuntu).

Les seuls paquets que vous devrez installer sur un système Debian pour compiler un nouveau noyau sont build-essential et libncurses5-dev :

apt-get install build-essential libncurses5-dev

build-essential est un méta-paquet qui installera gcc, g++ (inutile pour le noyau), libc6-dev et make. libncurses5-dev vous permettra d’utiliser l’interface ncurses pour configurer vos options de compilation (optionel mais chaudement recommandé). Vous remarquerez que contrairement à la plupart des paquets source sous les systèmes Linux, autoconf, automake et libtool ne sont pas nécessaire pour le noyau. Si vous n’utilisez pas une Debian ils vous faudra l’outil GNU Make, le compilateur C GNU et les en-têtes de la GNU libc6 et de la bibliothèque NCurses. LA compilation peut fonctionner avec des outils non GNU mais ce sera plus risqué et requièrera une procédure différente de celle donné ici. Néanmoins, les outils BSD sont connu pour bien fonctionner. A présent il faut télécharger le code source du noyaux Linux. Le mieux est de télécharger la dernière version, à moins que vous ne soyez un paranoïaque de la stabilité et / ou de la sécurité. Si c’est votre cas, vous pourrez choisir un noyau à quatre nombres. Je m’explique : les nouvelles versions sont numérotés x.y.z alors que les révisions de sécurité ont un nombre supplémentaire x.y.z.r. Remarquez qu’il n’y a pas de gros changement dans les séries 3.0.0 du noyau. Le changement de version majeur a seulement été adopté pour fêter le 20ème anniversaire de Linux. C’est donc pour les packageurs une série 2.6. Vous trouverez les archives du code source du noyau ici : http://www.kernel.org ou sur des miroir (la liste des miroir est disponible ici : http://mirrors.kernel.org/). Pour la carte mère de mon exemple je recommande la version 3.0.4 du noyau. Les commandes seront donc :

# assurez vous d'être super-utilisateur avant de procéder
cd /usr/src
wget "ftp://ftp.free.fr/pub/linux/kernel/v3.0/linux-3.0.4.tar.bz2"
tar -xvf linux-3.0.4.tar.bz2
ln -sv linux-3.0.4 linux

Maintenant expliquons ceci. Nous allons dans le répertoire /usr/src ou de nombreux module externe du noyau s’attendent à trouver le code source (par ex. les pilotes propriétaire NVidia). Nous téléchargeons ensuite l’archive du code source du noyau et l’extrayons. La dernière ligne est un lien de compatibilité vers la version du noyau que nous utiliserons (ceci suppose que ce sera notre version par défaut du noyau) pour permettre la compilation de modules externes (certains paquet peuvent également avoir besoin d’accéder au code source du noyau pour se compiler). Si vous n’envisagez pas de compiler autre chose vous pouvez placer en toute sécurité les sources de votre noyau dans un répertoire personnel et ne pas être en super-utilisateur (sautez les deux premières lignes).&

Nous allons maintenant aborder le moment délicat… vous allez devoir configurer votre noyau en fonction de ce que vous avez besoin. Il existe des moyens pour obtenir des informations sur votre système : des commandes comme lspci et lsmod vous donnerons respectivement les noms des périphériques de la cartes mère et lsmod la liste des modules que le noyau actuel utilise (mais vous pourriez avoir besoin de plus). Le plus utile est lsmod mais il ne vous aidera pas si votre noyau actuel ne prend pas en charge une partie du matériel ou si une partie de ce matériel n’est pas géré par des modules. Pour cette seconde raison, je recommande de commencer ainsi :

cd /usr/src/linux
make mrproper
cp /boot/config- ./.config
lsmod > hard-infos.txt
echo > "--------------------------------------------------------------------" >> hard-infos.txt
lspci >> hard-infos.txt
#vous devriez imprimer le fichier hard-infos.txt maintenant ou l'afficher sur un autre écran à l'aide de ssh ou d'une nouvelle console (alt+f1 à alt+f6 pour changer de console)
make menuconfig

La ligne “make mrproper” nettoiera en profondeur l’arborescence du code source et toute configuration prédéfinie. Si vous voulez conserver une ancienne configuration pour recompiler le noyau, remplacez seulement mrproper par clean. La ligne cp nous permet de récupérer la configuration réelle du noyau en cour d’utilisation. Ceci est une bonne idée pour permettre de récupérer des options de configurations spécifique à votre distribution. Toutes les lignes se terminant avec hard-infos.txt servent à créer un fichier contenant toutes les informations utiles dont vous pourriez avoir besoin sur votre matériel. Dernier point mais non des moindres la ligne make menuconfig vous montrera le menu de configuration du noyau après un court moment de compilation.

À présent pas de secret, prenez votre temps et visitez tout les menus. Vous aurez besoin d’environ deux heures de torture cérébrale (et d’un niveau correct d’anglais) pour configurer ça correctement et en profondeur. Si vous ne comprenez pas une option de configuration essayez le bouton “Help” ou faite une recherche avec votre moteur de recherche préféré. Si vous ne comprenez toujours pas, laissez la valeur présélectionné. Voici quelques conseils :

  • Dans “Processor type and feature” choisissez le processeur le plus proche de celui que vous avez. En fonction de votre architecture 64 bits ou 32 bits (ou une architecture non Intel) la liste changera en fonction de ce qu’il est possible pour vous (mais pas forcement fonctionnel). En cas de doute, choisissez l’option commençant par “Generic”.
  • Pour de meilleurs performances c’est une bonne chose de basculer tout les modules des périphérique dont vous avez besoin dans leur version intégré. Ceci dit vous perdrez en flexibilité de telle sorte que le noyau que vous obtiendrez sera spécifique à votre carte mère et aux périphériques qui lui sont associés . Si vous changez de matériel, il vous faudra un noyau générique (par ex. celui de votre distribution). [ ] signifie non compilé (désactivé), [M] compilé sous forme de module et [*] compilé comme intégré dans le noyau central (généralement appelé vmlinuz- dans le répertoire /boot. Quelque fois vous aurez <>, ou < *> au lieu de [ ], [M] ou [*] : cela signifie que cette option permettra l’accès à d’autres options soit dans un autre menu soit dans un sous-menu de cette option. Attention, n’essayez jamais de tout mettre en intégré, le noyau serait trop gros et serait incapable de démarrer. Quelque fois vous n’arriverez pas à faire passer des modules en intégré. Ceci s’explique par des problème de dépendances : vous ne pouvez pas intégrer des modules qui dépendent d’un autre module. Il vous faudra d’abord faire passer le module parent en intégré. C’est pourquoi je recommande deux passe pour faire cette configuration.
  • Pour savoir quel périphérique vous devrez activer dans le noyau le fichier hard-info.txt vous fournira une bonne aide. La partie lsmod vous donnera le nom des modules. Dans la configuration le bouton “Help” vous donnera des information sur l’option. Vous trouverez à la fin de la description une ligne commençant par ceci : “Symbol:”. Ce qui suit est soit le nom du module soit une partie du nom (il peu y avoir un préfixe commun dans certains sous-menus).
  • Je pense que c’est une bonne idée de laisser la partie USB inchangé. De cette façon tout les périphérique USB que vous pourriez brancher seront reconnu correctement et le module correspondant chargé à la volée.
  • Même si vous n’avez pas de périphériques SCSI, n’essayez pas de désactiver le sous-système SCSI car toutes les technologies de disque dur (ou lecteur CD-ROM) utilisent une émulation SCSI depuis les séries 2.6 du noyau. Autrement vous ne pourriez pas démarrer.
  • La partie “network feature” est de loin la plus complexe. Il est sure de faire passer les modules dans leurs versions intégrés mais je ne recommande pas de faire le moindre changement a moins que vous sachiez exactement ce que vous faites.
  • Si vous projetez de compiler un noyaux pour un serveur dans une zone critique en terme de sécurité ou de stabilité, vous devriez désactiver toutes fonctionnalités expérimentale. Néanmoins,certains périphériques récent pourrait être inutilisable.
  • Si vous avez la chance d’avoir une carte mère de la famille Intel DH67 vous pouvez directement télécharger mon fichier .config (75 KB) et sauter la configuration… Si vous êtes vraiment feignant vous pouvez même télécharger un version précompilé (30.2 MB). Décompressez seulement le fichier depuis votre répertoire racine et sautez le prochain paragraphe. Attention : ces deux fichiers sont pour des cartes mères de la série Intel DH67 SEULEMENT et sans matériel additionnel à l’exception d’éventuels périphériques USB. Cela ne fonctionnera pas sur tout autre carte mère.

Quand la configuration est effectué, vous pouvez lancer la compilation. Tapez simplement la commande “make” pour commencer. Ceci prendra un certain temps donc vous pourrez prendre une pause bien mérité. Si la compilation échoue (dans quelques rare cas) cela signifie que quelque chose ne va pas avec votre configuration. Une fois la compilation effectué sans erreur, il vous faudra installer le fraîchement compilé noyau correctement de la manière suivante (je suppose que vous êtes super-utilisateur et dans le répertoire source de votre noyau) :

make modules_install
cp -fv arch/x86_64/boot/bzImage /boot/vmlinuz-3.0.4
cp -fv .config /boot/config-3.0.4
cp -fv System.map /boot/System.map-3.0.4
mkinitramfs -o /boot/initrd.img-3.0.4 3.0.4

La première ligne installera les modules dans une zone prédéfinie et correcte de la hiérarchie de fichier (ie. /lib/modules/). La seconde ligne installera le noyau lui-même mais peut changer si vous n’avez pas une architecture Intel ou AMD 64 bits. Dans ce cas, vous devrez remplacer x86_64 avec le bon répertoire correspondant à votre architecture. Les lignes suivantes copies les fichiers nécessaire au chargeur de démarrage et au noyau pour démarrer correctement. Notez que si vous avez fait une configuration correcte sans modules (excepté l’USB) la commande mkinitramfs ne sera pas nécessaire (sauf si vous avez un clavier USB). mkinitramfs crée une l’image d’un disque RAM monté par le noyau lui permettant de trouver les modules nécessaire au démarrage avant que le système de fichier racine ne soit monté.

Maintenant il ne reste plus qu’a rendre le nouveau noyau bootable. Malheureusement, la procédure et/ou les fichiers de configuration peuvent être très différents en fonction de votre distribution. Si votre distribution est basé sur Debian c’est toutefois très simple. Lancez juste :

update-grub2

Cette commande générera un nouveau jeu de fichiers de configuration pour Grub et réinstallera le chargeur de démarrage. Le noyau par défaut sera le plus récent (par date de modification) du répertoire /boot. Des entrée de menu seront en principe généré pour tout autre système d’exploitation installé. Même si votre noyau est complètement fonctionnel, je recommande de conserver un noyau générique provenant de votre distribution en cas de problème ou de modification de votre matériel.

Si malgré l’avertissement précédant vous avez choisi de désinstaller le noyau de votre distribution, ou si vous avez besoin d’en-tête du noyau à jour vous devriez installer les en-tête de vôtre noyau Linux de manière à pouvoir compiler d’autre choses (la plupart des paquets source en auront besoin). Soyez certain d’avoir désinstallé toutes versions précédente des en-têtes du noyau avant de continuer avec les instructions qui vont suivre. Sur Debian:

apt-get remove linux-headers-2.6

Soyez attentif au fait que la fin du nom du paquet peut changer (2.6) en fonction de la version de Debian que vous utilisez : celle-ci est pour la Squeeze seulement. Veuillez le modifier en conséquences. Pour installer les en-têtes du noyau correctement vous devez saisir les lignes suivante dans une console :

make headers_check
make INSTALL_HDR_PATH=dest headers_install
find dest/include \( -name .install -o -name ..install.cmd \) -delete
#vous devez être super-utilisateur pour la ligne suivante
cp -rv dest/include/* /usr/include

La première ligne ferra un recensement des fichiers à installer et préparera un script pour la future installation. La seconde ligne installera les fichiers nécessaire dans le sous-répertoire “dest”. La ligne “find” effacera certains fichiers inutiles et la ligne “cp” les copiera à l’endroit attendu par les paquet sources habituel.