Compiler et patcher son noyau

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche

Nous allons détailler ici les commandes à passer pour compiler un noyau à partir des sources, que vous aurez préalablement patchées...

Compiler son noyau n'est ni compliqué, il suffit de suivre la liste des commandes, ni risqué... En cas de problème, il vous suffira de revenir sur le dernier noyau fonctionnel.

Exemple avec le noyau 2.6.37-rc2

Prérequis

Installer les programmes nécessaires à la compilation :

  1. apt-get install build-essential kernel-package debconf-utils dpkg-dev debhelper ncurses-dev fakeroot

Dépendances pour menuconfig :

  1. apt-get install libncurses-dev

Dépendances pour gconfig :

  1. apt-get install libglade2-dev

Dépendances pour xconfig :

  1. apt-get install libqt3-mt-dev

Il vous faut aussi un espace disque suffisant, l'archive compressée fait 90 Mo, l'archive décompressée des sources du noyau Linux fait dans les 400 Méga octets... Comptez au minimum 2.5 Go si vous souhaitez compiler linux-image et linux-headers. Assurez vous que les paquets nécessaires soient au niveau du kernel à installer ( pas trop anciens).

Préparation et récupération des sources

Téléchargement des sources à partir de kernel.org

Tout le travail se fait dans son répertoire personnel, avec des droits restreints, inutile de compiler en étant root...

Aller dans son répertoire personnel : $ cd

Créer le répertoire de travail : $ mkdir src $ cd src ~/src$

Télécharger les sources :

~/src$ wget -c https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.37.2.tar.gz --2010-11-19 11:13:11-- https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.37.2.tar.gz Résolution de ftp.de.kernel.org... 62.201.161.85, 129.143.116.10, 137.226.34.42, ... Connexion vers ftp.de.kernel.org|62.201.161.85|:80...connecté. requête HTTP transmise, en attente de la réponse...200 OK Longueur: 92388836 (88M) [application/octet-stream] Sauvegarde en : «linux-2.6.37-rc2.tar.gz»

100%[=======================================================================================>] 92 388 836 87,5K/s ds 18m 38s

2010-11-19 11:31:49 (80,7 KB/s) - «linux-2.6.37.2.tar.gz» sauvegardé [92388836/92388836]

Obtenir les sources à partir des dépôts

Vous avez aussi la possibilité d'obtenir les sources à partir des dépôts Debian. Cas le plus simple : Les sources sont disponibles dans la branche dans laquelle vous êtes...

à ce jour (22 novembre 2010)

Connaître les sources disponibles pour votre système :

$ aptitude search linux-source v linux-source - p linux-source-2.6 - Linux kernel source for Linux 2.6 (meta-package) p linux-source-2.6.26 - Linux kernel source for version 2.6.26 with Debian patches p linux-source-2.6.27-git1-bling102008 - Linux kernel source for version 2.6.27-git1-bling102008 p linux-source-2.6.29.1-090425 - Linux kernel source for version 2.6.29.1-090425 p linux-source-2.6.32 - Linux kernel source for version 2.6.32 with Debian patches i linux-source-2.6.35 - Linux kernel source for version 2.6.35 with Debian patches i linux-source-2.6.36 - Linux kernel source for version 2.6.36 with Debian patches

Pour obtenir les sources, il suffit de se placer dans votre répertoire ~/src et de taper la commande :

$ cd $ mkdir src $ su - mot de passe:

  1. apt-get install linux-source-2.6.36
  2. cp /usr/src/linux-source-2.6.36.tar.bz2 /home/votre_user/src
  3. chown votre_user:votre_user /home/votre_user/src/linux-source-2.6.36.tar.bz2
  4. exit

$

Pour obtenir des sources qui réclament la modification de votre sources.list rendez-vous à cette page pour les explications. (Attention cette manipulation n'est pas sans risque et nécessite la mise en place d'un fichier "préferences")

Préparer la compilation du noyau

Une fois les paquets installés il va falloir décompresser les sources de votre futur noyau. Il est conseillé de déléguer les tâches de configuration du noyau à un utilisateur. Pour cela, l'utilisateur doit appartenir au groupe src. Pour ajouter par exemple l'utilisateur laurent au groupe src :

$ su -

  1. adduser laurent src

Adding user `laurent' to group `src' ... Adding user laurent to group src Done.

  1. exit

Ensuite il faut décompresser les sources de votre noyau.

On va décompresser les sources du noyau dans le répertoire de l'utilisateur et non dans le répertoire /usr/src comme trop de personnes ont tendance à le faire.

C'est Linus Torwarld en personne qui recommande de traiter les sources du noyau dans le répertoire de l'utilisateur !

From: Linus Torvalds (torvalds@transmeta.com)

I would suggest that people who compile new kernels should:
  • NOT do so in /usr/src. Leave whatever kernel (probably only the header files) that the distribution came with there, but don't touch it.
  • compile the kernel in their own home directory, as their very own selves. No need to be root to compile the kernel. You need to be root to install the kernel, but that's different.
  • not have a single symbolic link in sight (except the one that the kernel build itself sets up, namely the "linux/include/asm" symlink that is only used for the internal kernel compile itself).
And yes, this is what I do


Décompresser et dépaqueter les sources :

~/src$ tar xvzf linux-2.6.37.2.tar.gz ou ~/src$ tar xvjf linux-2.6.37.2.tar.bz2 (si vous avez téléchargé le bz2) ou ~/src$ tar xvJf linux-2.6.37.2.tar.xz (si vous avez téléchargé le xz)

On ajoute enfin le lien symbolique linux qui pointe vers le répertoire de vos sources. Ainsi suivant la version de nos sources on sait qu'elles se trouveront toujours dans le répertoire ~/src/linux :

~/src$ cd /usr/src

Remarque: Il est possible que le lien symbolique existe déjà, auquel cas il faudra l'effacer...

/usr/src$ sudo ln -s ~/src/linux-2.6.37.2 linux /usr/src$ cd ~/src ~/src$ sudo ln -s ~/src/linux-2.6.37.2 linux

Patcher les sources

Cette étape n'est absolument pas nécessaire, elle se trouve ici à titre d'exemple.

Dans cet exemple nous utiliserons un patch destiné au noyau 2.6.37

Récupérons le patch $ cd ~/src wget http://imanweb.free.fr/uploaded/autogroup.patch --2010-11-19 09:15:31-- http://imanweb.free.fr/uploaded/autogroup.patch Résolution de imanweb.free.fr... 212.27.63.165 Connexion vers imanweb.free.fr|212.27.63.165|:80...connecté. requête HTTP transmise, en attente de la réponse...200 OK Longueur: 10992 (11K) [text/plain] Sauvegarde en : «autogroup.patch»

100%[============================================================================================>] 10 992 20,7K/s ds 0,5s

2010-11-19 09:15:32 (20,7 KB/s) - «autogroup.patch» sauvegardé [10992/10992]

Appliquons le patch :

~/src$ cd linux && patch -p1 < ../autogroup.patch patching file include/linux/sched.h Hunk #3 succeeded at 1935 (offset -1 lines). patching file kernel/sched.c Hunk #2 succeeded at 616 (offset 10 lines). Hunk #3 succeeded at 2020 (offset 10 lines). Hunk #4 succeeded at 7967 (offset -17 lines). Hunk #5 succeeded at 8497 (offset -17 lines). Hunk #6 succeeded at 8522 (offset -17 lines). patching file kernel/fork.c patching file drivers/tty/tty_io.c patching file kernel/sched_autogroup.h patching file kernel/sched_autogroup.c patching file kernel/sysctl.c patching file init/Kconfig patching file Documentation/kernel-parameters.txt ~/src/linux$

Récupérer et peaufiner sa dernière configuration

les quotes entourant uname -r sont des quotes inversés (Alt Gr + 7)

~/src/linux$ cd ~/src ~/src$ cp -vi /boot/config-`uname -r` .config ~/src$ cd linux ~/src/linux$

Vous allez le voir dans la commande suivante: un nouveau menu a été ajouté, make localmodconfig.

Cette nouvelle commande va utiliser lsmod pour lister tous les modules actuellement en service elle lit les Makefiles, satisfait les dépendances, et crée une configuration purgée de tous les modules inutiles. Attention, il faut donc activer et brancher tous vos matériel, faute de quoi ils ne seraient pas pris en compte... Par exemple si vous utilisez des clef USB formatées en fat(16 ou 32) insérez-en une, faute de quoi l'option ne serait pas inclue dans le noyau.

La commande va vous poser beaucoup de question, j'ai répondu à chaque fois par "entrée" choix par défaut.

~/src/linux$ make localmodconfig

Si vous ne souhaitez pas passer en revue toutes les nouvelles options, préférez la commande :

~/src/linux$ yes "" | make localmodconfig

Il est possible (avec cette dernière commande) qu'il vous propose alors de mettre à jour la configuration avec "make oldconfig".

~/src/linux$ make oldconfig

Répondez aux questions. Les réponses par défaut sont généralement les bonnes.

Ajustement de la configuration et choix des options personnelles

Un dernier tour dans votre configuration pour une dernière vérification et des réglages :

~/src/linux$ make menuconfig

Il existe plusieurs interface pour configurer votre noyau, j'ai utilisé un interface console très austère mais très pratique (menuconfig). Pour lancer cette interface vous devez vous placer dans le répertoire qui contient les sources de votre futur noyau.

make config

~/src/linux$ make config

Très spartiate, très peu pratique, il faut faire son choix option par option...

make config

make menuconfig

~/src/linux$ make menuconfig

Nettement plus pratique, menu clair et navigable. Certainement le meilleur choix .

make menuconfig

make nconfig

~/src/linux$ make nconfig

Une version améliorée de menuconfig toujours en ncurse.

http://pix.isalo.org/upload/thumb/1329911740.png

make gconfig

~/src/linux-2.6.37-rc2$ make gconfig

Très joli...

make gconfig

make xconfig

~/src/linux-2.6.37-rc2$ make xconfig

Le plus agréable à utiliser.

make xconfig

Nettoyage

Un petit nettoyage : ~/src/linux$ make-kpkg clean

La compilation

~/src/linux$ fakeroot make-kpkg --initrd --append-to-version=-$(date '+%Y%m%d') kernel-image kernel-headers

La commande ci-dessus vous sortira une image nommée "linux-image-2.6.37-rc2-20101119_2.6.37-rc2-20101119-10.00.Custom_amd64.deb" La commande fakeroot permet de simuler l'environnement root au programme make-kpkg pour que ce dernier puisse générer les paquets de votre futur noyau. Cela à l'avantage d'éviter de faire la compilation en tant que root. Le nom peut être modifié en jouant sur le fichier /etc/kernel-pkg.conf afin de changer le «-10.00.Custom» en autre chose voire le supprimer. Il faut noter qu'il est *indispensable* que la chaine mise dans append-to-version contienne un chiffre faute de quoi la construction du paquet échouera (ça énerve après 1h de compilation). La date comme dans l'exemple donné est parfaite.

La compilation sur une machine puissante dure à peine 30 minutes. Cela peut dépasser plusieurs heures en fonction de votre configuration.

Vous pouvez également tirer parti des processeurs multi-cœurs / multi-thread en utilisant l'option -j de make-kpkg (tout comme avec make), suivi du nombre de processus maximum à lancer. Ainsi sur un core i5, avec 4 cœurs, et donc l'option -j 4, on passe de 90 minutes à 40 minutes de compilation. Voir une intéressante discussion sur la manière d'optimiser les temps de compilation sur : https://www.debian-fr.org/install-du-kernel-3-6-3-sous-squeeze-t40918.html

En cas d'échec

Rien n'est perdu, et il est facile de revenir au début pour recommencer.

Tout d'abord "nettoyer" le répertoire /src/linux

$ cd ~/src/linux ~/src/linux$ make clean

 CLEAN   .
 CLEAN   arch/x86/kernel/acpi/realmode
 CLEAN   arch/x86/kernel/cpu
 CLEAN   arch/x86/kernel
 CLEAN   arch/x86/vdso
 CLEAN   arch/x86/lib
 CLEAN   drivers/tty/vt
 CLEAN   drivers/video/logo
 CLEAN   firmware
 CLEAN   kernel
 CLEAN   lib
 CLEAN   security/selinux
 CLEAN   usr
 CLEAN   arch/x86/boot/compressed
 CLEAN   arch/x86/boot
 CLEAN   .tmp_versions
 CLEAN   vmlinux System.map .tmp_kallsyms1.o .tmp_kallsyms1.S .tmp_kallsyms2.o .tmp_kallsyms2.S .tmp_vmlinux1 .tmp_vmlinux2 .tmp_System.map

Pour recompiler à nouveau votre noyau, pas de problèmes car le .config a gardé toutes vos options en mémoire, il suffit donc de modifier les options que vous voulez par la commande

~/src/linux$ make menuconfig

Vous préférerez peut-être recommencer depuis le début :

~/src/linux$ cp -vi /boot/config-`uname -r` .config ~/src/linux$ make localmodconfig Etc.

Il faudra ensuite faire:

~/src/linux$ make-kpkg clean ~/src/linux$ fakeroot make-kpkg --initrd --append-to-version=-$(date '+%Y%m%d') kernel-image kernel-headers

Si vous n'avez pas besoin des "headers" du noyau :

~/src/linux$ make-kpkg clean ~/src/linux$ fakeroot make-kpkg --initrd --append-to-version=-$(date '+%Y%m%d') kernel-image

En cas de problème d'initramfs

Vous pourriez rencontrer le problème suivant au cours de la compilation :

make[1]: entrant dans le répertoire « /home/gerard/src/linux-2.6.37-rc4 »

making target debian/stamp/install/linux-image-2.6.37-rc4-i486 [new prereqs: ]

This is kernel package version 11.015. echo "The UTS Release version in include/linux/version.h"; echo " \"\" "; echo "does not match current version:"; echo " \"2.6.37-rc4-i486\" "; echo "Please correct this."; exit 2 The UTS Release version in include/linux/version.h "" does not match current version: "2.6.37-rc4-i486" Please correct this.

Solution :

> mettre à jour kernel-package;

Si ce n'est pas suffisant copier le contenu de /usr/share/kernel-package/examples/etc/kernel/postinst.d/ vers /etc/kernel/postinst.d/ (En particulier le script initramfs), puis :

dpkg-reconfigure linux-image-2.6.3xxxxx

ou

update-initramfs -c -k 2.6.3xxx

Source

Installation

Vous vous retrouvez avec deux paquets (si vous avez aussi compilé les "headers"), qu'il ne reste plus qu'a installer

~/src/linux$ su - mot de passe:

  1. dpkg -i linux-image-2.6.37-rc2-20101119_2.6.37-rc2-20101119-10.00.Custom_amd64.deb

Et si vous avez besoin des "headers" :

  1. dpkg -i linux-headers-2.6.37-rc2-20101119_2.6.37-rc2-20101119-10.00.Custom_amd64.deb linux-image-2.6.37-rc2-20101119_2.6.37-rc2-20101119-10.00.Custom_amd64.deb

  1. exit

~/src/linux$

Si tout s'est bien passé vous devriez maintenant avoir une nouvelle entrée dans grub :

make gconfig

Désinstallation

Si pour une raison ou une autre vous n'arrivez pas à démarrer sur votre nouveau noyau et que vous souhaitiez le désinstaller. Redémarrez sur le dernier noyau opérationnel, puis :

laurent@Squeeze:~$ su - Mot de passe : root@Squeeze:~# apt-get remove --purge linux-headers-2.6.37-rc2-20101121 linux-image-2.6.37-rc2-20101121 Lecture des listes de paquets... Fait ... Les paquets suivants seront ENLEVÉS :

 linux-headers-2.6.37-rc2-20101121* linux-image-2.6.37-rc2-20101121*

0 mis à jour, 0 nouvellement installés, 2 à enlever et 0 non mis à jour. Après cette opération, 71,3 Mo d'espace disque seront libérés. Souhaitez-vous continuer [O/n] ? o ... Generating grub.cfg ... ... root@Squeeze:~#

Lol 20 novembre 2010 à 11:02 (EAT)