Compiler le Kernel


 ericc    mar. 30 août : 19:26
 Aucun    Tutoriels

The Debian way

The Debian way

1° Introduction
Vous ne serez jamais un vrai utilisateur de Linux tant que vous n'aurez pas compilé votre kernel vous même !!
Bon sérieusement, on s'en fout ! Compiler son kernel était quelque chose d'assez commun dans le passé mais aujourd'hui les kernel fournis de base par les distributions sont suffisamment stables et supportent quasiment tout le matériel moderne.
On peux très bien être un utilisateur Linux de longue date et n'avoir jamais eu besoin de compiler son kernel

Cependant, il peux être intéressant dans certain cas de réduire la taille du kernel ou d'avoir une nouvelle version non disponible dans votre distribution et qui supporte cette nouvelle carte Ethernet que vous venez juste d'acheter ou d'ajouter certaine fonctions non disponible dans le kernel de base (patch)

Pas de panique, compiler un kernel est finalement assez simple et les risques de tout casser quasiment nul. Il suffit de prendre temps et de suivre scrupuleusement la procédure

2° Programmes nécessaires
Pour compiler un kernel vous allez avoir besoin d'un certain nombres de programmes qui ne sont nécessairement installé sur votre machine ...
apt-get install gcc kernel-package libc6-dev tk8.3 libncurses5-dev fakeroot build-essential libqt3-mt-dev
devrait faire l'affaire. Installez aussi toutes les dépendances.
"libncurses5-dev" est utile si vous travaillez à partir de la console (pas le terminal sous X)
"tk8.3" et "libqt3-mt-dev" ne sont utile que si vous utilisez le menu sous X
(ceci dit, il n'y a pas de conflit entre les packages ! Si vous installez le tout, ce n'est pas un problème)

3° Kernel sources
Maintenant il vous faut les sources du kernel.
Vous avez 2 choix qui ont forcement des conséquences par la suite.
Vous devez savoir que toutes les distributions apportent des modifications aux kernels officiels et Debian n'échappe pas à la règle.

Donc, sauf si vous avez vraiment besoin d'une option qui ne se trouve QUE dans le kernel officiel, il est plus que conseillé d'utilisé les sources de votre distribution qui contiennent déjà les patchs.
Sinon, vous devrez ré-appliquer manuellement les patchs de Debian pour être sur que tout votre matériel sera pris en compte

Pour la suite du tutoriel, je vais assumer que vous souhaitez simplement adapter le kernel existant.
Vous devez tout d'abord, connaitre la version de votre kernel.
~$ uname -r
2.6.38-8-generic

Donc on va installer les sources Debian (ou Ubuntu) qui correspondent à cette version.
~$ apt-get install linux-source-2.6.38
ou plus simplement
~$ apt-get install linux-source-2.6.38
qui download la dernière version
Cette commande ne fait que downloader le (l'énorme) package et le décompresser dans le répertoire /usr/src. Dans ce répertoire vous trouverez donc une archive "linux-source-2.6.38.tar.bz2", qu'il faut à nouveau décompresser
~$ tar xjvf linux-source-2.6.38.tar.bz2

Vous devriez optenir un répertoire "linux-source-2.6.38".
Maintenant, dernière étape il faut créer un lien symbolique vers ce répertoire
~$ ln -s linux-source-2.6.38 linux

4° Versions minimales
Pour que la compilation se passe correctement, vous devez avoir installé un certain nombre d'utilitaires avec une version minimale.
Elles sont listées dans le fichier :
~$ less /usr/src/linux/Documentation/Changes
Exemple :
Current Minimal Requirements
============================

Upgrade to at *least* these software revisions before thinking you've
encountered a bug! If you're unsure what version you're currently
running, the suggested command should tell you.

Again, keep in mind that this list assumes you are already functionally
running a Linux kernel. Also, not all tools are necessary on all
systems; obviously, if you don't have any ISDN hardware, for example,
you probably needn't concern yourself with isdn4k-utils.

o Gnu C                 3.2                    # gcc --version
o Gnu make              3.80                   # make --version
o binutils              2.12                   # ld -v
o util-linux            2.10o                  # fdformat --version
o module-init-tools     0.9.10                 # depmod -V
o e2fsprogs             1.41.4                 # e2fsck -V
o jfsutils              1.1.3                  # fsck.jfs -V
o reiserfsprogs         3.6.3                  # reiserfsck -V
o xfsprogs              2.6.0                  # xfs_db -V
o squashfs-tools        4.0                    # mksquashfs -version
o btrfs-progs           0.18                   # btrfsck
o pcmciautils           004                    # pccardctl -V
o quota-tools           3.09                   # quota -V
o PPP                   2.4.0                  # pppd --version
o isdn4k-utils          3.1pre1                # isdnctrl 2>&1|grep version
o nfs-utils             1.0.5                  # showmount --version
o procps                3.2.0                  # ps --version
o oprofile              0.9                    # oprofiled --version
o udev                  081                    # udevd --version
o grub                  0.93                   # grub --version || grub-install --version
o mcelog                0.6                    # mcelog --version
o iptables              1.4.2                  # iptables -V
Comme vous pouvez le constater, le fichier vous donne la liste des utilitaires, la version minimale pour pouvoir compiler le kernel et la commande correspondante vous permettant de connaitre la version installée sur votre système ...
Un script est fourni permettant de lister directement la plupart des versions:
~$ /usr/src/linux/scripts/ver_linux
If some fields are empty or look unusual you may have an old version.
Compare to the current minimal requirements in Documentation/Changes.
Â
Linux predator 3.0.0-1-amd64 #1 SMP Sun Jul 24 02:24:44 UTC 2011 x86_64 GNU/Linux
Â
Gnu CÂ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â 4.6.1
Gnu make              3.81
binutils              2.21.52.20110606
util-linux            2.19.1
mount                 support
module-init-tools     3.16
e2fsprogs             1.42-WIP
PPPÂ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â 2.4.5
Linux C Library       2.13
Dynamic linker (ldd)Â Â 2.13
Procps                3.2.8
Net-tools             1.60
Kbd                   1.15.3
Sh-utils              8.5

Je vous conseille fortement de relever le maximum d'information sur la configuration matérielle de votre machine (processeur, mémoire installé, marque et modèle de votre carte vidéo, son, Ethernet ...) avec lspci et lsusb

5° Configuration et Compilation
Quand tout est en ordre, on peux commencer.
Par habitude, je fais toutes les opérations suivante sous la console (Ctrl+Alt+F1). en ayant au préalable fermé toutes les applications qui tournent (Firefox, Evolution, ...etc) et mettre déloggué de l'interface graphique.
Cela permet d’économiser de la puissance et donc de compiler plus rapidement et évite toute possible interférence.

Commençons donc par faire un peu de ménage:
~$ cd /usr/src/linux
~$ make clean
~$ make mrproper

Maintenant il nous faut une configuration. Deux choix s'offre à vous, soit vous démarrez avec une configuration par défaut
~$ make defconfig
ou vous repartez de la configuration actuelle de votre kernel
~$ cp /boot/config-`uname -r` ./.config
dans ce cas, il faudra aussi faire un
~$ make oldconfig
cette commande est particulièrement utile si la version de vos sources est plus récente que votre kernel actuel. Elle permet de remettre les paramètres à leurs places correcte.

Maintenant, on attaque le gros morceau, on lance l'interface de configuration:
~$ make menuconfig
Menuconfig
ou si vous êtes dans l'interface graphique
~$ make xconfig
Xconfig

Dans la fenètre en ligne de commande, on se déplace avec les flèches du clavier.
On rentre dans les sous menu avec la touche "Enter" et on en sort avec la touche "Esc".
Un appuis sur la touche "?" permet d'obtenir de l'aide (très important)
la touche "Y" permet d'inclure un drivers directement dans le kernel, la touche "M" met se drivers en module (ne sera charger qu'en cas de besoin), la touche "N" désactive le drivers.

Attention, certain drivers doivent être disponnible directement au boot du système c'est dire compiler dans le kernel et non pas en module.
Par exemple (mais ce n'est qu'un exemple), si votre disque de démarrage (/) est un disque ATA, le drivers ATA doit être dans le kernel sinon vous ne pourrez pas booter

Malheureusement je ne peux pas vous aidez beaucoup plus sur ce point. Chacun à sa propre configuration matérielle et je n'ai pas la volonté de passer en revue chaque option de chaque menu.

Un conseil avisé issue d'une longue pratique : partez de la configuration actuelle de votre kernel (qui fonctionne à coup sur) et ne faites qu'un nombre limités de modification. Ensuite compilez le kernel, testez le et si tout fonctionne, faites encore quelques modifications et ainsi de suite ...
Conservez à l'esprit que quoiqu'il arrive, vous aurez toujours l'option de booter sur votre kernel actuel

Parmi les modifications les plus simples:
Désactivez tout les drivers qui ne vous sont pas utile. Par exemple dans les cartes réseaux ("Device Drivers" arrow "Network device support" arrow "Ethernet (...)", vous verrez que TOUTES les cartes Ethernet, même les plus anciennes comme des 3com 3c900, sont compilés en module. Il y a même des cartes 10Gb ...
Vous pouvez sans trop de risque en désactivé 95% et ne conserver que le modèle qui est actuellement réellement installé dans votre machine.

Prenez votre temps, réfléchissez, et en cas de doute conservez la configuration actuelle et/ou mettez en module

Gardez à l'esprit que si vous désactivez un module, si un jour par hasard vous devez ajoutez une carte dans votre machine, vous devrez peut être recompiler le kernel pour pouvoir l'utiliser (mais honnêtement cela à combien de chance d'arriver ... seule exception, les drivers USB ...)

Après ce long et stressant travail, vous devez sauvegarder votre nouvelle configuration !!


Quand c'est terminé, vous êtes pret pour compiler le nouveau kernel.
Un petit coup de ménage pour que cela brille :
~$ fakeroot make-kpkg clean
et on y va :
~$ fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image
Cette commande va créer un package Debian de votre nouveau kernel que vous pourrez installer (et donc désinstaller !!) comme tout package Debian cool
--initrd : permet de générer le initramfs qui s'occupe du préboot
--append-to-version : comme son nom l'indique, ajoute le texte après le = (dans l'exemple '-custom') au numero de la version du kernel. Vous pouvez mettre ce que vous voulez mais évitez les architectures comme "amd64" ou "i386" qui sont utilisés par Debian. Je vous conseille d'utiliser un n° de version qui vous permet de vous retrouver comme "ericc_01" ou "20110830" pour un kernel compilé le 30 Aout 2011. Pas d'espace dans le nom et évitez les caractères spéciaux
kernel_image : va créer le package pour l'image du kernel (avec les modules). Vous pouvez aussi ajouter "kernel_headers" qui créera un package avec les headers de votre kernel, bien utile pour créer des modules supplémentaires par la suite (comme ceux de Virtual Box par exemple)

Après un certain temps, voir même un temps certain suivant la puissance de votre machine (dans tout les cas vous avez le temps de fumer au moins 1 clope bien méritée), vous devriez avoir un nouveau package Debian dans le répertoire "/usr/src". Il vous suffit donc de l'installer comme n'importe quel package :
~$ dpkg -i kernel-image-3.0.0.custom.deb

et vous rebootez, le nouveau kernel doit apparaitre dans les choix de grub

Et voila, c'est tout !!
N'oubliez pas de tout tester ... et ne supprimez pas le kernel de base qui vous permettra de booter au cas ou quelques chose ne fonctionnerais pas comme prévu.

Rappel : l'option "GRUB_DEFAULT" dans le fichier '/etc/default/grub' vous permet de spécifier la configuration qui sera booter par défaut par Grub, si l'utilisateur ne fait aucun choix !!

6° Patch
Il se peux dans certain cas que vous soyez obligé de patcher le kernel, pour corriger un problème, ou plus fréquemment, pour apporter une nouvelle fonctionnalité (supporter une nouvelle carte qui n'est pas encore supportée dans le kernel officiel, pouvoir afficher un splash screen, ...etc)
La première chose à prendre en compte, c'est de downloader la bonne version du patch qui correspond exactement à votre version du kernel.
Le patch va apporter des modifications dans le code source du kernel, il est donc important que les lignes correspondent sinon vous risquez des catastrophes (le moins pire est que le kernel ne se compile pas rolleyes !)

Un patch est un simple fichier texte (faites attention, pour le downloader, il faut donc faire un click-droit sur le lien, et choisir "save as") qui contient des instructions pour les modifications du code (supprimer telle ligne, remplacer tel ligne par truc, ajouter tels lignes ...)

On applique le patch avant de faire la configuration du kernel. Certain patch ajoutant des options dans celle-ci.

Une fois que vous avez downoader le fichier (par exemple : toto.patch), on va d'abord le tester.
~$ patch -p1 --dry-run < toto.patch
l'option "dry-run" indique que aucune modification ne sera réellement apporté au code source. L'application "patch" va simplement afficher les modifications apportés "théoriquement".
Il est important de regarder attentivement le résultat de cette commande. Si vous voyez la moindre erreur, généralement parce que votre version du patch ne correspond pas à votre version du kernel, je vous conseille fortement de ne rien faire et d'essayer de contacter le(s) développeurs en rapportant les erreurs trouvés.
Si aucune erreur n'apparait, on peux y aller pour de bon
~$ patch -p1 < toto.patch

Voila c'est tout ! pas de quoi en faire un fromage wink
Â

Have fun

ericc me