Compiler son noyau

Un article de Wiki de la communauté Mandriva.

Jump to: navigation, search
Cet article a pour objectif de démystifier le compilation d'un noyau souvent perçue comme quelque chose de difficile.

Sommaire

[modifier] Pourquoi compiler soi-même son noyau ?

On entends souvent des personnes parler de compilation de noyau (ou kernel). Il faut être clair : ce n'est pas une opération obligatoire. Mandriva nous fournit des noyaux génériques qui fonctionnent pour une très large gamme d'ordinateurs

Mais alors, ça ne sert à rien ?

Pas vraiment. On y gagne toujours que ce soit :

  • Pour le plaisir de la connaissance : on apprendra toujours quelque chose
  • Pour améliorer la performance : un temps de démarrage plus rapide, choix particulier du processeur, matériel...
  • Pour rentrer dans le cercle des geeks de votre patelin.
  • ...

[modifier] Avant de commencer

[modifier] Les sources du noyau

Pour compiler un noyau, il fait bien évidement les sources : le code écrit en langage compréhensible par les humains. La compilation aura pour effet de le transcrire en langage machine.

Là, deux solutions :

  • Télécharger les sources depuis : http://www.kernel.org/
  • Installer les sources du dernier noyau de Mandriva.

C'est la seconde option que nous allons prendre, par simplicité, car comme nous verrons, nous disposerons des options choisies par Mandriva, et nous n'aurons qu'à changer que quelques unes d'entre elles.

[modifier] Connaître le noyau actuel et le matériel

Cela pourra nous être utile :

Image:Konsole.png
[utilisateur@ordi ~]$ uname -a
Linux localhost 2.6.24.7-desktop-2mnb #1 SMP Thu Oct 30 18:03:14 EDT 2008 i686 Genuine Intel(R) CPU           T2060  @ 1.60GHz GNU/Linux 

J'ai donc le noyau 2.6.24.7-desktop-2mnb

Pour le matériel, une commande utile sera

Image:Konsole.png
[utilisateur@ordi ~]$ lspci

qui vous fera la liste de vos cartes graphiques, wifi ou ethernet...

[modifier] Les sources des noyaux Mandriva

Nous allons utiliser le Centre de Contrôle Mandriva. En cherchant kernel-source, vous obtiendrez une liste de source pour différentes versions et aussi un paquet un peu spécial (un méta-paquet) nommé kernel-source-latest qui installera automatiquement les sources du noyau le plus récent. C'est ce qui nous intéresse, car nous allons compiler la dernière version, tant qu'à faire.

[modifier] Les outils indispensables

Quelques outils sont aussi nécessaires pour compiler. Vérifiez s'ils sont présents sur votre machine.

  • make
  • gcc

[modifier] Configuration

C'est sans doute l'étape la plus longue et la plus difficile. je vous conseille dans un premier temps de ne modifier que quelques options...

Les sources que nous venons d'installer se trouvent dans /usr/src. Ils sont classés par versions. Je fais donc :

Image:Konsole.png
[utilisateur@ordi ~]$ cd /usr/src/linux-2.6.24.7-2mnb/

Listons les éléments de ce répertoire :

Image:Konsole.png
[utilisateur@ordi ~]$ ls -la

drwxr-xr-x 21 root root  4096 2008-11-13 21:13 ./
drwxr-xr-x 11 root root  4096 2008-11-13 21:14 ../
drwxr-xr-x 14 root root  4096 2008-11-13 21:12 3rdparty/
drwxr-xr-x  4 root root  4096 2008-11-13 21:12 arch/
drwxr-xr-x  2 root root  4096 2008-11-13 21:12 block/
-rw-r--r--  1 root root 88668 2008-10-30 23:41 .config
-rw-r--r--  1 root root 18693 2008-01-24 23:58 COPYING
-rw-r--r--  1 root root 92504 2008-10-30 22:19 CREDITS
drwxr-xr-x  3 root root  4096 2008-11-13 21:12 crypto/
drwxr-xr-x 70 root root 12288 2008-11-13 21:12 Documentation/
drwxr-xr-x 76 root root  4096 2008-11-13 21:12 drivers/
drwxr-xr-x 64 root root  4096 2008-11-13 21:12 fs/
drwxr-xr-x 21 root root  4096 2008-11-13 21:12 include/
drwxr-xr-x  2 root root  4096 2008-11-13 21:12 init/
drwxr-xr-x  2 root root  4096 2008-11-13 21:12 ipc/
-rw-r--r--  1 root root  1596 2008-01-24 23:58 Kbuild
drwxr-xr-x  5 root root  4096 2008-11-13 21:12 kernel/
drwxr-xr-x  6 root root  4096 2008-11-13 21:12 lib/
-rw-r--r--  1 root root 94323 2008-10-30 22:19 MAINTAINERS
-rw-r--r--  1 root root 53220 2008-10-30 23:41 Makefile
drwxr-xr-x  2 root root  4096 2008-11-13 21:12 mm/
drwxr-xr-x 42 root root  4096 2008-11-13 21:12 net/
-rw-r--r--  1 root root 16930 2008-01-24 23:58 README
-rw-r--r--  1 root root  3119 2008-01-24 23:58 REPORTING-BUGS
drwxr-xr-x  3 root root  4096 2008-11-13 21:12 samples/
drwxr-xr-x  9 root root  4096 2008-11-13 21:13 scripts/
drwxr-xr-x  5 root root  4096 2008-11-13 21:13 security/
drwxr-xr-x 20 root root  4096 2008-11-13 21:13 sound/
drwxr-xr-x  2 root root  4096 2008-11-13 21:13 usr/


Un fichier attirera particulièrement votre attention : il s'agit de .config. Il contient tous les paramètres choisis par Mandriva pour ce noyau. Ce sont ces paramètres que nous allons modifier pour qu'ils correspondent au mieux à nos besoins.

[modifier] Ne pas travailler dans /user/src/

Il n'est pas conseillé de travailler directement dans /user/src/. Nous allons donc travailler dans notre /home.

Un extrait d'un message de Linux Torwald :

Je suggère aux personnes qui compilent un nouveau noyau de :

- ne pas le faire dans /usr/src. Quelque soit le noyau provenant de votre
distribution (probablement les fichiers d'entêtes uniquement), 
mais en tout cas n'y touchez pas.

- compiler le noyau dans leur propre répertoire personnel. Il est inutile 
d'être root pour compiler le noyau. Vous avez besoin d'être root
pour installer le noyau, mais c'est différent.

- ne pas avoir l'intention de faire un lien symbolique (excepté celui que le 
noyau créé lui-même, à savoir le lien "linux/include/asm" qui est utilisé
uniquement pour la compilation interne du noyau).

Et bien sûr, c'est ce que je fais. Mon /usr/src/linux a encore les
fichiers d'entêtes de mon ancien 2.2.13, bien que je n'ai pas utilisé
le noyau 2.2.13 depuis très longtemps. Mais ces entêtes étaient ceux
qu'avait compilé la glibc, donc ces entêtes sont ceux qui correspondent 
aux fichiers de la bibliothèque objet.

Et c'est en fait ce qui a été l'environnement suggéré depuis au moins cinq
ans. Je ne sais pas pourquoi l'habitude de faire des liens symboliques
est restée ainsi. De nombreuses distributions ont ce lien symbolique cassé, 
et les gens se souviennent que les sources du noyau devraient être dans 
"/usr/src/linux" même si ce n'est pas vrai depuis très longtemps.

En tant qu'utilisateur, je crée un dossier nommé /src.

Image:Konsole.png
[utilisateur@ordi ~]$ mkdir ~/src

puis je crée un lien symbolique de mes sources vers mon nouveau dossier.

Image:Konsole.png
[utilisateur@ordi ~]$ ln -s /usr/src/linux-2.6.24.7-2mnb/ ~/src/linux

Dorénavant, nous travaillerons dans ~/src/linux. (cd ~/src/linux/ pour s'y rendre)

[modifier] Les divers outils

Pour modifier notre .config, on a plusieurs choix possibles :

  • make menuconfig

C'est celui-ci que j'utiliserai. Un petit descriptif en haut décrit les touches utiles.

  • make xconfig (QT)
  • make gconfig (GTK)
  • make config : des questions vous sont posées une à une...

ou simplement votre éditeur texte favoris, mais c'est pour le pro exclusivement.

[modifier] En module, en dur

Il y a deux manières de mettre une option au noyau :

  • En dur.

La fonctionnalité fait partie intégrante du noyau.

  • En module.

La fonctionnalité est séparée du kernel à proprement parler, et est greffée si besoin est.

Bien sûr, on ne peut pas tout mettre en module, car certaines sont vitales et doivent être mise en dur.

Ainsi on a : [ ] fonctionnalité en dur uniquement non activée. [*] fonctionnalité en dur uniquement activée.

< > fonctionnalité en module ou en dur non activée. <M> fonctionnalité en module ou en dur mise en module. <*> fonctionnalité en module ou en dur mise en dur.

[modifier] Quelques options...

Je vais ici vous montrer quelques options que l'on peut modifier facilement. Ensuite, à vous de lire l'aide fournie lors de l'édition de votre .config.


  • Processor type and features

> Processor family

Là, on peut modifier le type de processeur pris en charge. Par défaut, c'est un pentium pro, ce qui pour mon double cœur, n'est pas génial. Je vais donc sélectionner core 2.

>Toshiba / Dell laptop support

Je possède un Toshiba, donc je peux supprimer le support de Dell, il ne me servira pas.

>High memory support

Ici, on gère la quantité de ram prise en charge...

  • Power management options > CPU Frequency scaling

On y voit des choses concernant AMD, Intel, Nvidia... J'ai un intel et une ATI, je supprime les modules concernant AMD et Nvidia.

  • Networking

Bluetooth, IR... il y a sûrement des choses à désactiver.


Ensuite, à vous de regarder les divers options et d'activer/désactiver ce que vous souhaitez.

[modifier] Compilation

Avant de compiler, nous allons modifier un petit paramètre dans le fichier Makefile. Il s'agit de EXTRAVERSION. Après le signe égal, mettez ce que vous voulez. Par ex : EXTRAVERSION= .7-2mnb-perso Vous pourrez ainsi l'identifier comme étant votre kernel

La compilation se fait en lançant la commande suivante :

Image:Konsole.png
[utilisateur@ordi ~]$ make && make modules_install && make install

qui est en fait une succession de trois commandes qui ne s'exécutent que si la précédente s'est soldée par un succès.

  • make

Ceci a pour effet de compiler le noyau. A noter que si vous possédez un processeur double cœurs, vous pouvez utiliser l'option -j2 qui fera utiliser vos deux processeurs. -j4 pour 4 cœurs etc. Le noyau est ajouté dans /boot/.

  • make modules_install

Compile les divers modules.

  • make install

[modifier] Editer son menu Grub

Je pense que vous utilisez Grub, le bootloader par défaut de Mandriva. Il faut donner une nouvelle entrée à Grub pour qu'il puisse vous proposer le choix de charger votre noyau fraichement compilé.

Image:Konsole.png
[root@ordi ~]# nano /boot/grub/menu.lst

J'y ajoute :

title linux-perso
kernel (hd0,6)/boot/vmlinuz-2.6.24.7-2mnb-perso BOOT_IMAGE=linux-perso root=UUID=8101ef90-3011-11dd-9934-c77360c3928e resume=/dev/sda5
initrd (hd0,6)/boot/initrd-2.6.24.7-2mnb-perso.img

Inspirez vous des autres lignes de votre fichier et de cet exemple pour faire le votre.

Il est maintenant venu le temps de rebooter et de voir si votre noyau fonctionne ou non.

[modifier] Liens

Ad (via La Vignette)
Looking for a job?