Compiler et patcher son noyau

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

/!\ Ce document n'a pas été validé par la communauté. Soyez prudent vis-à-vis de son contenu! /!\

Attention: Si au cours de vos manipulations un problème survenait, vous ne pouvez en aucun cas incriminer ce site. Posez vos questions sur le forum.


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 d'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.

Préparation et récupération des sources

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 http://ftp.de.kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.37-rc2.tar.gz --2010-11-19 11:13:11-- http://ftp.de.kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.37-rc2.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-rc2.tar.gz» sauvegardé [92388836/92388836]

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-rc2.tar.gz

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-rc2 linux /usr/src$ cd ~/src ~/src$ sudo ln -s ~/src/linux-2.6.37-rc2 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... 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 menuconfig

~/src/linux$ make menuconfig

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

make gconfig

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

Très joli...

make xonfig

~/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.

En cas d'échec

Rien n'est perdu, et il est facile de revenir au début pour recommencer. 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

Installation

Vous vous retrouvez avec deux paquets, 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
# exit
~/src/linux$

Lol 20 novembre 2010 à 11:02 (EAT)