« Compiler le noyau » : différence entre les versions

De Lea Linux
Aller à la navigation Aller à la recherche
(Mise à jour complète de l'article)
(balises code)
 
(49 versions intermédiaires par 13 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
[[Category:Configurer votre noyau]]
[[Catégorie:Noyau et modules]]
= Le noyau (kernel) de Linux : le compiler =


<div class="leatitre">Le noyau (kernel) de Linux : le compiler</div><div class="leapar">par Jean-Christophe</div><div class="leadesc">Où vous apprendrez à compiler votre noyau Linux sans soucis.</div>
= Compiler le noyau =
 
par Jean-Christophe
 
Où vous apprendrez à compiler votre noyau Linux sans soucis.</div>


== Quelques rappels ==
== 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 est le cœur du système. C'est lui qui fait l'interface entre vos applications et votre matériel. Par exemple, il gère la mémoire, donne l'ordre d'exécution des tâches sur le(s) processeur(s), interagit avec vos périphériques via les pilotes matériels (souris, claviers, etc), s'occupe du réseau, ...


Le noyau, ou kernel, est composé d'une partie statique, à laquelle on peut greffer des modules.
Le noyau (<em>kernel</em> en anglais) est composé d'une partie statique à laquelle on peut dynamiquement greffer des <em>modules</em>. La partie statique est utilisée lors du démarrage de votre ordinateur et sera toujours chargée en mémoire, tandis que les modules peuvent être chargés seulement une fois la machine démarrée et uniquement en cas de besoin.
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 : ==
== Pourquoi Compiler son noyau ? ==


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,
* 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,
* 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 disposer d'une fonctionnalité qui n'est pas encore dans la branche principale du noyau (par exemple ajouter le support du temps réel afin de réduire les temps de latences d'une carte son, pour faire de la musique).
* vous souhaitez toujours avoir le dernier noyau possible :)
* vous souhaitez toujours avoir le dernier noyau possible :)
* comme tout bon Geek, vous aimez compiler votre kernel ;)
* comme tout bon Geek, vous aimez compiler votre kernel ;)


'''''La plupart du temps, vous n'avez pas réellement besoin de nouveau noyau.'''''
La plupart du temps, vous n'avez pas réellement besoin d'un nouveau noyau. Il serait suffisant de rester à jour avec votre distribution puisque celle-ci s'occupe des logiciels qui ont des problèmes de sécurité ou des bugs.


== Quel noyau? ==
== Quel noyau compiler ? ==


Dans un premier temps, pour savoir quel noyau on utilise, il suffit de lancer <tt>uname -sr</tt>.
Dans un premier temps, pour savoir quel noyau vous utilisez, il suffit de faire <span class="code">uname -sr</span>. Vous devriez voir apparaître quelque chose du genre: <tt>Linux 2.6.15</tt>.


'''Note sur la numérotation des noyaux :'''<br />Les noyaux sont numérotés sur 3 nombres x.y.z.
<div class="note">Les noyaux sont numérotés depuis le 2.6.11 sur 4 nombres w.x.y.z. Ce dernier numéro est facultatif, il représente la correction d'un bug important ne pouvant attendre la prochaine version. Le plus souvent ce sont des problèmes de sécurité ou des bugs qui altèrent les données. Il est aussi à noter que la différenciation stable/instable via le numéro de sous-version pair/impair a été abandonnée au profit d'un modèle de développement plus souple. Le noyau continue constamment à évoluer en fusionnant des branches plus expérimentales de temps à autres.</div>


* Versions stables : le nombre du milieu (y) est pair. Par exemple : 2.'''4'''.31 ou 2.'''6'''.13.
On peut différencier les sources [http://www.kernel.org Vanilla], qui sont les sources stables et celles que peuvent proposer les distributions avec des noyaux légèrement modifiés, optimisés pour telle ou telle architecture. Le mieux est peut-être d'installer la version du noyau qui correspond à votre système en le prenant parmi les paquetages fourni par votre distritibution (mais rien n'empêche d'utiliser les ''vanilla sources''). Quoiqu'il en soit, voici les différentes manières de rapatrier les sources de votre noyau:
* 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 [http://www.kernel.org 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.<br/> 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'')
* '''kernel.org''': Allez sur [http://www.kernel.org kernel.org] et téléchargez les dernières sources du noyau (allez sur ''F'' comme ''full'').


Enfin, il faut vérifier que <tt>/usr/src/linux</tt> est un lien vers le répertoire contenant les sources du noyau à compiler:
* '''Mandriva''': <span class="code"># urpmi kernel-headers kernel-source</span>
<code>ln -sf /usr/src/linux-x.y.z /usr/src/linux</code>


== Dit-moi qui tu es, je te dirai quoi compiler ==
* '''Fedora''': <span class="code"># yum install kernel-source</span>


Avant de se lancer dans l'aventure, il est important de connaitre son matériel, afin de ne pas oublier par exemple le support du controleur IDE sur lequel se trouve le disque!
* '''Debian''': <span class="code"># apt-get install kernel-headers-$(uname -r) kernel-source-$(uname -r)</span>


Pour ne rien oublier, il existe quelques petits outils bien sympathiques.
* '''Kubuntu''': <span class="code"># apt-get install linux-headers-N°_de_noyau linux-source-$(uname -r)</span>
''lspci'', provenant des [http://http://atrey.karlin.mff.cuni.cz/~mj/pciutils.shtml pciutils] pour voir ce que l'on a sur les ports pci,  ''lsusb'', provenant des [http://www.linux-usb.org/ usbutils], pour savoir ce que l'on a sur les ports usb.
Il existe également [ftp://ftp.iqchoice.com/pub/people/rail/gmso/ hwinfo] qui peut nous donner pas mal de renseignements sur notre matériel.<br/>
Ces petits softs sont disponibles en tant que paquet dans pas mal de distributions, et sont peut être déjà installés.<br/>


Une fois que l'on connait son matériel, on va pouvoir passer à l'étape suivante.
* '''Slackware''': <span class="code"># installpkg /où_est/kernel-source-2.6.x.tgz /où_est/kernel-headers-2.6.x.tgz</span>


== Prérequis ==
* '''Gentoo''': <span class="code"># emerge gentoo-sources</span> (ou vanilla-sources, ou suspend2-sources, etc.)


Avant de passer à la suite il faut:
== Dis-moi qui tu es, je te dirai quoi compiler ==
* avoir l'environnement de développement <tt>gcc</tt>
* si on souhaite utiliser l'interface graphique sous X, il faut autoriser l'affichage à ''root'' avec <code>xhost +</code>
* devenir ''root'' (donc avoir le droit de faire des bêtises!): <code>su</code>
* enfin, il faut aller dans le répertoire <code>cd /usr/src/linux</code>


== Configuration ==
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 configurer le noyau, il y a 4 possibilités:
Pour ne rien oublier, il existe quelques petits outils bien sympathiques.
* modifier le <tt>.config</tt> à la main,
''lspci'', provenant des [http://atrey.karlin.mff.cuni.cz/~mj/pciutils.shtml pciutils] pour voir ce que l'on a sur les ports pci,  ''lsusb'', provenant des [http://www.linux-usb.org/ usbutils], pour savoir ce que l'on a sur les ports usb.
* lancer la commande <code>make config</code>. Dans ce cas, on devra répondre à toutes les questions une par une,
Il existe également [ftp://ftp.iqchoice.com/pub/people/rail/gmso/ hwinfo] qui peut nous donner pas mal de renseignements sur notre matériel. Pour découvrir plus en détail votre matériel, allez voir l'[[Hardware-hard plus-matos|article complet]] sur léa. Ces petits softs sont disponibles en tant que paquet dans pas mal de distributions, et sont peut être déjà installés.
* lancer la commande <code>make menuconfig</code>. Ici, on va configurer le noyau via une interface graphique en ncurses (mode semi-graphique),
* lancer la commande <code>make xconfig</code>. L'interface ici sera graphique sous X


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


Le moment est venu de choisir vos options. <br />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.
== Prérequis ==


De manière générale, il est bon de modulariser un maximum de choses, mais tout n'est pas possible (enfin... pas simplement :) <br />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. <br />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 ? <br />En fait, il est possible de contourner ce problème, mais ce document s'adresse aux débutants...<br/>
Avant de passer à la suite il faut:
* avoir l'environnement de développement <tt>gcc</tt>, <tt>make</tt>, ...
* avoir les fichiers de développement des bibliothèques que l'on utilisera pour faire la configuration (ncurses, tcl/tk, Gtk, Qt, ...).
* pouvoir passer root pour installer le noyau (à la fin de la compilation)


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. <br/>
== Configuration ==


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.<br/>
Une fois que vous avez téléchargé l'archive des sources ou simplement installé le paquetage de votre distribution avec les sources du noyau, il est temps de passer à la configuration du noyau pour qu'il corresponde à votre ordinateur.


Dans le doute, il vaut mieux laisser les options par défaut.<br/>
=== Préparer les sources ===


''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.
Deux possibilités:
* Si vous avez téléchargé l'archive sur kernel.org, décompressez l'archive quelque part dans votre répertoire principal (par exemple, je les décompresse habituellement dans <tt>~/devel/kernel/</tt>).


==== Code maturity level options ====
* Si vous avez récupéré le paquetage via votre distribution, donnez les droits nécessaires pour que vous puissiez lire/écrire en tant qu'utilisateur.


Ca ne coûte rien de répondre Y ici!<br/>
Pour la suite, nous assumons que vous vous serez positionné à la racine des sources du noyau.
<code>Prompt for development and/or incomplete code/drivers</code>: Y<br/>
<code>Select only drivers expected to compile cleanly</code>: Y


==== General setup ====
=== Les outils de configuration ===


<code>Support for paging of anonymous memory (swap)</code>: Y<br/>
Trois interfaces de configuration sont disponibles, choisissez l'une d'elle et passez à la suite.
<code>System V IPC</code>: Y<br/>
<code>Sysctl support</code>: Y<br/>
Pour permettre le hotplug:
<code>Support for hot-pluggable devices</code>: Y<br/>
Et enfin:
<code>Kernel userspace events</code>: Y


==== Loadable module support ====
Il est a noter que chacune de ces interfaces a besoin des fichiers de développement correspondant à la bibliothèque qu'elle utilise (ncurses, Qt, Gtk+). N'oubliez, donc, pas d'installer les paquetages correspondant pour les utiliser.


Pour que le noyau puisse charger et décharger les modules selon ses besoins:
==== L'interface ncurses (mode semi-graphique) ====
<code>Enable loadable module support</code>: Y<br />
<code>Module unloading</code>: Y<br/>
<code>Automatic kernel module loading</code>: Y<br/>


==== Processor type and features ====
Tapez : <span class="code">make menuconfig</span>
<div align="center">
[[Image:kernel26-menuconfig.png]]
</div>


C'est ici que vous définissez quel est votre type de processeur.
==== L'interface Qt (mode graphique) ====
<code>Preemptible kernel</code>: Y. Grâce à cette option, le noyau devient "préemptif". Cela permet d'avoir un noyau plus réactif.


==== Bus options ====
Tapez: <span class="code">make xconfig</span>
<div align="center">
  [[Image:kernel26-xconfig.png]]
</div>


<code>PCI support</code>: Y<br/>
==== L'interface Gtk+(mode graphique) ====
<code>PCI device name database</code>: Y<br/>


==== Executable file format ====
Tapez: <span class="code">make gconfig</span>
<div align="center">
  [[Image:kernel26-gconfig.png]]
</div>


<code> Kernel support for ELF binaries</code>: Y<br/>
=== Les options disponibles ===
<code> Kernel support for MISC binaries</code>: M ou Y


==== Graphics support ====
Les options correspondent à des fonctionnalités que vous pouvez activer/désactiver dans le noyau suivant vos besoins. Elles sont organisées suivant différentes ''sections'' et ''sous-sections'', nous allons ici décrire les principales sections qui existent et en donner une brêve description pour vous donner une idée des options qu'elles peuvent contenir.


<code>Support for frame buffer devices</code>: Y<br/>
'''Note''': Il est important de noter que d'une version à l'autre du noyau, les options, sous-sections ou même les sections peuvent changer, mais l'idée générale reste conservée.
A vous de choisir votre carte graphique!


'''Logo configuration'''<br/>
==== Les options section par section ====
à vous de voir si vous voulez un beau logo de tux au démarrage!
* '''<tt>Code maturity level options</tt>''': Permet de cacher ou de faire apparaître les options qui sont encore en développement et donc considérées comme instables (souvent utile de dire 'oui' ici si l'on veut pouvoir profiter des dernières avancées du noyau).
* '''<tt>General setup</tt>''': Ensemble d'options générales sur votre système (sauf si vous voulez compiler pour des architectures très particulières, vous pouvez le laisser tel quel).
* '''<tt>Loadable module support</tt>''': Options concernant la gestion des modules (le défaut est presque toujours correct pour une utilisation normale).
* '''<tt>Block layer</tt>''': Les entrées/sorties sur votre carte-mère (inutile d'y toucher).
* '''<tt>Processor type and features</tt>''': Options relatives au(x) processeur(s): type (x86, Sparc, ...), hyper-thread, dual-core, SMP, etc.
* '''<tt>Power management options (ACPI, APM)</tt>''': Options concernant l'économie d'énergie, la mise en veille et l'ACPI/APM.
* '''<tt>Bus options (PCI, PCMCIA, EISA, MCA, ISA)</tt>''': Gestion de tous les endroits où vous pourriez enficher des cartes (PCI, PCMCIA, ISA, etc).
* '''<tt>Executable file formats</tt>''': La gestion des fichiers exécutable (Le suppport ELF doit toujours être à 'Y').
* '''<tt>Networking</tt>''': Options concernant les protocoles réseau gérés par votre noyau (le défaut est bien souvent suffisant, mais jetez y un coup d'oeil à tout hasard).
* '''<tt>Device Drivers</tt>''': Options concernant tous les pilotes matériel (c'est bien souvent ici que l'on passe le plus de temps).
* '''<tt>File systems</tt>''': Options concernant les systèmes de fichiers gérés par votre noyau (vous aurez à y jeter un coup d'oeil).
* '''<tt>Instrumentation Support</tt>''': Option de profilage du noyau (inutile de l'activer).
* '''<tt>Kernel hacking</tt>'''; Options de déboguage du noyau (inutile de l'activer sauf si vous avez des envies particulières).
* '''<tt>Security options</tt>''': Options concernant le modèle de sécurité de votre noyau (le défaut est suffisant)
* '''<tt>Cryptographic options</tt>''': Algorithmes cryptographiques pouvant être implantés dans le noyau (le défaut est suffisant).
* '''<tt>Library routines</tt>''': Bibliothèques communes du noyau (le défaut est suffisant)


==== Memory technologie Device ====
=== Positionner les options ===


à voir selon votre matériel!
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 en lisant l'aide qui y est attachée, dans l'ordre, afin de voir si elles s'appliquent à vous ou non.


==== block devices ====
Dans l'outil de configuration du noyau, chaque question attend une réponse:
<code>Loopback device support</code>: Y<br/>
* 'oui' (<span class="code">Y</span>),
<code>RAM disk support</code> Y ou M si vous comptez utiliser un ramdisk<br/>
* 'non' (<span class="code">N</span>)
<code>Initial RAM disk (initrd) support</code> si vous comptez démarrer avec un ramdisk.
* ou éventuellement 'module' (<span class="code">M</span>) pour rendre la fonctionnalité chargeable dynamiquement.  


==== Device drivers ====
De manière générale, il est bon de modulariser les fonctionnalités qui ne servent pas en permanence (lecteur de CD, carte réseau, clefs USB, ...), mais tout n'est pas possible (enfin... pas simplement :).


Dans la section <code>character devices</code>, il faut mettre en module la gestion de l'agp (<code>/dev/agpart</code>), ainsi que celle de son chipset.<br/>
Par exemple, vous ne devriez pas mettre en module ce qui est utilisé lors du démarrage de votre ordinateur (pilotes des disques-durs IDE, système de fichiers que vous utilisez pour votre partition <tt>/</tt>, ou encore le support réseau si votre partition racine est montée par le réseau et NFS dans le cas des stations diskless par exemple, etc).  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 grâce à <tt>initrd</tt>, mais cela dépasserait l'ambition de ce document...
Dans la section <code>ATA/ATAPI/MFM/RLL support</code>, il ne faut pas oublier de mettre Y pour la gestion de la DMA.


==== SCSI device support ====
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, ...


C'est ici que vous pouvez configurer, en plus du SCSI, les lecteurs IOMEGA ZIP sur port parallèle, ainsi que le bus SATA.
Voici ci-dessous les options '''classiques''' à utiliser pour une configuration standard. 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.
A partir du noyau 2.6, on n'utilise plus d'interface SCSI pour les graveurs de CD/DVD.


==== Networking options ====
Quoi qu'il arrive, dans le doute, il vaut mieux laisser les options par défaut.


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,...)
== La compilation ==
Si vous ne comptez pas utilisez l'IPv6 (ou si vous vous demandez ce que c'est), vous pouvez le supprimer.<br/>


L'IrDA et le Bluetooth peut être désactivé si vous ne l'utilisez pas.<br/>
Pour lancer la compilation du noyau, rien de plus simple, il suffit de lancer : <span class="code">make</span>.


Je vous conseille quand même de garder le <code>PPP</code>
La compilation peut être relativement longue suivant votre type de machine. Pour ceux qui possèdent un multi-processeurs, un processeur hyperthread ou un multi-core, vous pouvez taper: <span class="code">make -j 4</span>. Cela permet de paralléliser la compilation sur 4 processus.


==== ISDN ====
== Installation ==


Ceci concerne les connexions numéris.
On va à présent installer le noyau sur le système pour pouvoir démarrer dessus au prochain reboot. Toujours dans le même répertoire, tapez simplement: <span class="code">su -c 'make modules_install && make install'</span>.  


==== Unix98 PTY ====
Le système va vous demander votre mot de passe root puis va lancer l'installation. En effet, la phase d'installation requière des droits de root (contrairement à toutes les phases précédentes). Et voilà, il ne reste plus qu'à configurer le gestionnaire de démarrage ([http://lea-linux.org/cached/index/Admin-admin_boot-grub.html grub], [http://lea-linux.org/cached/index/Admin-admin_boot-LILO.html lilo] ou [http://lea-linux.org/cached/index/Admin-admin_boot-loadlin.html loadlin]).


<code>Unix98 PTY support: Y</code><br/>
<b>Note:</b> Vous pouvez aussi de temps à autre faire un peu de ménage dans les répertoires /boot/ et /lib/modules/. Mais pensez <b>TOUJOURS</b> à conserver au moins un noyau dont vous êtes sûr qu'il démarre lorsque vous n'avez pas encore testé à fond le noyau que vous venez de compiler.
256 est un bon nombre maximum.


==== Filesystems ====
== Trucs & Astuces ==


Ici, vous choisissez les systèmes de fichiers dont vous avez besoin (ext2, ext3, éventuellement ReiserFS).<br/>
=== Le fichier <tt>.config</tt> ===


<code>Kernel automounter version 4 support</code>: M<br/>
Toute votre configuration noyau est en fait stockée dans le fichier <tt>.config</tt>. Si vous téléchargez un autre noyau et que vous placez votre fichier <tt>.config</tt> dans le répertoire racine des sources vous n'aurez pas à tout refaire, alors n'oubliez pas de le sauvegarder précieusement (ailleurs que dans les sources).
Ne pas oublier de vérifier <code>CD-ROM/DVD Filesystems</code> et <code>DOS/FAT/NT Filesystems</code> <br/>


Dans <code>pseudo filesystems</code>, mettre Y à:
=== Personnaliser un noyau ===
<code>/proc</code><br/>
<code>Virtual memory file system support</code><br/>


<code>/dev file system support</code> est obsolète et remplacé par <code>udev</code>.
Il est possible de personnaliser le nom de votre noyau en lui ajoutant un champ extra-version. Pour cela, avant de lancer la compilation, éditez le fichier <tt>Makefile</tt> qui se trouve à la racine des sources et renseignez le champ <tt>EXTRAVERSION</tt> avec un texte qui décrit votre extra-version (par exemple <tt>EXTRAVERSION = -debug</tt> ou bien <tt>EXTRAVERSION = -production</tt>, ...).


<code>Network File systems</code> n'est utile que si vous montez des systèmes de fichier par le réseau.
=== Patcher un noyau ===


==== Multimedia devices ====
Patcher un noyau requière de se placer  à la racine des sources de votre noyau puis de faire: <span class="code">patch -p1 < /chemin/vers/le/patch</span>. Il est possible de retirer le patch en refaisant exactement la même commande. La lecture de <span class="code">man patch</span> est bien sûr recommandée en cas de problème.


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 à<br/>
<code>Kernel debugging</code><br/>
<code>Magic SysRq Key</code><br/>
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:<br/>
<code>
make && make bzImage modules_install
</code>
La compilation peut être relativement longue.
== Dernière étape ==
Maintenant, on va préparer le système à redémarrer avec le nouveau noyau:<br/>
<code>
cp arch/architecture/boot/bzImage /boot/kernel-X.Y.Z
</code>où ''architecture'' correspond à votre architecture (i386 pour un système 32bits,  x86_64 pour un amd64)
<br/>
<br/>
<code>
<br/>
cp System.map /boot/System.map-X.Y.Z
'''<b>[[Kernel-index|@ Retour à la rubrique Noyau et modules]]</b>'''
</code>
<br/>
 
Si le fichier <tt>/boot/System.map</tt> est un lien, le supprimer, sinon le renommer.
Ensuite, nous allons créer le lien suivant:<br/>
<code>ln -s /boot/System.map-X.Y.Z /boot/System.map</code>
 
Autant copier le fichier de configuration du noyau, on ne sait jamais:<br/>
<code>
cp .config /boot/config-X.Y.Z<br/>
</code>
 
Enfin, si vous utilisez un ramdisk au boot, il faut le recréer en lançant la commande suivante:<code>mkinitrd</code>, puis copier l'initrd dans <tt>/boot</tt>.<br>
 
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 <tt>/</tt> 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 <tt>Y</tt> au lieu de <tt>M</tt>), 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 ==
 
<code>make menuconfig</code> donne l'écran suivant :
 
L'écran suivant contient la liste des sous-menus de configuration. <br />Déplacez vous avec les flèches, et tapez 'Entrée' pour entrer dans chaque sous-menu. <br />
 
{|
| bgcolor="#CCCCCC" | <tt><font size="-2"> Linux Kernel v2.2.13 Configuration<br />  ------------------------------------------------------------------------------<br />  +------------------------------- Main Menu -------------------------------<br />  |  Arrow keys navigate the menu.  <Enter> selects submenus --->.          |<br />  |  Highlighted letters are hotkeys.  Pressing <Y> includes, <N> excludes, |<br />  |  <M> modularizes features.  Press <Esc><Esc> to exit, <?> for Help.    |<br />  |  Legend: [*] built-in  [ ] excluded  <M> module  < > module capable    |<br />  | +---------------------------------------------------------------------+ |<br />  | |          Code maturity level options  --->                        | |<br />  | |          Processor type and features  --->                        | |<br />  | |          Loadable module support  --->                            | |<br />  | |          General setup  --->                                      | |<br />  | |          Plug and Play support  --->                              | |<br />  | |          Block devices  --->                                      | |<br />  | |          Networking options  --->                                  | |<br />  | |          SCSI support  --->                                        | |<br />  | |          Network device support  --->                              | |<br />  | |          Amateur Radio support  --->                              | |<br />  | |          IrDA subsystem support  --->                              | |<br />  | |          ISDN subsystem  --->                                      | |<br />  | |          Old CD-ROM drivers (not SCSI, not IDE)  --->              | |<br />  | |          Character devices  --->                                  | |<br />  | |          Filesystems  --->                                        | |<br />  | |          Console drivers  --->                                    | |<br />  | |          Sound  --->                                              | |<br />  | |          Kernel hacking  --->                                      | |<br />  | |          ---                                                      | |<br />  | |          Load an Alternate Configuration File                      | |<br />  | |          Save Configuration to an Alternate File                  | |<br />  | |                                                                    | |<br />  | +---------------------------------------------------------------------+ |<br />  +-------------------------------------------------------------------------+<br />  |                    <Select>    < Exit >    < Help >                    |<br />  +-------------------------------------------------------------------------</font></tt><br />
|}
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.
 
<code>make xconfig</code> donne la fenêtre suivante :
 
[[Image:kernel-make_xconfig.png]]
 
Ce premier écran contient des boutons qui mènent aux différents sous-menus de configuration : <br />  
 
{|
|
[[Image:kernel-make_xconfig2.png]]
| Pour chaque option, cliquez sur le bouton [Help] afin de lire la documentation de l'option.  <br />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 =
Copyright &copy; 06/11/1999, Jean-Christophe Cardot
Copyright &copy; 17/07/2006, Jean-Christophe Cardot
{{CC-BY-NC-SA}}
{{CC-BY-SA}}

Dernière version du 5 juin 2012 à 10:03


Compiler le noyau

par Jean-Christophe

Où vous apprendrez à compiler votre noyau Linux sans soucis.

Quelques rappels

Le noyau est le cœur du système. C'est lui qui fait l'interface entre vos applications et votre matériel. Par exemple, il gère la mémoire, donne l'ordre d'exécution des tâches sur le(s) processeur(s), interagit avec vos périphériques via les pilotes matériels (souris, claviers, etc), s'occupe du réseau, ...

Le noyau (kernel en anglais) est composé d'une partie statique à laquelle on peut dynamiquement greffer des modules. La partie statique est utilisée lors du démarrage de votre ordinateur et sera toujours chargée en mémoire, tandis que les modules peuvent être chargés seulement une fois la machine démarrée et uniquement en cas de besoin.

Pourquoi Compiler son noyau ?

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 disposer d'une fonctionnalité qui n'est pas encore dans la branche principale du noyau (par exemple ajouter le support du temps réel afin de réduire les temps de latences d'une carte son, pour faire de la musique).
  • 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 d'un nouveau noyau. Il serait suffisant de rester à jour avec votre distribution puisque celle-ci s'occupe des logiciels qui ont des problèmes de sécurité ou des bugs.

Quel noyau compiler ?

Dans un premier temps, pour savoir quel noyau vous utilisez, il suffit de faire uname -sr. Vous devriez voir apparaître quelque chose du genre: Linux 2.6.15.

Les noyaux sont numérotés depuis le 2.6.11 sur 4 nombres w.x.y.z. Ce dernier numéro est facultatif, il représente la correction d'un bug important ne pouvant attendre la prochaine version. Le plus souvent ce sont des problèmes de sécurité ou des bugs qui altèrent les données. Il est aussi à noter que la différenciation stable/instable via le numéro de sous-version pair/impair a été abandonnée au profit d'un modèle de développement plus souple. Le noyau continue constamment à évoluer en fusionnant des branches plus expérimentales de temps à autres.

On peut différencier les sources Vanilla, qui sont les sources stables et celles que peuvent proposer les distributions avec des noyaux légèrement modifiés, optimisés pour telle ou telle architecture. Le mieux est peut-être d'installer la version du noyau qui correspond à votre système en le prenant parmi les paquetages fourni par votre distritibution (mais rien n'empêche d'utiliser les vanilla sources). Quoiqu'il en soit, voici les différentes manières de rapatrier les sources de votre noyau:

  • kernel.org: Allez sur kernel.org et téléchargez les dernières sources du noyau (allez sur F comme full).
  • Mandriva: # urpmi kernel-headers kernel-source
  • Fedora: # yum install kernel-source
  • Debian: # apt-get install kernel-headers-$(uname -r) kernel-source-$(uname -r)
  • Kubuntu: # apt-get install linux-headers-N°_de_noyau linux-source-$(uname -r)
  • Slackware: # installpkg /où_est/kernel-source-2.6.x.tgz /où_est/kernel-headers-2.6.x.tgz
  • Gentoo: # emerge gentoo-sources (ou vanilla-sources, ou suspend2-sources, etc.)

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. Pour découvrir plus en détail votre matériel, allez voir l'article complet sur léa. 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, make, ...
  • avoir les fichiers de développement des bibliothèques que l'on utilisera pour faire la configuration (ncurses, tcl/tk, Gtk, Qt, ...).
  • pouvoir passer root pour installer le noyau (à la fin de la compilation)

Configuration

Une fois que vous avez téléchargé l'archive des sources ou simplement installé le paquetage de votre distribution avec les sources du noyau, il est temps de passer à la configuration du noyau pour qu'il corresponde à votre ordinateur.

Préparer les sources

Deux possibilités:

  • Si vous avez téléchargé l'archive sur kernel.org, décompressez l'archive quelque part dans votre répertoire principal (par exemple, je les décompresse habituellement dans ~/devel/kernel/).
  • Si vous avez récupéré le paquetage via votre distribution, donnez les droits nécessaires pour que vous puissiez lire/écrire en tant qu'utilisateur.

Pour la suite, nous assumons que vous vous serez positionné à la racine des sources du noyau.

Les outils de configuration

Trois interfaces de configuration sont disponibles, choisissez l'une d'elle et passez à la suite.

Il est a noter que chacune de ces interfaces a besoin des fichiers de développement correspondant à la bibliothèque qu'elle utilise (ncurses, Qt, Gtk+). N'oubliez, donc, pas d'installer les paquetages correspondant pour les utiliser.

L'interface ncurses (mode semi-graphique)

Tapez : make menuconfig


L'interface Qt (mode graphique)

Tapez: make xconfig

 

L'interface Gtk+(mode graphique)

Tapez: make gconfig

 

Les options disponibles

Les options correspondent à des fonctionnalités que vous pouvez activer/désactiver dans le noyau suivant vos besoins. Elles sont organisées suivant différentes sections et sous-sections, nous allons ici décrire les principales sections qui existent et en donner une brêve description pour vous donner une idée des options qu'elles peuvent contenir.

Note: Il est important de noter que d'une version à l'autre du noyau, les options, sous-sections ou même les sections peuvent changer, mais l'idée générale reste conservée.

Les options section par section

  • Code maturity level options: Permet de cacher ou de faire apparaître les options qui sont encore en développement et donc considérées comme instables (souvent utile de dire 'oui' ici si l'on veut pouvoir profiter des dernières avancées du noyau).
  • General setup: Ensemble d'options générales sur votre système (sauf si vous voulez compiler pour des architectures très particulières, vous pouvez le laisser tel quel).
  • Loadable module support: Options concernant la gestion des modules (le défaut est presque toujours correct pour une utilisation normale).
  • Block layer: Les entrées/sorties sur votre carte-mère (inutile d'y toucher).
  • Processor type and features: Options relatives au(x) processeur(s): type (x86, Sparc, ...), hyper-thread, dual-core, SMP, etc.
  • Power management options (ACPI, APM): Options concernant l'économie d'énergie, la mise en veille et l'ACPI/APM.
  • Bus options (PCI, PCMCIA, EISA, MCA, ISA): Gestion de tous les endroits où vous pourriez enficher des cartes (PCI, PCMCIA, ISA, etc).
  • Executable file formats: La gestion des fichiers exécutable (Le suppport ELF doit toujours être à 'Y').
  • Networking: Options concernant les protocoles réseau gérés par votre noyau (le défaut est bien souvent suffisant, mais jetez y un coup d'oeil à tout hasard).
  • Device Drivers: Options concernant tous les pilotes matériel (c'est bien souvent ici que l'on passe le plus de temps).
  • File systems: Options concernant les systèmes de fichiers gérés par votre noyau (vous aurez à y jeter un coup d'oeil).
  • Instrumentation Support: Option de profilage du noyau (inutile de l'activer).
  • Kernel hacking; Options de déboguage du noyau (inutile de l'activer sauf si vous avez des envies particulières).
  • Security options: Options concernant le modèle de sécurité de votre noyau (le défaut est suffisant)
  • Cryptographic options: Algorithmes cryptographiques pouvant être implantés dans le noyau (le défaut est suffisant).
  • Library routines: Bibliothèques communes du noyau (le défaut est suffisant)

Positionner 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 en lisant l'aide qui y est attachée, dans l'ordre, afin de voir si elles s'appliquent à vous ou non.

Dans l'outil de configuration du noyau, chaque question attend une réponse:

  • 'oui' (Y),
  • 'non' (N)
  • ou éventuellement 'module' (M) pour rendre la fonctionnalité chargeable dynamiquement.

De manière générale, il est bon de modulariser les fonctionnalités qui ne servent pas en permanence (lecteur de CD, carte réseau, clefs USB, ...), mais tout n'est pas possible (enfin... pas simplement :).

Par exemple, vous ne devriez pas mettre en module ce qui est utilisé lors du démarrage de votre ordinateur (pilotes des disques-durs IDE, système de fichiers que vous utilisez pour votre partition /, ou encore le support réseau si votre partition racine est montée par le réseau et NFS dans le cas des stations diskless par exemple, etc). 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 grâce à initrd, mais cela dépasserait l'ambition de ce document...

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, ...

Voici ci-dessous les options classiques à utiliser pour une configuration standard. 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.

Quoi qu'il arrive, dans le doute, il vaut mieux laisser les options par défaut.

La compilation

Pour lancer la compilation du noyau, rien de plus simple, il suffit de lancer : make.

La compilation peut être relativement longue suivant votre type de machine. Pour ceux qui possèdent un multi-processeurs, un processeur hyperthread ou un multi-core, vous pouvez taper: make -j 4. Cela permet de paralléliser la compilation sur 4 processus.

Installation

On va à présent installer le noyau sur le système pour pouvoir démarrer dessus au prochain reboot. Toujours dans le même répertoire, tapez simplement: su -c 'make modules_install && make install'.

Le système va vous demander votre mot de passe root puis va lancer l'installation. En effet, la phase d'installation requière des droits de root (contrairement à toutes les phases précédentes). Et voilà, il ne reste plus qu'à configurer le gestionnaire de démarrage (grub, lilo ou loadlin).

Note: Vous pouvez aussi de temps à autre faire un peu de ménage dans les répertoires /boot/ et /lib/modules/. Mais pensez TOUJOURS à conserver au moins un noyau dont vous êtes sûr qu'il démarre lorsque vous n'avez pas encore testé à fond le noyau que vous venez de compiler.

Trucs & Astuces

Le fichier .config

Toute votre configuration noyau est en fait stockée dans le fichier .config. Si vous téléchargez un autre noyau et que vous placez votre fichier .config dans le répertoire racine des sources vous n'aurez pas à tout refaire, alors n'oubliez pas de le sauvegarder précieusement (ailleurs que dans les sources).

Personnaliser un noyau

Il est possible de personnaliser le nom de votre noyau en lui ajoutant un champ extra-version. Pour cela, avant de lancer la compilation, éditez le fichier Makefile qui se trouve à la racine des sources et renseignez le champ EXTRAVERSION avec un texte qui décrit votre extra-version (par exemple EXTRAVERSION = -debug ou bien EXTRAVERSION = -production, ...).

Patcher un noyau

Patcher un noyau requière de se placer à la racine des sources de votre noyau puis de faire: patch -p1 < /chemin/vers/le/patch. Il est possible de retirer le patch en refaisant exactement la même commande. La lecture de man patch est bien sûr recommandée en cas de problème.



@ Retour à la rubrique Noyau et modules

Copyright

Copyright © 17/07/2006, Jean-Christophe Cardot

Creative Commons License
Creative Commons Attribution iconCreative Commons Share Alike icon
Ce document est publié sous licence Creative Commons
Attribution, Partage à l'identique 4.0 :
https://creativecommons.org/licenses/by-sa/4.0/