Catégories
Documents techniques

Compiler un noyau pour Linux "à la main"

Cet article a pour but d’expliquer quelles sont les manipulations de base pour configurer et compiler un noyau à partir des sources. La méthode proposée ici est valable pour de nombreuses distributions différentes puisqu’il s’agit d’une technique très « manuelle ». Bon courage.

Cet article a pour but d’expliquer quelles sont les manipulations de base pour configurer et compiler un noyau à partir des sources. La méthode proposée ici est valable pour de nombreuses distributions différentes puisqu’il s’agit d’une technique très « manuelle ». Bon courage.

1. Introduction

1.1 – Qu’est ce qu’un noyau?

Les logiciels d’un ordinateur sont organisés en « couches » superposées. Lorsque vous réalisez un document, sous OpenOffice.org, par exemple, votre logiciel de traitement de texte repose sur votre système d’exploitation car si c’est OpenOffice.org qui gère la réalisation du document, c’est le système d’exploitation qui gère son affichage à l’écran ou même son « écriture » sur le disque dur. Le noyau est la partie la plus basse de ce système car c’est lui qui gère directement les interactions entre les autres logiciels de votre ordinateur, d’une part, et les matériels physiques qui le composent, d’autre part. En quelque sorte, on pourrait dire qu’il s’agit des fondations de l’édifice.

1.2 – Pourquoi dois-je recomplier mon noyau?

On ne recompile pas un noyau par hasard. En règle générale on le fait lorsqu’on est confronté à certain types de problèmes, en voici quelques exemple :

  • Améliorer les performances d’un système reposant sur un ordinateur peu puissant.
  • Ajouter le support d’un périphérique « exotique »
  • Cela peut être nécessaire pour exécuter certain logiciels.
  • etc.

Un professionnel vous dira toujours : « tant que ça marche il ne faut pas y toucher ».

1.3 – Pré-requis

Afin de mener à bien cette expérience, vous devez avoir à votre disposition un certain nombre de logiciels, en voici la liste:

  • wget pour telecharger, à partir du shell, des fichiers stockés sur des serveurs FTP.
  • gcc pour compiler en C
  • libncurses5-dev librairies nécessaires à la création de l’interface de configuration du noyau
  • modutils et module-init-tools outils de gestion des modules

2. Préparation et configuration du noyau

2.1 – Identifier son matériel

Le noyau étant la couche la plus basse du système d’exploitation, il est indispensable de bien connaître les composants de son ordinateur afin de pouvoir optimiser le noyau pour les exploiter pleinement. Il existe plusieurs manière de repérer les composants d’un d’ordinateur. Tout d’abord au niveau « physique »…

Dans le cas d’un ordinateur récemment acheté, il est possible de s’aider de la facture qui comporte un certain nombre d’informations, s’il s’agit d’un ordinateur portable, on citera aussi l’excellent [Linux on laptops->http://www.linux-laptop.net/] qui recense des astuces de compilation pour un très grand nombre d’ordinateurs portables. Enfin, si vous avez déjà un système d’exploitation d’installé sur votre ordinateur vous disposez nécessairement d’outils vous permettant de récupérer ces informations…

Il existe aussi un certain nombre d’outils pouvant vous ressortir la liste de ces composants.

  • Le Gestionnaire de périphérique sous Ubuntu
  • HardDrake sous Mandrake
  • Il existe aussi un certain nombre de commandes sous GNU/Linux permettant d’afficher des informations sur son matériel.
  • Le gestionnaire de périphérique ou l’excellent logiciel Everest sous Windows
  • « A propos de ce mac » avec Mac OS X

2.2 – Récupérer les sources

La première étape consiste à récupérer les sources du noyau sur le site http://www.kernel.org. En allant sur ce site, repérez le numéro de la dernière version du noyau. À l’heure ou j’écris ces lignes, il s’agit du noyau 2.6.11.7 (repéré de la manière suivante: « The latest stable version of the Linux kernel »). Pour le récupérer dans votre dossier personnel, tapez la commande suivante wget -P ~ ftp://ftp.fr.kernel.org/pub/linux/kernel/v2.6/linux-2.6.11.7.tar.bz2. Vous devriez voir apparaître quelque chose qui ressemble à cela:

jlc@atice:~ $ sudo wget -P ~ ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.11.6.tar.bz2 --20:47:36--  ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.11.7.tar.bz2            => `/usr/src/linux-2.6.11.7.tar.bz2' Résolution de ftp.kernel.org... 204.152.191.37 Connexion vers ftp.kernel.org[204.152.191.37]:21...connecté. Ouverture de session en anonymous...Session établie! ==> SYST ... complété.    ==> PWD ... complété. ==> TYPE I ... complété.  ==> CWD /pub/linux/kernel/v2.6 ... complété. ==> PASV ... complété.    ==> RETR linux-2.6.11.6.tar.bz2 ... complété. Taille: 37,090,316 (non certifiée) 100%[====================================>] 37,090,316    83.56K/s    ETA 00:00 21:00:37 (46.59 KB/s) - `/home/jlc/linux-2.6.11.7.tar.bz2' saved [37,090,316] jlc@atice:~ $

Vous pouvez alors le décompresser avec la commande tar xvjf linux-version.tar.bz2 qui le décompressera dans un sous répertoire de votre dossier personnel appelé linux-2.6.11.7.

Pour simplifier la configuration du noyau, une astuce consiste à se baser sur la configuration existante… Commencez par sauvegarder le fichier de configuration (.config) livré avec les sources que vous avez téléchargé :

cd linux-2.6.11.6 cp .config .config_old

Récupérez ensuite le fichier de configuration existant :

cd /boot cp config-2.6.10-5-386 ~/linux/linux-2.6.11.7/.config 

Il ne vous reste plus qu’à vous placer dans ce dossier et à construire l’interface ncurse avec la commande make menuconfig

cd ~/linux/linux-2.6.11.7/ make menuconfig 

2.3 – Configuration

Lorsque vous ordonnez make menuconfig à l’ordinateur vous lui demandez en réalité de préparer pour vous une interface permettant de configurer les options de votre noyau de manière assez précise. Au premier lancement, quelques minutes seront peut-être nécessaire pour que votre ordinateur ordonne tout cela. À partir du moment où ce menu aura été compilé au moins une fois, son lancement sera sensiblement rapide puisqu’il n’est pas nécessaire de le compiler à chaque lancement. Vous allez donc obtenir ce qui suit…

3 – Configuration et installation

3.1 – Options en dur ou en module?

Un module, à proprement parler, est un morceau de code du noyau qui permet de faire fonctionner un matériel précis. Par conséquent il faut que votre noyau ait accès à chacun des modules correspondants à chacun des périphériques de votre ordinateur pour pouvoir le faire fonctionner correctement. Les modules peuvent soit rester tel quel soit faire partie intégrante du noyau, on dit alors qu’il sont « en dur ». La différence se trouve au niveau des performances de votre ordinateur, la difficulté réside d’ailleurs dans cette nécessité de faire le meilleur des compromis. Si certains modules doivent nécessairement être mis en dur car ils sont utilisés dès les premières phases de l’amorçage de votre ordinateur, d’autres peuvent rester en module pour être chargés à la demande. À vous de voir. Il est généralement préconisé de ne pas mettre en dur les modules des périphériques multimédia comme la carte son, graphique, réseau etc. mais de mettre tout ce qui touche à la gestion des disques et des systèmes de fichiers. Un module en dur se notera [*] ou <*> et, s’il reste à l’état de module, M.

Dans certaines situations l’on peut aussi préférer tout compiler en « dur » afin de désactiver directement dans le noyau la fonction de chargement à chaud des modules et ainsi éviter l’éventualité de compromission du système par du code malicieux. C’est un choix que l’on peut être ammené à faire sur des configurations très sécurisées.

3.2 – Les modules importants

Vous allez trouver ici un descriptif bref des rubriques importantes proposées pour la configuration du noyau. Certaines rubriques manquent à l’appel, il s’agit de celles réservés aux connaisseurs. En cas de doute, et si vous ne trouvez pas d’information auto
ur de vous, laissez la configuration par défaut. De même évitez, autant que possible les modules notés « [EXPERIMENTAL] » sauf si vous savez qu’ils vous sont indispensables.

  • Code maturity level options je vous conseille fortement, dans cette rubrique, soit d’activer le « prompt » des drivers expérimentaux (première case) soit d’activer la sélection des modules reconnus comme ne posant pas de problème de compilation (seconde case). Ceci vous évitera de rencontrer des erreurs lors de la compilation finale de votre noyau. Si, par la suite, vous ne trouvez par un drivers dons vous avez besoin, revenez modifier ces options.
  • Processor type and features vous trouverez dans cette rubrique les informations nécessaires à la configuration du processeur. La majorité des processeurs actuels sont compatible avec le format x86.
  • Power Managment support (..) permet de configurer la gestion de l’énergie, en fonction du bios de votre ordinateur; il vous faudra choisir entre l’ACPI, l’APM ou ces deux méthodes de gestion de l’énergie. Si vous avez un processeur pour ordinateur portable gérant différentes fréquences (Athlon M, Pentium 4 M, Centrino etc.) pensez a activer le CPU Frequency Scaling en dur.
  • Bus option (..) gestion des bus systèmes tel que le PCI, l’ISA etc.
  • Device drivers c’est ici que tout se joue, vous trouverez dans cette rubrique toutes les options nécessaires à la configuration de chacun des périphériques de votre ordinateur. Procédez méthodiquement pour ne rien oublier.
  • File system vous trouverez ici les systèmes de fichiers, pensez à bien activer ce que vous utilisez en particulier si vous avez une installation quelque peu « exotique » (qui à dit XFS?). N’enlevez surtout pas le support de la vfat (système de fichier microsoft) si vous avez des partitions windows ou que vous voulez utiliser des clefs USB.
  • Cryptographic options réglages pour le chiffrement des données – utilisés entre autre pour sécuriser le WiFi et le SSH.

Une fois votre configuration terminée, quittez et sauvegardez.

NOTA: Si votre ordinateur fonctionne bien et que vous ne recompilez votre noyau que pour affiner quelques options, procédez de préférence par étape afin de ne pas vous perdre si vous rencontrez une erreur.

3.3 – Compiler, installer et préparer le chargement des modules

Et voilà, il est temps de passer aux choses sérieuses : une fois la préparation du noyau terminée, il reste à effectuer sa sacro-sainte compilation ainsi que celle des modules qui l’accompagnent :

sudo make bzImage sudo make modules sudo make modules_install

Ces opérations doivent prendre un certain temps, ne vous inquiétez pas tant qu’aucun message d’erreur n’apparaît et ne bloque le processus. Une fois terminé, vous obtiendrez un certain nombres de fichiers qu’il va vous falloir placer au bon endroit…

Tout d’abord, le noyau (vous constaterez qu’il ne s’agit, finalement, que d’un minuscule fichier.

sudo cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.11.7

Copiez aussi le fichier System.map qui contient les informations systèmes et profitez aussi de cette occasion pour sauvegarder votre nouveau fichier de configuration.

 sudo cp System.map /boot/System.map-2.6.11.7 sudo cp .config /boot/config-2.6.11.7 

Enfin, préparez le fichier initrd qui contient tous les modules à charger au démarrage.

sudo mkinitrd -o /boot/initrd-2.6.11.7 /lib/modules/2.6.11.7/

Attention toutefois, l’utilisation de mkinitrd peut varier d’une distribution à l’autre. Consultez le manuel si cela ne fonctionne pas.

4 – Configurer l’amorçage sur le nouveau noyau

4.1 – Configurer GRUB (Exemple d’Ubuntu)

GRUB et un outil récent de chargement de module au démarrage du système. Afin de démarrer automatiquement sur le nouveau noyau il suffit d’éditer son fichier de configuration en lui indiquant où trouver chacun des outils nécessaires au chargement du noyau (tapez vi /boot/grub/menu.lst pour l’éditer) :

 # Option de chargement du noyau 2.6.11.7 title		Noyau fait main, v. 2.6.11.7 root		(hd0,0) kernel		/boot/vmlinuz-2.6.11.7 root=/dev/hda1 ro quiet splash initrd		/boot/initrd-2.6.11.7 savedefault boot 

Nota: pour charger par défaut votre nouveau noyau, vous devez placer le bloc indiqué précédemment en tête de la liste des différentes options.

title correspond au nom affiché dans les option de démarrage –root indique au système quel disque physique est concerné (indiquez le même que celui utilisé par le noyau précédent) –kernel indique au système où trouver le noyau à proprement parler –initrd indique au système où trouver les modules –savedefaults enregistre les paramètres –bootlance l’amorçage de GNU/Linux Redémarrez pour voir ce que ça donne… {{4.2 – Configurer LILO (Exemple de Debian)}} Préparez les liens symboliques: cd / mv vmlinuz vmlinuz.old ln -sf boot/vmlinuz-2.6.X vmlinuz Editez le fichier le configuration de linux loader avec vi /etc/lilo.conf et ajoutez le bloc suivant: default=Linux # Option de chargement du noyau 2.6.11.7 image=/vmlinuz root=/dev/hda1 initrd=/boot/initrd-2.6.11.7 label=Linux read-only # Définition de Linux avec son noyau de secours image=/vmlinuz.old label=LinuxOLD read-only

IMPORTANT: exécutez LILO (lilo) pour prendre en compte les modifications effectuées.

  • image correspond à l’emplacement du vmlinuz
  • root correspond à l’emplacement du disque dur sur lequel vous bootez
  • initrd indique au système où trouver les modules
  • label correspond nom affiché dans les options de démarrage

Redémarrez pour voir ce que ça donne…

5 – Fin de l’installation

5.1 – En cas d’échec

Ne vous inquiétez pas. En fait il est relativement rare de réussir un noyau parfait du premier coup. De toute manière, si vous avez bien suivi cette documentation, vous n’avez rien cassé et vous pourrez toujours redémarrer votre machine avec votre ancien noyau (celui qui ne marchait pas si mal ;-))

5.2 – Revenir à l’ancien noyau

Sous Lilo comme sous Grub il suffit d’afficher le menu de sélection du noyau (en appuyant sur [Echap] par exemple) et de sélectionner l’ancien noyau. Une fois l’ordinateur redémarré à vous de tester une autre configuration et compilation de votre noyau.

5.3 – Effacer un noyau

Si vous avez suivi cette documentation, il n’est pas difficile d’effacer un vieux noyau. Commencez par supprimer tout ce qui ne sert plus dans le répertoire /boot, par exemple, si vous voulez supprimer le noyau 2.4.24 vous pouvez utiliser la commande rm /boot *.2.4.24. Après quoi vous pourrez supprimer les sources de votre répertoire personnel. Pensez a vérifier que vous avez aussi « nettoyé » votre boot loader (Lilo ou GRUB). Soyez méticuleux pour éviter toute catastrophe!

5.4 – Où trouver de l’aide?

Remerciements: Emmanuel Maurin pour ses remarq
ues constructives et Olivier Doiteau pour ses essais.

3 réponses sur « Compiler un noyau pour Linux "à la main" »

Les commentaires sont fermés.