Howtos GNU/Linux .: kozaki :. Howtos GNU/Linux

Compiler le noyau (kernel) Linux

Quelques brèves sur le noyau Linux

  • Le noyau Linux 2.6.28 est disponible : Intègre le gestionnaire de mémoire pour cartes graphiques GEM, nouvelle infrastructure de gestion des domaines réglementaires des réseaux sans fil, amélioration nette de la capacité de montée en charge (scalability) de la gestion de la mémoire, tire mieux parti des systèmes multiprocesseurs, supporte la norme UWB, système de fichiers Ext4 stable, intégration de la branche -staging (inclusion plus rapide des pilotes de périphériques), intégration du patch des timers haute résolution avec fenêtre temporelle (Range hrtimers), amélioration nette du support des disques SSD, ... Un article complet, concis et pédagogique de patrick_g.
  • CKpatchset_ConKolivas_so-longSo long Con Kolivas & le Patch CK (CKpatchset)
  • If Torvalds quit Linux would anyone notice? sur TuxMachine.org (06/02/2008)

Introduction : Pourquoi ?

Source de l'article : Pourquoi un nouveau noyau par Jean-Christophe de lea-linux]

a) 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 (ex : le contrôleur ethernet de cartes mères Asrock s939 nécessite le noyau 2.6.14.x),
- 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 :)
- Vous pensez améliorez les performances de votre système en compilant pour votre matériel (l'espoir fait vivre)
en fait La plupart du temps, vous n'avez pas réellement besoin de nouveau noyau...
Vous pouvez récupérer la dernière version du noyau (ainsi que toutes les autres) sur kernel.org, ou avec votre gestionnaire de paquetages.

b) Quelle est la version actuelle de votre noyau ?

C'est facile, il suffit de lancer uname -r pour avoir la réponse.
Les noyaux sont numérotés sur 3 nombres: x.y.z qui indiquent :

- le nombre du milieu est pair pour une version stable (exemple : 2.4.x)
- le nombre du milieu est impair pour une version de développement (exemple : 2.5.x)
attention il n'est pas recommandé à des utilisateurs peu expérimentés d'utiliser un noyau d'une version de développement, car ces noyaux sont à priori destinés aux testeurs et pas stables.

La suite de cette page est ancienne et à réviser. En fait, on liera vers quelques pages plus explicatives.

Prérequis

Installer les sources du noyau qu'on va compiler :

  1. Avec le gestionnaire de packages (ici .rpm de Mandrake) :
    urpmi kernel-source
    vérifier qu'il s'agit de la bonne version = la même que le noyau qu'on va compiler.
  2. Avec le tarball :
    tar zxvf kernel-source-[version].tar.gz
  3. On fait repointer le lien /usr/src/linux vers les sources du nouveau noyau :
    rm -f linux
    ln -s linux-2.x.x linux

    En général, /usr/src/linux représente un lien vers le répertoire courant contenant les sources du noyau que l'on compile (pas l'ancien).
    Ce lien est nécessaire à la compilation du noyau et afin que les fichier d'entêtes (les "includes") du noyau soient disponibles pour des compilations futures d'application.

HOWTO RAPIDE pour processeurs de la famille i386 (Intel/AMD) :

Vous avez installé les sources

La liste des commandes rapide, sans ouatemille explications :

cd /usr/src/linux
cp ./.config /outuveux
--> sauvegarder la configuration initilale.
(make mrproper --> Pour nettoyer l'arborescence des sources (attentionremet à zéro ton .config).)

make xconfig --> Choisis les options qui te conviennent.

make
make modules
make modules_install
make install

(ou make && make modules_install && make install si vous avez des courses à faire :)

et voila, une compilation propre, nickel, sans accro...

Source : forum.mandrakeclub.com

Ces commandes sont détaillées ci-dessous.

HowTo détaillé

Vous avez installé les sources (vi je sais mais j'insiste !)

1 - CONFIGURATION

1.1 - Trois commandes sont disponibles

make xconfig (graphique, le plus clair mais oblige à être sous X) ou :
make menuconfig (mode texte semi-graphique avec menus) ou encore :
make config (mode texte intégral)

Là il va falloir choisir les options.
Si vous ne l'avez jamais fait, sachez qu'il y en a un paquet, alors prévoyez un bon petit moment (et prenez des notes avant) !
* Annexe lea-linux sur les options

1.2 - Récupèrer la configuration actuelle de votre noyau ( à partir du kernel 2.6.x )

Une des nouveautés du kernel 2.6 est le pseudo fichier /proc/config.gz, il suffit donc de faire :
zcat /proc/config.gz > /usr/src/linux/.config et le tour est joué !

2 - COMPILATION DU NOYAU ET DES MODULES

Si vous voulez juste recompiler le noyau, sans monter de version :

Déplacez le répertoire /lib/modules/2.x.x vers /lib/modules/old-2.x.x (par exemple), avant la phase de compilation.
Ainsi, l'installation des modules recréera ce répertoire et y placera les nouveaux modules

Notez qu'il faut donc lancer make modules_install avant le "make install" du noyau.

Cela vous épargnera des problèmes si la nouvelle configuration du noyau a modifié celle des modules.
Si tout fonctionne correctement après le redémarrage, vous pourrez supprimer /lib/modules/old-2.x.x.

Les commandes :

à l'ancienne mode :

make dep && make clean && make bzImage pour compiler le noyau lui-même
make modules pour compiler les modules (i.e. les drivers).
Ne reste plus qu'à installer ces modules.

Avec les commandes modernes

Pour la plupart des logiciels, la commande make suffit à lancer la compilation. Et bien il en est de même pour le noyau.

  1. cd /usr/src/linux/
    make
  2. puis make modules
    make modules_install
  3. et enfin make install

Dans cet ordre, make install créé automatiquement les fichiers nécessaires dans le noyau.

=> Par exemple quand j'ai compilé le kernel-2.6.8.1-12mdk, make install créé dans /boot :
- config-2.6.8.1-12mdkcustom
- initrd-2.6.8.1-12mdkcustom.img
- System.map-2.6.8.1-12mdkcustom
- vmlinuz -> vmlinuz-2.6.8.1-12mdkcustom
- vmlinuz-2.6.8.1-12mdkcustom

make

Comme annoncé dans l'introduction, le make sert à générer un exécutable, pour ce faire il suit les indications contenues dans le .config.

Rappelons que la compilation est une traduction, au même titre que le passage de l'anglais au français. On passe d'un fichier ascii, contenant du code source C à un fichier binaire (contenant des 0 et des 1) appelé exécutable.

Si on lance "make install" maintenant, on obtient le message d'erreur :

make[1]: « arch/i386/kernel/asm-offsets.s » est à jour.
CHK include/asm-i386/asm_offsets.h
CHK include/linux/compile.h
Kernel: arch/i386/boot/bzImage is ready
sh /usr/src/linux-2.6.8.1-12mdkcustom/arch/i386/boot/install.sh 2.6.8.1-12mdkcustom arch/i386/boot/bzImage System.map ""
/lib/modules/2.6.8.1-12mdkcustom is not a directory.
mkinitrd failed:
(mkinitrd -v -f /boot/initrd-2.6.8.1-12mdkcustom.img --ifneeded 2.6.8.1-12mdkcustom)) at /usr/lib/libDrakX/boot loader.pm line 121.
make[1]: *** [install] Erreur 2
make: *** [install] Erreur 2

3 - INSTALLATION DU NOUVEAU NOYAU

Installation (les lignes suivantes sont à adapter à votre configuration, à la version du noyau...) :

3.1 - Installer les modules dans le répertoire /lib/modules/2.x.x :

cd /usr/src/linux/
make modules_install

3.2 - Installer le noyau :

Les gestionnaires de packages le font automatiquement. Pareil pour 'make install'. Mais voilà la manip manuellement :

cd /usr/src/linux/
cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.7
cp System.map /boot/System.map-2.6.7

Ici j'installe un noyau 2.6.7, mais le nom de vmlinuz est là par logique et non par nécessité, évitez néanmoins de les appeler vmlinuz ou System.map tout court.
À ce stade votre noyau est installé, mais pour être totalement en règle avec la syntaxe Linux, exécutez également les commandes suivantes :

cd /boot
mv vmlinuz vmlinuz.old
ln -sf /boot/vmlinuz-2.6.7 vmlinuz
rm System.map
ln -s System.map-2.6.7 System.map

3.3 - mkinitrd :

Est fait automatiquement si on a respecté l'ordre donné ci-dessus :o))

Si votre distribution utilise un disque ram initial (initial ramdisk = initrd) pour démarrer (visible à la ligne "initrd=" dans le chargeur Lilo ou Grub), tapez également :

mkinitrd -o /boot/initrd-2.6.7 /lib/modules/votre_nouveau_noyau
Nan, c'est plutot :
mkinitrd -f -v /boot/initrd-2.6.8.1-12mdkcustom.img 2.6.8.1-12mdkcustom (de : /lib/modules/nuvo_noyau )

3.4 - Mise à jour du chargeur d'OS / Gestionnaire de boot :

Les gestionnaires de packages le font automatiquement. Mais voilà la manip manuellement :

Maintenant que votre noyau est installé il vous reste à mettre à jour votre chargeur d'OS, il peut s'agir de lilo ou grub.

Si vous utilisez Lilo, éditez /etc/lilo.conf pour mettre à jour avec la nouvelle version ou ajouter une entrée, puis lancez lilo :
/sbin/lilo
(Détails ci-dessous)

Si vous utilisez Grub, éditez simplement /boot/grub/menu.lst pour mettre à jour sur la nouvelle version du noyau ; laissez les entrées préexistantes telles quelles, elles seront bien utiles si le nouveau noyau ne fonctionne pas !
(Détails ci-dessous)

Détails LILO

Editez votre fichier /etc/lilo.conf, focalisez sur la zone qui démarre Linux (label=linux), chez moi elle ressemble à ce qui suit, il peut y avoir quelques variations chez vous en fonction de votre distribution

image = /boot/vmlinuz
root = /dev/hda4
append = "hdc=ide-scsi hdd=ide-scsi"
label = Linux
vga = 773
read-only

Vous devez la dédoubler et modifier chacun des deux blocs :

# Ancien noyau :
image = /boot/vmlinuz.old
root = /dev/hda4
append = "hdc=ide-scsi hdd=ide-scsi"
label = mylinux-old
vga = 773
read-only

# Nouveau noyau :
image = /boot/vmlinuz
root = /dev/hda4
label = Linux
vga = 773
read-only

Le reste doit rester inchangé. Si vous utilisez une distribution avec initrd, votre /etc/lilo.conf ressemblera à ceci :

image=/boot/vmlinuz
label=linux
root=/dev/hdc6
initrd=/boot/initrd.img
append="quiet devfs=mount"
vga=788
read-only

Vous devez la dédoubler et modifier chacun des deux blocs :

# Ancien noyau :
image=/boot/vmlinuz.old
label = mylinux-old
root=/dev/hdc6
initrd=/boot/initrd.img
append="quiet devfs=mount"
vga=788
read-only

# Nouveau noyau :
image=/boot/vmlinuz
label=Linux
root=/dev/hdc6
initrd=/boot/initrd-2.6.7
append="quiet devfs=mount"
vga=788
read-only

Le reste doit demeurer inchangé. Quand vous êtes satisfait, validez vos changements en tapant :
/sbin/lilo -v

Détails GRUB :

Pour grub c'est le fichier /boot/grub/menu.lst, qu'il faut éditer, la section linux (title Linux) ressemble à :

title Linux
root (hd0,3)
kernel /boot/vmlinuz root=/dev/hda4 hdc=ide-scsi hdd=ide-scsi vga=773

Vous devez la dédoubler et modifier chacun des deux blocs :
# Ancien noyau :
title mylinux-old
root (hd0,3)
kernel /boot/vmlinuz.old root=/dev/hda4 hdc=ide-scsi hdd=ide-scsi vga=773

# Nouveau noyau :
title Linux-2.6.7
root (hd0,3)
kernel /boot/vmlinuz root=/dev/hda4 vga=773

Le reste doit rester inchangé.
Si vous utilisez une distribution avec initrd, votre /boot/grub/menu.lst ressemblera plutôt à ceci :

title Linux
kernel (hd0,5)/boot/vmlinuz root=/dev/hdc6 quiet devfs=mount vga=788
initrd (hd0,5)/boot/initrd.img

Vous devez la dédoubler et modifier chacun des deux blocs
[NB : si initrd est un symlink, suffit de le changer sur le nuvo initrd.img] :

# Ancien noyau :
title mylinux-old
kernel (hd0,5)/boot/vmlinuz.old root=/dev/hdc6 quiet devfs=mount vga=788
initrd (hd0,5)/boot/initrd.img

# Nouveau noyau :
title Linux-2.6.7
kernel (hd0,5)/boot/vmlinuz root=/dev/hdc6 quiet devfs=mount vga=788
initrd (hd0,5)/boot/initrd-2.6.7

4) ON REDÉMARRE

Voilà vous pouvez redémarrer, au boot vous choisirez Linux, en cas de difficultés vous pourrez toujours revenir à l'ancienne version en choisissant mylinux-old et recommencer plus consciencieusement.

Liens

  • How To Compile A Kernel - The Mandriva Way
    Each distribution has some specific tools to build a custom kernel from the sources. This article is about compiling a kernel on Mandriva systems. It describes how to build a custom kernel using the latest unmodified kernel sources from www.kernel.org (vanilla kernel) so that you are independent from the kernels supplied by your distribution. It also shows how to patch the kernel sources if you need features that are not in there.
Trop cool pour Internet Explorer