Compiler le noyau

De Lea Linux
Révision datée du 24 octobre 2005 à 10:50 par Oudoubah (discussion | contributions) (maj des liens vers doc lilo, grub et loadlin)
Aller à la navigation Aller à la recherche

Le noyau (kernel) de Linux : le compiler

Le noyau (kernel) de Linux : le compiler
par Jean-Christophe
Où vous apprendrez à compiler votre noyau Linux sans soucis.

Quelques rappels

Le noyau est le coeur du système. C'est lui qui, entre autres, gère la mémoire, contient les pilotes du matériel, ordonne les différentes tâches, gère le support des différents protocoles,...

Le noyau, ou kernel, est composé d'une partie statique, à laquelle on peut greffer des modules. La partie statique sera toujours chargée en mémoire, tandis que les module ne le seront qu'en cas de besoin.

Vous avez besoin d'un nouveau noyau si :

  • vous avez un matériel dont le support a été ajouté dans une nouvelle version du noyau,
  • un trou de sécurité a été découvert dans le noyau actuel, ce problème étant réglé dans une nouvelle version,
  • vous souhaitez toujours avoir le dernier noyau possible :)
  • comme tout bon Geek, vous aimez compiler votre kernel ;)

La plupart du temps, vous n'avez pas réellement besoin de nouveau noyau.

Quel noyau?

Dans un premier temps, pour savoir quel noyau on utilise, il suffit de lancer uname -sr.

Note sur la numérotation des noyaux :
Les noyaux sont numérotés sur 3 nombres x.y.z.

  • Versions stables : le nombre du milieu (y) est pair. Par exemple : 2.4.31 ou 2.6.13.
  • Versions de développement : le nombre du milieu (y) est impair, par exemple 2.5.75. Attention, il n'est pas recommandé d'utiliser un noyau d'une version de développement, car ces noyaux ne sont pas - a priori - stables.

De plus, on peut différencier les sources Vanilla, qui sont les sources non patchées. Les distributions peuvent proposer des noyaux légèrement modifiés, optimisés pour telle ou telle architecture, etc.
Le mieux est peut être d'installer la version du noyau via le système de paquetages de la distribution (mais rien n'empêche d'utiliser les vanilla sources)

Enfin, il faut vérifier que /usr/src/linux est un lien vers le répertoire contenant les sources du noyau à compiler: ln -sf /usr/src/linux-x.y.z /usr/src/linux

Dis-moi qui tu es, je te dirai quoi compiler

Avant de se lancer dans l'aventure, il est important de connaître son matériel, afin de ne pas oublier par exemple le support du controleur IDE sur lequel se trouve le disque !

Pour ne rien oublier, il existe quelques petits outils bien sympathiques. lspci, provenant des pciutils pour voir ce que l'on a sur les ports pci, lsusb, provenant des usbutils, pour savoir ce que l'on a sur les ports usb. Il existe également hwinfo qui peut nous donner pas mal de renseignements sur notre matériel.
Ces petits softs sont disponibles en tant que paquet dans pas mal de distributions, et sont peut être déjà installés.

Une fois que l'on connaît son matériel, on va pouvoir passer à l'étape suivante.

Prérequis

Avant de passer à la suite il faut:

  • avoir l'environnement de développement gcc
  • si on souhaite utiliser l'interface graphique sous X, il faut autoriser l'affichage à root avec xhost +
  • devenir root (donc avoir le droit de faire des bêtises!): su
  • enfin, il faut aller dans le répertoire cd /usr/src/linux

Configuration

Pour configurer le noyau, il y a 4 possibilités:

  • modifier le .config à la main,
  • lancer la commande make config. Dans ce cas, on devra répondre à toutes les questions une par une,
  • lancer la commande make menuconfig. Ici, on va configurer le noyau via une interface graphique en ncurses (mode semi-graphique),
  • lancer la commande make xconfig. L'interface ici sera graphique sous X

Les options

Le moment est venu de choisir vos options.
Si c'est la première fois que vous compilez le noyau, je vous conseille de les passer toutes en revue les unes après les autres, dans l'ordre, afin de voir si elles s'appliquent à vous ou non.

De manière générale, il est bon de modulariser un maximum de choses, mais tout n'est pas possible (enfin... pas simplement :)
Par exemple, vous ne devriez pas mettre en module ce qui vous permet de monter votre partition racine. Si celle-ci se situe sur un disque IDE, ne mettez pas le support IDE en module, de même si elle se situe sur un disque SCSI, ne mettez pas le support SCSI en module. Si votre partition racine est montée par le réseau et NFS (cas des stations diskless par exemple), ne mettez pas le support de la carte réseau et le support NFS en modules.
En effet, les modules sont chargés après le noyau, et si les modules IDE sont sur un disque IDE, il faut d'abord les charger avant de pouvoir accéder au disque, mais pour les charger, il faut avoir accès au disque et donc les avoir chargés avant... vous voyez le cercle vicieux ?
En fait, il est possible de contourner ce problème, mais ce document s'adresse aux débutants...

Tout le reste peut être compilé en modules, c'est à dire carte son, carte réseau (sauf si votre racine est déportée sur un serveur NFS comme dit précédemment), le support ppp (pour internet par modem), le CD-ROM, etc.

Voici ci-dessous les options classiques à utiliser pour une configuration classique. Si rien n'est dit ici à propos d'une option, regardez l'aide ou conservez la valeur par défaut ; vous pouvez aussi répondre 'N' à tous les périphériques que vous ne possédez pas, comme par exemple, IDE/ATAPI TAPE, etc.

Dans le doute, il vaut mieux laisser les options par défaut.

Attention: cette doc a été mise à jour en se basant sur la version 2.6.13 du noyau! Si la version est différente (notamment la branche), il est possible que certaines options n'existent pas ou aient été déplacées.

Code maturity level options

Ca ne coûte rien de répondre Y ici!
Prompt for development and/or incomplete code/drivers: Y
Select only drivers expected to compile cleanly: Y

General setup

Support for paging of anonymous memory (swap): Y
System V IPC: Y
Sysctl support: Y
Pour permettre le hotplug: Support for hot-pluggable devices: Y
Et enfin: Kernel userspace events: Y

Loadable module support

Pour que le noyau puisse charger et décharger les modules selon ses besoins: Enable loadable module support: Y
Module unloading: Y
Automatic kernel module loading: Y

Processor type and features

C'est ici que vous définissez quel est votre type de processeur. Preemptible kernel: Y. Grâce à cette option, le noyau devient "préemptif". Cela permet d'avoir un noyau plus réactif.

Bus options

PCI support: Y
PCI device name database: Y

Executable file format

Kernel support for ELF binaries: Y
Kernel support for MISC binaries: M ou Y

Graphics support

Support for frame buffer devices: Y
A vous de choisir votre carte graphique!

Logo configuration
à vous de voir si vous voulez un beau logo de tux au démarrage!

Memory technologie Device

à voir selon votre matériel!

block devices

Loopback device support: Y

RAM disk support Y ou M si vous comptez utiliser un ramdisk
Initial RAM disk (initrd) support si vous comptez démarrer avec un ramdisk.

Device drivers

Dans la section character devices, il faut mettre en module la gestion de l'agp (/dev/agpart), ainsi que celle de son chipset.
Dans la section ATA/ATAPI/MFM/RLL support, il ne faut pas oublier de mettre Y pour la gestion de la DMA.

SCSI device support

C'est ici que vous pouvez configurer, en plus du SCSI, les lecteurs IOMEGA ZIP sur port parallèle, ainsi que le bus SATA. A partir du noyau 2.6, on n'utilise plus d'interface SCSI pour les graveurs de CD/DVD.

Networking options

Comme d'habitude, on ne garde, pour les pilotes, que ceux du matériel (ARCnet, TokenRing peuvent être désactivés. Ne garder dans l'ethernet que ce qui concerne la carte réseau,...) Si vous ne comptez pas utilisez l'IPv6 (ou si vous vous demandez ce que c'est), vous pouvez le supprimer.

L'IrDA et le Bluetooth peut être désactivé si vous ne l'utilisez pas.

Je vous conseille quand même de garder le PPP

ISDN

Ceci concerne les connexions numéris.

Unix98 PTY

Unix98 PTY support: Y
256 est un bon nombre maximum.

Filesystems

Ici, vous choisissez les systèmes de fichiers dont vous avez besoin (ext2, ext3, éventuellement ReiserFS).

Kernel automounter version 4 support: M
Ne pas oublier de vérifier CD-ROM/DVD Filesystems et DOS/FAT/NT Filesystems

Dans pseudo filesystems, mettre Y à: /proc
Virtual memory file system support

/dev file system support est obsolète et remplacé par udev.

Network File systems n'est utile que si vous montez des systèmes de fichier par le réseau.

Multimedia devices

Ici vous ajoutez vos pilotes pour les cartes radio, ainsi que l'acquisition vidéo (carte TV, webcam,...)

Sound

Ne pas utiliser OSS, mais ALSA.

USB support

Vous pouvez utiliser lsmod pour savoir quel module utiliser (entre EHCI, OHCI et UHCI). Ensuite, c'est à vous de savoir quel matériel vous avez!

Watchdog cards

Si vous vous demandez ce que c'est, c'est que vous n'en avez pas besoin!

Profiling support

Mettre N partout

Kernel hacking

Même si vous ne vous sentez pas l'âme d'un hacker, je vous conseille de mettre Y à
Kernel debugging
Magic SysRq Key

Comme cela, en cas de plantage du système, vous pourrez utiliser les touches magiques pour démonter les partitions et redémarrer "proprement" (sans appuyer sur le bouton reset)

Security options

Vous n'avez sûrement pas besoin de configurer SELinux ou d'autres méthodes de haute sécurité. Donc, un petit N suffit.

Cryptographic options

Les mettre en module ne fait pas de mal.

Library routines

Idem, en module, ça peut éventuellement servir.

La compilation

Pour lancer la compilation du noyau, rien de plus simple. Il suffit de lancer:
make && make bzImage modules_install

La compilation peut être relativement longue.

Dernière étape

Maintenant, on va préparer le système à redémarrer avec le nouveau noyau:
cp arch/architecture/boot/bzImage /boot/kernel-X.Y.Z architecture correspond à votre architecture (i386 pour un système 32bits, x86_64 pour un amd64)
cp System.map /boot/System.map-X.Y.Z

Si le fichier /boot/System.map est un lien, le supprimer, sinon le renommer. Ensuite, nous allons créer le lien suivant:
ln -s /boot/System.map-X.Y.Z /boot/System.map

Autant copier le fichier de configuration du noyau, on ne sait jamais:
cp .config /boot/config-X.Y.Z

Enfin, si vous utilisez un ramdisk au boot, il faut le recréer en lançant la commande suivante:mkinitrd, puis copier l'initrd dans /boot.

Remarque sur initrd :

La plupart des distributions récentes utilisent souvent par défaut un disque RAM initial (initrd) afin de démarrer le système. Ce n'est pas nécessaire en général, sauf si votre système de fichiers racine / a besoin de modules pour être chargé (par exemple, s'il se trouve sur un disque SCSI, et que le support SCSI est en modules). Si vous incluez les modules nécessaires au chargement de votre système de fichiers racine (en répondant Y au lieu de M), vous pouvez vous passer d'initrd.

Il ne reste plus qu'à configurer le gestionnaire de démarrage (grub, lilo ou loadlin). Pour bien le faire, le mieux est de lire la doc sur léa!

Annexe : copies d'écran

make menuconfig donne l'écran suivant :

L'écran suivant contient la liste des sous-menus de configuration.
Déplacez vous avec les flèches, et tapez 'Entrée' pour entrer dans chaque sous-menu.

Linux Kernel v2.2.13 Configuration
------------------------------------------------------------------------------
+------------------------------- Main Menu -------------------------------
| Arrow keys navigate the menu. <Enter> selects submenus --->. |
| Highlighted letters are hotkeys. Pressing <Y> includes, <N> excludes, |
| <M> modularizes features. Press <Esc><Esc> to exit, <?> for Help. |
| Legend: [*] built-in [ ] excluded <M> module < > module capable |
| +---------------------------------------------------------------------+ |
| | Code maturity level options ---> | |
| | Processor type and features ---> | |
| | Loadable module support ---> | |
| | General setup ---> | |
| | Plug and Play support ---> | |
| | Block devices ---> | |
| | Networking options ---> | |
| | SCSI support ---> | |
| | Network device support ---> | |
| | Amateur Radio support ---> | |
| | IrDA subsystem support ---> | |
| | ISDN subsystem ---> | |
| | Old CD-ROM drivers (not SCSI, not IDE) ---> | |
| | Character devices ---> | |
| | Filesystems ---> | |
| | Console drivers ---> | |
| | Sound ---> | |
| | Kernel hacking ---> | |
| | --- | |
| | Load an Alternate Configuration File | |
| | Save Configuration to an Alternate File | |
| | | |
| +---------------------------------------------------------------------+ |
+-------------------------------------------------------------------------+
| <Select> < Exit > < Help > |
+-------------------------------------------------------------------------

Sur les écrans déplacez vous avec les flèches, tapez 'Y' pour include une fonction, 'M' pour l'inclure en tant que module. Tapez '?' ou 'H' pour avoir de l'aide sur la fonction sélectionnée (je vous recommande de lire l'aide de chaque fonction, et si vous ne comprenez pas, prenez la valeur conseillée). Tapez 'Esc' afin de sortir d'un sous-menu.


Après avoir configuré votre noyau, sélectionnez "Save Configuration to an Alternate File", afin d'enregistrer le fichier de configuration et de pouvoir le réutiliser ultérieurement. Enfin, quittez en pressant 'Esc' et enregistrez la configuration.

make xconfig donne la fenêtre suivante :

Ce premier écran contient des boutons qui mènent aux différents sous-menus de configuration :

Pour chaque option, cliquez sur le bouton [Help] afin de lire la documentation de l'option.
Après avoir configuré votre noyau, sélectionnez "Store Configuration to File", afin d'enregistrer le fichier de configuration et de pouvoir le réutiliser ultérieurement. Enfin, quittez en pressant 'Esc', et enregistrez la configuration.


Copyright

Copyright © 06/11/1999, Jean-Christophe Cardot

Creative Commons License
Creative Commons Attribution iconCreative Commons Share Alike iconCreative Commons Noncommercial
Ce document est publié sous licence Creative Commons
Attribution, Partage à l'identique, Contexte non commercial 2.0 :
http://creativecommons.org/licenses/by-nc-sa/2.0/fr/