Compiler et patcher son noyau
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 :
- apt-get install build-essential kernel-package debconf-utils dpkg-dev debhelper ncurses-dev fakeroot
Dépendances pour menuconfig :
- apt-get install libncurses-dev
Dépendances pour gconfig :
- apt-get install libglade2-dev
Dépendances pour xconfig :
- 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)
- Stable : linux-source-2.6.26
- Unstable : linux-source-2.6.32
- Sid : linux-source-2.6.32
- Experimental (qui n'est pas à proprement parlé une branche) : linux-source-2.6.36
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:
- apt-get install linux-source-2.6.36
- cp /usr/src/linux-source-2.6.36.tar.bz2 /home/votre_user/src
- chown votre_user:votre_user /home/votre_user/src/linux-source-2.6.36.tar.bz2
- 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 -
- adduser laurent src
Adding user `laurent' to group `src' ...
Adding user laurent to group src
Done.
- 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
- I would suggest that people who compile new kernels should:
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...
~/src/linux$ make menuconfig
Nettement plus pratique, menu clair et navigable. Certainement le meilleur choix .
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 xconfig
~/src/linux-2.6.37-rc2$ make xconfig
Le plus agréable à utiliser.
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
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:
- 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" :
- 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
- exit
~/src/linux$
Si tout s'est bien passé vous devriez maintenant avoir une nouvelle entrée dans grub :
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)