Ceci est une ancienne révision du document !


Compiler son kernel

NOTE : dans ce tuto je parlerais de kernel, de noyau mais c'est la même chose

NOTE : J'imagine que vous savez quelles commandes sont à lancer en tant que root

LinuxLe kernel est tout simplement le programme qui gère les interaction entre le matériel et les autres programmes. C'est lui qui 1) amorce le système d'exploitation.

Une chose que beaucoup de personnes ne comprennent pas est que le kernel est un programme comme les autres, vous pouvez parfaitement avoir plusieurs kernel et utiliser celui de votre choix. Il est même recommandé d'avoir toujours un kernel fonctionnel sur sa machine.

Pourquoi compiler son kernel ? Les kernels fournis par défaut dans votre distribution GNU/Linux sont des noyaux capables de tourner sur un maximum de machines et de matériels. Ils sont donc souvent plus lourds, mais la différence de rapidité est en général assez faible. En fait les vraies raisons de compiler son propre kernel sont les suivantes :

  1. Comprendre comment fonctionne le noyau Linux.
  2. Faire fonctionner un matériel qui n'est pas pris en charge par votre kernel actuel.
  3. Appliquer un patch.
  4. Vous voulez utiliser une distribution qui oblige de compiler votre kernel 2)
  5. Vous voulez passer le temps.:-\

La compilation du noyau est longue et demande beaucoup d'attention sous peine de ne pas pouvoir démarrer sa machine. Si vous n'avez pas le temps de lire beaucoup de documentation et si vous n'êtes pas prêt a galérer sérieusement alors inutile de vous fatiguer pour rien 3) .

En fait, la plupart des distribution 4) patchent leurs kernels. Et ce pour des raisons de sécurité ou tout simplement pour un fonctionnement optimal. Il est très conseillé d'utiliser les sources de votre distribution. Les sources officielles de Linux sont appelées vanilla 5). Mais comme je l'ai dit, nous n'utiliserons pas ces sources.

Passons a l'installation des sources :

sudo aptitude install linux-source
linux-source est un metapackage6)qui pointe vers la dernière version du kernel

Il vous faudra aussi installer les outils de compilations :

sudo aptitude install debconf-utils dpkg-dev debhelper build-essential kernel-package libncurses5-dev

Quelques préliminaires

Les développeurs du Kernel déconseillent de compiler le kernel en tant que root, mais cet avis est très partagé. Faites comme bon vous semble, si vous voulez compiler en utilisateur je vous conseille de vous rajouter au groupe src :

usermod -aG src login ## Où login est votre nom d'utilisateur

Par défaut, les sources sont dans /usr/src, sous Debian et Ubuntu il vous faut extraire l'archive :

cd /usr/src
tar xvjf linux-source-2.6.VERSION.tar.bz2

Je vous conseille de faire un lien symbolique vers le kernel qui s'appelle linux 7) (c'est bien et ça m'aidera pour la suite):

cd /usr/src
ln -sfn linux-source-2.6.VERSION linux ## sous Debian, Ubuntu

Ensuite allez dans ce fameux dossier :

cd /usr/src/linux

Toutes les modifications que nous allons faire seront dans le fichier .config (qui n'existe pas par défaut). Ce fichier contient (ou contiendra) des choses dans ce genre :

# CONFIG_SECURITY_FILE_CAPABILITIES is not set
# CONFIG_SECURITY_ROOTPLUG is not set
CONFIG_CRYPTO=y
CONFIG_CRYPTO_ALGAPI=m
CONFIG_CRYPTO_BLKCIPHER=m
CONFIG_CRYPTO_MANAGER=m

Il est évident que ce n'est pas pratique de modifier ce fichier à la main, ce serait long et très dangereux car certaines options dépendent d'autres options. C'est pourquoi nous allons utiliser l'interface (en console) qui permet de le modifier facilement.

NOTE : il existe aussi des interfaces graphique mais je ne vais pas les aborder ici et puis vous n'utilisez peut être pas de serveur graphique

Pour lancer cette interface en console c'est simple :

make menuconfig

Et vous vous retrouvez devant quelque chose comme ceci :

make menuconfig

La navigation dans cette interface est simple :

  • Flèches pour monter/descendre
  • Entrée pour rentrer dans les sous menus
  • Deux fois echap pour sortir du sous menus
  • h pour demander l'aide sur une option
  • slash "/" pour rechercher une option
  • Espace pour sélectionner une option

Toute l'astuce consiste à chercher les option qui correspondent à votre matériel et à les activer avec espace. Cette tache est assez fastidieuse si on part de zéro.8)

Ainsi si vous voulez partir avec une config qui devrait marcher je vous conseille deux choses :

Soit vous copiez un .config fonctionnel que vous optimiserez ensuite : Si vous avez déjà un kernel fonctionnel, son .config devrait être dans le dossier /boot. Pour le copier (par exemple) :

cp /boot/config-2.6.XX /usr/src/linux/.config

Ensuite, vu que ce n'est sûrement pas la même version, il faut voir s'il y a eu des modifications dans la configuration :

make oldconfig

A chaque fois que les options seront différentes, on vous demandera de spécifier les nouvelles options.

Je déconseille cette méthode pour deux raisons :

  • make oldconfig est difficile a faire proprement
  • Le travail à faire pour optimiser ensuite sera très dur si la config du kernel précédent est pleine d'options inutiles

Cette méthode est à utiliser seulement si vous êtes certain de votre .config.

La 2ème méthode consiste à construire un kernel minimum puis à remplir les options dont vous aurez besoin. C'est celle que je vous conseille 9). Cette commande va construire un .config minimum qui est fourni par les mainteneur du kernel.

make defconfig

En dur ou en module ?

Les options que vous choisirez dans le kernel seront compilées soit en dur soit en module.

  • En dur, l'option sera inclue dans le kernel. Ce qui se traduit pas une étoile '*' a coté de l'option
  • En module l'option sera optionnelle 10) elle est représentée par un M a coté de l'option, c'est à dire que vous pourrez choisir de l'activer ou non.

Concrètement, ça veut dire que tout ce qui est nécessaire au démarrage de l'ordinateur doit être compilé en dur. Et le reste en dur ou en module.

Donc doit être compilé en dur :

  • Le système de fichier (ext3, reiserfs par exemple) des partition utilisées
  • Le support pour les disque (SATA ou IDE) de ces partitions

Et voilà, vous pouvez passer a la configuration proprement dite.

Que linus soit avec vous ! Ok, allons y, prenez une pause, un café, un deuxième café et une sieste. C'est la partie clef de votre kernel donc restez vigilants et tout ce passera bien. On lance la commande magique et on y va :

make menuconfig

Je vous rassure, on ne touchera qu'à quelques options dans le menu, je n'aborderais en général que les options vitales pour le système11).

NOTE : certaines options changent d'endroit suivant la version du kernel. Si mes indications ne sont pas bonnes cherchez avec /

Deux trois petites options à activer :

Il faut activer quelques options pour pouvoir travailler sereinement : L'option Prompt for development and/or incomplete code/drivers doit être activée pour pouvoir avoir accès à certaines options. Si ce n'est pas le cas des options seraient introuvables dans les menus.

Cette options est ici :

General setup --->
      [*] Prompt for development and/or incomplete code/drivers

Sur certains kernel elle est ici :

Code maturity level options  --->
      [*] Prompt for development and/or incomplete code/drivers

La prochaine option à vérifier est Processor family Elle se trouve ici :

Processor type and features  --->
      Processor family --->

Il faut donner le type de processeur que l'on a. Pour le savoir :

grep -i "model name" /proc/cpuinfo
## Chez moi ça donne ça :
model name	: Genuine Intel(R) CPU           T1350  @ 1.86GHz

Ensuite faites des recherches sur le processeurs et trouvez la famille de processeur correspondante.

Une autre option à vérifier : Subarchitecture Type : Elle se trouve ici :

Processor type and features  --->
      Subarchitecture Type --->

Si vous ne savez pas quoi mettre et que vous avez un PC "normal" vous pouvez mettre PC-compatible

Si vous utilisez des cartes PCMCIA je vous conseille d'activer quelques options ici (en dur ou en module):

Bus options (PCI, PCMCIA, EISA, MCA, ISA)  --->
      PCCARD (PCMCIA/CardBus) support  --->

La section NETWORKING

Cette section est utile si vous utilisez des périphériques wifi, bluetooth, infrarouge. Je vous laisse activer (en dur ou en module) ce dont vous avez besoin. Si vous n'utilisez pas IPV6 vous pouvez le désactiver ici :

Networking  --->
    Networking options  --->
        < >   The IPv6 protocol

La section File systems

Cette section est vitale, il faut absolument que support des systèmes de fichiers des partition racines soit compilé en dur. J'estime que si vous êtes arrivés jusqu'ici c'est que vous savez ce qu'est un système de fichiers.

File systems  --->
    <*> Second extended fs support ## Si ext2 utilisé
    <*> Ext3 journalling file system support ## Pour ext3
    <*> Reiserfs support ## Reiseirfs
## Il y en a d'autres, mais je ne détaille pas ;)

Si vous utilisez encore des partitions FAT ou NTFS (Windows), je vous conseille ces options :

File systems  --->
    DOS/FAT/NT Filesystems  --->

La section suivante mériterais une page entière, c'est pourquoi je la met en valeur :

Cette section est une des plus importantes. C'est elle qui gère les pilotes de votre matériel. Et pas de pilote implique que le matériel ne fonctionnera pas.

Les options que nous toucherons seront celles ci :

Device Drivers --->
    <M> Parallel port support  --->
    <*> ATA/ATAPI/MFM/RLL support  --->
    SCSI device support  --->
    [*] Network device support  --->
    Graphics support  --->
    Sound  --->

La section Parallel port support

Pour utiliser les port parallèles Je vous conseille cette option, surtout si vous avez une imprimante qui se branche sur un tel port :

Devices Drivers --->
    <M> Parallel port support  --->
        <M>   PC-style hardware
        [*]   IEEE 1284 transfer modes

La section ATA/ATAPI/MFM/RLL support

Si vous avez utilisé make defconfig, cette section devrait être bien configuré, toutefois il y a une optimisation a faire :

Support IDE

Une de ces deux options peut être désactivée.

<*>       AMD and nVidia IDE support
<*>       Intel PIIXn chipsets support

Pour savoir laquelle utiliser (et laquelle ne pas utiliser), vous pouvez procéder ainsi : Assurez vous d'avoir installé udev. Si votre disque est /dev/hda

udevinfo -a -p /sys/block/hda | grep -i DRIVERS

## Vous obtenez ça :
    DRIVERS=="ide-disk"
    DRIVERS==""
    DRIVERS=="PIIX_IDE"
    DRIVERS==""
## Ou ça :
    DRIVERS=="ide-disk"
    DRIVERS==""
    DRIVERS=="VIA_IDE"
    DRIVERS==""

Si vous obtenez un message du style :

 udevinfo: command not found

Utilisez plutôt udevadm info avec les mêmes options.

Je vous laisse faire le reste ;-)

Cette liste pourra vous être utile si vous avez d'autres disques a activer :

"AEC62xx_IDE",  AEC62XX chipset support
"ALI15x3_IDE",  ALI M15x3 chipset support
"AMD_IDE",      AMD and nVidia IDE support
"ATIIXP_IDE",   ATI IXP chipset IDE support
"CMD64x_IDE",   CMD64{3|6|8|9} chipset support
"TRIFLEX_IDE",  Compaq Triflex IDE support
"Cypress_IDE",  CY82C693 chipset support
"Cyrix_IDE",    Cyrix CS5510/20 MediaGX chipset support (VERY EXPERIMENTAL)
"CS5530 IDE",   Cyrix/National Semiconductor CS5530 MediaGX chipset support
"CS5535_IDE",   AMD CS5535 chipset support
"HPT34x_IDE",   HPT34X chipset support
"HPT366_IDE",   HPT36X/37X chipset support
"JMicron IDE",  JMicron JMB36x support
"SC1200_IDE",   National SCx200 chipset support
"PIIX_IDE",     Intel PIIXn chipsets support
"ITE821x IDE",  IT821X IDE support
"NS87415_IDE",  NS87415 chipset support
"Promise_Old_IDE",  PROMISE PDC202{46|62|65|67} support
"Promise_IDE",  PROMISE PDC202{68|69|70|71|75|76|77} support
"Serverworks_IDE",  ServerWorks OSB4/CSB5/CSB6 chipsets support
"SiI_IDE",      Silicon Image chipset support
"SIS_IDE",      SiS5513 chipset support
"SLC90e66_IDE",  SLC90E66 chipset support
"TRM290_IDE",   Tekram TRM290 chipset support
"VIA_IDE",      VIA82CXXX chipset support 

Tous les disques utilisés par le systèmes doivent être en dur !

Support SATA

Les disques durs SATA fonctionnent avec le pilote SCSI. Pour pouvoir avoir les bonnes options :

Device Drivers  --->   
    SCSI device support  --->
        <*> SCSI disk support
        <M> SCSI CDROM support

On va encore utiliser udev pour savoir quels pilotes activer/désactiver : Par exemple pour /dev/sda :

udevinfo -a -p /sys/block/sda | grep -i DRIVERS
    DRIVERS=="sd"
    DRIVERS==""
    DRIVERS==""
    DRIVERS=="ahci"
    DRIVERS==""

Donc le pilote est ahci, pour savoir quelle option activer :

cd /usr/src/linux
find -name Makefile | xargs grep ahci
## Ce qui donne :
./drivers/ata/Makefile:obj-$(CONFIG_SATA_AHCI)          += ahci.o

Donc l'option est SATA_AHCI, on a juste à lancer une recherche (/) pour trouver la bonne option.

La section Network device support

Les options que l'on va modifier sont celles ci :

Network device support --->
    [*]   Ethernet (10 or 100Mbit)  --->
    [ ]   Ethernet (1000 Mbit)  --->
    [ ]   Ethernet (10000 Mbit)  --->

Vous l'aurez compris, on s'occupe de la carte reseau… Pour chaques interfaces (eth0 par exemple) utilisez udevinfo :

udevinfo -a -p /sys/class/net/eth0 | grep -i DRIVER
## Ce qui donne (exemple) :
DRIVERS=="8139too"
DRIVERS==""
DRIVERS==""

Toujours par la même méthode :

find /usr/src/linux -name Makefile | xargs grep 8139too
## Ce qui donne :
/usr/src/linux-2.6.23-gentoo-r9/drivers/net/Makefile:obj-$(CONFIG_8139TOO) += 8139too.o

Une petite recherche de 8139TOO vous donne l'option a activer. Je vous conseille de la mettre en dur dans le kernel.

Si vous avez une carte wifi je vous conseille d'aller faire un tour ici :

Device Drivers  --->
[*] Network device support  --->
Wireless LAN  --->
[*] Wireless LAN (IEEE 802.11)

La section Graphic support

Le frammebuffer peut être interessant à utiliser, c'est lui qui nous permet de regarder des video ou d'avoir un fond d'écran dans le tty. Mais cette option n'est pas obligatoire.

On travaille ici :

Device Drivers  --->
    Graphics support  --->
        <*> Support for frame buffer devices

Si vous apercevez le nom de votre carte graphique, vous pouvez la mettre en module.

Si vous voulez utiliser fbsplash je vous conseille d'activer ces options :

Device Drivers  --->
    Graphics support  --->
        <*> Support for frame buffer devices --->
            [*]   VESA VGA graphics support
        Console display driver support  --->
            <*> Framebuffer Console support
            [*]   Support for the Framebuffer Console Decorations

Votre kernel doit être assez bien configuré pour pouvoir démarrer maintenant. On doit donc le compiler puis l'installer. Ici encore il y a plusieurs écoles, je vais d'abord vous expliquer la méthode universelle puis ensuite d'autres méthodes qui permettent de faire les choses plus proprement…

En gros voici ce que l'on va faire :

  1. Compiler le kernel
  2. Placer le kernel construit dans /boot
  3. Configurer grub pour démarrer sur le nouveau kernel

La méthode universelle

On compile :

cd /usr/src/linux
make && make modules_install

On copie le kernel dans /boot : Vous pouvez lui donner le nom que vous voulez, ici l'exemple est pour l'architecture i386, mais si vous avez une autre architecture vous devez aller voir dans le dossier arch/

Ici i386 est à remplacer par votre architecture bien sûr
cp arch/i386/boot/bzImage /boot/kernel-2.6.VERSION

Je vous conseille aussi de copier votre configuration dans /boot :

cp .config /boot/config-2.6.VERSION
cp System.map /boot/System.map.2.6.VERSION

Ensuite éditez le fichier de configuration de grub /boot/grub/menu.lst puis rajoutez votre kernel :

title           Ubuntu GNU/Linux 2.6.VERSION (version perso)
root            (hd0,3)
kernel          /boot/kernel-2.6.VERSION root=/dev/hda4

title           Ubuntu GNU/Linux 2.6.VERSION (Rescue)
root            (hd0,3)
kernel          /boot/kernel-2.6.VERSION root=/dev/hda4 init=/bin/bb

(hd0,3) doit correspondre a la partition qui contient /boot. Pour grub, hda1=(hd0,0), ainsi hda4=(hd0,3). Vous pouvez bien sur rajouter des options dans la ligne "kernel", par exemple vga=791 (pour le frammebuffer, mais le nombre dépend de votre écran).

Un petit reboot et c'est bon ! 8-)

La Méthode "Debian"

Si vous êtes sous Debian (ou Ubuntu), il est plus malin de créer un paquet .deb pour installer votre kernel. Pourquoi ?

  1. Vous pourrez le réutiliser si vous faites une réinstallation.
  2. Vous pouvez l'installer et le supprimer facilement avec APT.
  3. Parce que c'est la classe de faire ses propres paquets :-O
  4. Parce que c'est plus simple et que ça va rajouter automatiquement votre kernel dans /boot/grub/menu.lst

Une seule commande ferra l'affaire :

cd /usr/src/linux
make-kpkg --append-to-version "-perso" --initrd -us -uc buildpackage

Dans cette commande, vous pouvez personnaliser le nom de votre kernel ("-perso").

Une fois que c'est fini, les paquets doivent être dans /usr/src et vous n'avez plus qu'à l'installer :

dpkg -i ../linux-image-2.6.24-perso.deb

Et voilà ! Grub est automatiquement mit à jours et votre kernel est disponible dans le menu de grub. Un petit reboot et vous voilà sur votre nouveau kernel.

Que faire en cas de mauvaise compilation ?

Si la compilation donne un kernel qui ne fonctionne pas bien, regardez les messages d'erreurs et allez faire des recherches et demandez de l'aide sur des forums ou sur IRC.

Puis recompilez votre kernel. Mais avant il faut supprimer les fichier qui on été crées pendant la compilation :

cd /usr/src/linux
make clean # Ne supprime pas le .config
make mrproper # Supprime aussi le .config

Si vous avez utilisé make-kpkg, il faut aussi supprimer les fichiers crées par l'utilitaire make-kpkg :

cd /usr/src/linux
make-kpkg clean

Liens

— Contributeurs : philpep-tlse


1)
entre autres
2)
comme Gentoo
3)
je vous aurais prévenus
4)
toutes ?
5)
i.e. version de base, c.f. vanilla dans "the Jargon File 4.4.7" 2009-02-25
6)
paquet qui est un lien vers un ou plusieurs paquets
7)
à modifier suivant la version de votre kernel
8)
Et je vous déconseille de le faire
9)
sauf si vous avez un matériel vraiment exotique
10)
sans blague ?
11)
Celles qui permettent de démarrer
  • tutoriel/compiler_linux.1270826535.txt.gz
  • Dernière modification: Le 18/04/2011, 14:50
  • (modification externe)