« Compiler et patcher son noyau » : différence entre les versions

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche
 
(39 versions intermédiaires par 7 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
<div style="background:yellow;border:2px orange solid;border-left:5px orange solid;padding-left: 10px">
'''/!\''' Ce document n'a pas été validé par la communauté. Soyez prudent vis-à-vis de son contenu! '''/!\'''<br/>
'''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 [http://forum.debian-fr.org forum].
</div>
Nous allons détailler ici les commandes à passer pour compiler un noyau à partir des sources, que vous aurez préalablement patchées...
Nous allons détailler ici les commandes à passer pour compiler un noyau à partir des sources, que vous aurez préalablement patchées...


Ligne 19 : Ligne 9 :
Installer les programmes nécessaires à la compilation :
Installer les programmes nécessaires à la compilation :


<code bash># apt-get install build-essential kernel-package debconf-utils dpkg-dev debhelper ncurses-dev fakeroot</code>
<code bash>
# apt-get install build-essential kernel-package debconf-utils dpkg-dev debhelper ncurses-dev fakeroot
</code>


Dépendances pour menuconfig :
Dépendances pour menuconfig :
<code bash># apt-get install libncurses-dev</code>
<code bash>
# apt-get install libncurses-dev
</code>


Dépendances pour gconfig :
Dépendances pour gconfig :
<code bash># apt-get install libglade2-dev</code>
<code bash>
# apt-get install libglade2-dev
</code>


Dépendances pour xconfig :
Dépendances pour xconfig :
<code bash># apt-get install libqt3-mt-dev</code>
<code bash>
# apt-get install libqt3-mt-dev
</code>
 
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 ==
== 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...
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 :
Aller dans son répertoire personnel :
$ cd
<code bash>
$ cd
</code>


Créer le répertoire de travail :
Créer le répertoire de travail :
$ mkdir src
<code bash>
$ cd src  
$ mkdir src
~/src$
$ cd src  
~/src$
</code>


Télécharger les sources :
Télécharger les sources :


<code>~/src$ wget -c http://ftp.de.kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.37-rc2.tar.gz
<code bash>
--2010-11-19 11:13:11--  http://ftp.de.kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.37-rc2.tar.gz
~/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, ...
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é.
Connexion vers ftp.de.kernel.org|62.201.161.85|:80...connecté.
Ligne 54 : Ligne 63 :
100%[=======================================================================================>] 92 388 836  87,5K/s  ds 18m 38s  
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]
2010-11-19 11:31:49 (80,7 KB/s) - «linux-2.6.37.2.tar.gz» sauvegardé [92388836/92388836]
</code>
 
=== 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 : [http://packages.debian.org/lenny/linux-source-2.6.26 linux-source-2.6.26]
* Unstable : [http://packages.debian.org/squeeze/linux-source-2.6.32 linux-source-2.6.32]
* Sid : [http://packages.debian.org/sid/linux-source-2.6.32 linux-source-2.6.32]
* Experimental (qui n'est pas à proprement parlé une branche) : [http://packages.debian.org/experimental/linux-source-2.6.36 linux-source-2.6.36]
 
Connaître les sources disponibles pour votre système :
 
<code bash>
$ 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
</code>
 
Pour obtenir les sources, il suffit de se placer dans votre répertoire ~/src et de taper la commande :
 
<code bash>
$ 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
$
</code>
</code>
Pour obtenir des sources qui réclament la modification de votre sources.list rendez-vous à [[L'etiquetage_de_paquets_via_le_fichier_/etc/apt/preferences|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 ==
== Préparer la compilation du noyau ==
Ligne 62 : Ligne 113 :
Pour cela, l'utilisateur doit appartenir au groupe src. Pour ajouter par exemple l'utilisateur laurent au groupe src :
Pour cela, l'utilisateur doit appartenir au groupe src. Pour ajouter par exemple l'utilisateur laurent au groupe src :


$ su -
<code bash>
# adduser laurent src
$ su -
Adding user `laurent' to group `src' ...
# adduser laurent src
Adding user laurent to group src
Adding user `laurent' to group `src' ...
Done.
Adding user laurent to group src
# exit
Done.
# exit
</code>


Ensuite il faut décompresser les sources de votre noyau.
Ensuite il faut décompresser les sources de votre noyau.
Ligne 86 : Ligne 139 :
Décompresser et dépaqueter les sources :
Décompresser et dépaqueter les sources :


~/src$ tar xvzf linux-2.6.37-rc2.tar.gz
<code bash>
~/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)
</code>


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


~/src$ cd /usr/src
<code bash>
~/src$ cd /usr/src
</code>


Remarque: Il est possible que le lien symbolique existe déjà, auquel cas il faudra l'effacer...
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
<code bash>
/usr/src$ cd ~/src                                                         
/usr/src$ sudo ln -s ~/src/linux-2.6.37.2 linux
~/src$ sudo ln -s ~/src/linux-2.6.37-rc2 linux
/usr/src$ cd ~/src                                                         
~/src$ sudo ln -s ~/src/linux-2.6.37.2 linux
</code>


== Patcher les sources ==
== Patcher les sources ==
Ligne 106 : Ligne 169 :


Récupérons le patch
Récupérons le patch
<code>$ cd ~/src
<code bash>$ cd ~/src
wget http://imanweb.free.fr/uploaded/autogroup.patch
wget http://imanweb.free.fr/uploaded/autogroup.patch
--2010-11-19 09:15:31--  http://imanweb.free.fr/uploaded/autogroup.patch
--2010-11-19 09:15:31--  http://imanweb.free.fr/uploaded/autogroup.patch
Ligne 121 : Ligne 184 :
Appliquons le patch :
Appliquons le patch :


<code>~/src$ cd linux && patch -p1 < ../autogroup.patch
<code bash>~/src$ cd linux && patch -p1 < ../autogroup.patch
patching file include/linux/sched.h
patching file include/linux/sched.h
Hunk #3 succeeded at 1935 (offset -1 lines).
Hunk #3 succeeded at 1935 (offset -1 lines).
Ligne 144 : Ligne 207 :
les quotes entourant uname -r sont des quotes inversés (Alt Gr + 7)
les quotes entourant uname -r sont des quotes inversés (Alt Gr + 7)


~/src/linux$ cd ~/src
<code bash>
~/src$ cp -vi /boot/config-`uname -r` .config
~/src/linux$ cd ~/src
~/src$ cd linux
~/src$ cp -vi /boot/config-`uname -r` .config
~/src/linux$
~/src$ cd linux
~/src/linux$
</code>


Vous allez le voir dans la commande suivante: un nouveau menu a été ajouté, make localmodconfig.
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.
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...
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.
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
<code bash>
~/src/linux$ make localmodconfig
</code>


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


~/src/linux$ yes "" | make localmodconfig
<code bash>
~/src/linux$ yes "" | make localmodconfig
</code>
 
Il est possible (avec cette dernière commande) qu'il vous propose alors de mettre à jour la configuration avec "make oldconfig".


Il est possible (avec cette dernière commande) qu'il vous propose alors de mettre à jour la configuration avec "make oldconfig". N'en faite rien, la commande suivante le fera de toute façon...
<code bash>
~/src/linux$ make oldconfig
</code>


Sauvegarde de la configuration générée :
Répondez aux questions. Les réponses par défaut sont généralement les bonnes.
~/src/linux$ cp /boot/config-$(uname -r) .config && yes "" | make oldconfig


=== Ajustement de la configuration et choix des options personnelles ===
=== 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 :
Un dernier tour dans votre configuration pour une dernière vérification et des réglages :
~/src/linux$ make menuconfig
 
<code bash>
~/src/linux$ make menuconfig
</code>


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.
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.
Ligne 175 : Ligne 251 :
==== make config ====
==== make config ====


~/src/linux$ make config
<code bash>
~/src/linux$ make config
</code>
 
Très spartiate, très peu pratique, il faut faire son choix option par option...
Très spartiate, très peu pratique, il faut faire son choix option par option...


[[Fichier:Config.jpeg]]
[[Fichier:Config.jpeg|120px||make config]]


==== make menuconfig ====
==== make menuconfig ====


~/src/linux$ make menuconfig
<code bash>
~/src/linux$ make menuconfig
</code>
 
Nettement plus pratique, menu clair et navigable. Certainement le meilleur choix .
Nettement plus pratique, menu clair et navigable. Certainement le meilleur choix .


[[Fichier:Makemenuconfig.jpeg]]
[[Fichier:Makemenuconfig.jpeg|120px||make menuconfig]]
 
==== make nconfig ====
 
<code bash>
~/src/linux$ make nconfig
</code>
 
Une version améliorée de menuconfig toujours en ncurse.
 
http://pix.isalo.org/upload/thumb/1329911740.png


==== make gconfig ====
==== make gconfig ====


~/src/linux-2.6.37-rc2$ make gconfig
<code bash>
~/src/linux-2.6.37-rc2$ make gconfig
</code>
 
Très joli...
Très joli...
[[Fichier:Gconfig.jpeg]]


==== make xonfig ====
[[Fichier:Gconfig.jpeg|120px||make gconfig]]
 
==== make xconfig ====
 
<code bash>
~/src/linux-2.6.37-rc2$ make xconfig
</code>


~/src/linux-2.6.37-rc2$ make xconfig
Le plus agréable à utiliser.
Le plus agréable à utiliser.
[[Fichier:Xconfig.jpeg]]
 
[[Fichier:Xconfig.jpeg|120px||make xconfig]]


=== Nettoyage ===
=== Nettoyage ===


Un petit nettoyage :
Un petit nettoyage :
~/src/linux$ make-kpkg clean
<code bash>
~/src/linux$ make-kpkg clean
</code>


== La compilation ==
== La compilation ==


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


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 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.
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
<code bash>
$ 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
</code>
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
<code bash>
~/src/linux$ make menuconfig
</code>
Vous préférerez peut-être recommencer depuis le début :
<code bash>
~/src/linux$ cp -vi /boot/config-`uname -r` .config
~/src/linux$ make localmodconfig
Etc.
</code>
Il faudra ensuite faire:
<code bash>
~/src/linux$ make-kpkg clean
~/src/linux$ fakeroot make-kpkg --initrd --append-to-version=-$(date '+%Y%m%d') kernel-image kernel-headers
</code>
Si vous n'avez pas besoin des "headers" du noyau :
<code bash>
~/src/linux$ make-kpkg clean
~/src/linux$ fakeroot make-kpkg --initrd --append-to-version=-$(date '+%Y%m%d') kernel-image
</code>
=== En cas de problème d'initramfs ===
Vous pourriez rencontrer le problème suivant au cours de la compilation :
<code>
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.
</code>
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
[http://www.debian-fr.org/nouveau-kernel-t30831.html Source]


== Installation ==
== Installation ==


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


~/src/linux$ su -
<code bash>
mot de passe:
~/src/linux$ su -
# dpkg -i linux-image-2.6.37-rc2-20101119_2.6.37-rc2-20101119-10.00.Custom_amd64.deb
mot de passe:
# dpkg -i linux-image-2.6.37-rc2-20101119_2.6.37-rc2-20101119-10.00.Custom_amd64.deb
</code>


Et si vous avez besoin des "headers" :
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
<code bash>
# 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
</code>
 
<code bash>
# exit
~/src/linux$
</code>


# exit
Si tout s'est bien passé vous devriez maintenant avoir une nouvelle entrée dans grub :
~/src/linux$
 
[[Fichier:Grub 2637.jpeg|120px||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 :
 
<code bash>
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:~#
</code>


[[Utilisateur:Lol|Lol]] 20 novembre 2010 à 11:02 (EAT)
[[Utilisateur:Lol|Lol]] 20 novembre 2010 à 11:02 (EAT)
[[Category:Kernel (Noyau)]]
[[Category:Kernel (Noyau)]]

Dernière version du 14 février 2015 à 11:09

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)