Comment compiler un noyau sur mesure ?

ou Comment personnaliser son noyau ? (On entend aussi souvent le mot anglais « kernel », qui signifie « noyau » en français)

Cette page ne semble plus à jour. Faites bien attention si vous suivez les indications de celle-ci, et sachez ce que vous faites : il se peut que la méthode soit désormais obsolète.

Dans la suite de ce didacticiel, le mot kernel est parfois utilisé car beaucoup d'entre vous l'ont entendu, ou l'entendront sûrement au milieu d'une conversation en français.

Avertissement

Compiler et utiliser un noyau personnalisé va rendre compliqué le support pour votre système. Vous ne serez pas autorisé à rapporter des bogues pour votre noyau personnalisé (ils seront rejetés sans explication).

Si vous avez un contrat de support commercial avec Ubuntu/Canonical, ceci rendra ce support caduc.

Notez par ailleurs que cette page décrit comment procéder pour le noyau d'Ubuntu 6.10 (2.6.17) ou ultérieur ! Les versions précédentes ne comprenaient pas, intentionnellement, un tel mécanisme permettant de compiler aisément son propre noyau.

Cette page ne décrit pas comment compiler les noyaux provenant de kernel.org. Elle est destinée aux sources du noyau Ubuntu.

Bonnes raisons de compiler un noyau personnalisé

  • Vous êtes un développeur du noyau.
  • Vous avez besoin de compiler d'une façon spéciale, que le noyau officiel n'offre pas (par exemple, pour activer des fonctionnalités expérimentales).
  • Vous essayez de déboguer un problème (pour lequel il serait peut-être judicieux de remplir un rapport de bogue à propos du noyau officiel Ubuntu).

Mauvaises raisons de compiler un noyau personnalisé

  • Vous avez à tout prix besoin de compiler un pilote spécial. Pour cela, il vous faut seulement installer les paquets linux-headers.
  • Vous n'avez pas la moindre idée de ce que vous faites et, si vous cassez quelque chose, vous aurez besoin d'aide pour réparer. Si vous détruisez votre système, réinstallez-le. Ne demandez de l'aide que si vous ne pouvez plus faire autrement.
  • Vous avez atterri sur cette page par erreur, mais vous la lisez car elle semble intéressante. Cela peut être intéressant, mais si vous ne savez pas ce que signifie le mot « processeur », alors laissez tomber tout de suite.

Pré-requis

Pour commencer, il faut installer certains paquets selon la version d'Ubuntu que vous utilisez

sudo apt-get install fakeroot kernel-wedge build-essential makedumpfile kernel-package

Cela va installer les outils relatifs à la compilation et l'empaquetage du noyau. Le paquet git-core, qui est le meilleur moyen pour interagir avec les sources du noyau Ubuntu, sera aussi installé.

Note : Le paquet linux-kernel-devel n'existe plus depuis Intrepid. Ainsi vous devez aussi lancer la commande suivante :

sudo apt-get build-dep linux

Téléchargement des sources

Il y a deux moyens pour obtenir les sources du noyau Ubuntu. Idéalement, il faudrait utiliser git. Les instructions détaillées pour l'utiliser sont disponibles sur https://wiki.ubuntu.com/KernelTeam/KernelGitGuide.

La seconde méthode est plus simple : installer le paquet linux-source

Cependant, ce ne sera pas toujours à jour. L'utilisation de git vous permet de toujours rester à jour avec la dernière version des sources du noyau Ubuntu.

Il faut maintenant décompacter le fichier que vous venez de télécharger

cd /usr/src

sudo tar --bzip2 -xvf linux-source

Adaptation des sources à vos besoins

Pour la majorité des gens, modifier seulement les fichiers de configuration suffira. Si vous devez appliquer un correctif, lisez les instructions données par le fournisseur du correctif.

Les configurations "officielles" Ubuntu se trouvent dans debian/config/ARCH/, où ARCH désigne l'architecture pour laquelle vous compilez. Plusieurs fichiers sont présents dans ce répertoire. Le fichier config est la base pour toutes les cibles de cette architecture. Ensuite, les nombreux fichiers config.FLAVOUR contiennent des options spécifiques à chaque cible. Par exemple, voici les fichiers pour le noyau 2.6.17, et l'architecture i386 :

$ ls -l debian/config/i386/
total 88
-rw-r--r-- 1 me me 62737 Jun 14 18:31 config
-rw-r--r-- 1 me me 1859 Jun 12 14:59 config.386
-rw-r--r-- 1 me me 1394 Jun 12 14:59 config.686
-rw-r--r-- 1 me me 1420 Jun 12 14:59 config.k7
-rw-r--r-- 1 me me 1519 Jun 12 14:59 config.server
-rw-r--r-- 1 me me 1867 Jun 12 14:59 config.server-bigiron

Si vous devez changer une option de configuration, modifiez simplement le fichier contenant l'option. Si vous éditez le fichier config, les changements affecteront toutes les architectures. Si vous modifiez un des fichiers cible, seule la cible sera affectée.

Note : Si aucun fichier n'est présent, vous pouvez en trouver dans le répertoire /boot. Par exemple :

$ ls -l /boot | grep config
-rw-r--r-- 1 root root   69733 2006-08-03 05:10 config-2.6.15-26-686
-rw-r--r-- 1 root root   69759 2006-08-03 05:36 config-2.6.15-26-k7

Suite à l'application d'un patch ou l'ajout d'une option, il est préférable de régénérer les fichiers de configuration. Il y a un "assistant" pour cela. Pour régénérer toutes les architectures, exécutez :

debian/rules updateconfigs

Si vous voulez mettre à jour une architecture seulement, exécutez :

debian/bin/oldconfig ARCH

Compilation du noyau

La compilation du noyau est une étape très simple. Selon vos besoins, vous pouvez vouloir compiler toutes les cibles, ou seulement celle spécifique à votre système. Cependant, vous désirez aussi vous assurer que ce que vous faites n'entre pas en conflit avec le noyau officiel.

Utilisez la commande suivante pour construire toutes les cibles de l'architecture pour laquelle vous compilez :

AUTOBUILD=1 fakeroot debian/rules binary-debs

La variable d'environnement AUTOBUILD déclenche des fonctionnalités spéciales pendant la compilation du noyau. Premièrement, cela n'effectue pas les vérifications normales d'ABI (l'ABI est la compatibilité binaire). Cela est rendu possible par le fait qu'un unique identifiant d'ABI (ABI ID) est créé. Si vous utilisez le depôt git, cet identifiant est généré depuis le git HEAD SHA. Sinon, il est généré à l'aide du programme uuidgen (ce qui signifie qu'à chaque exécution de la construction avec debian/rules, l'identifiant sera différent !). Le paquet créé sera nommé à l'aide de cet identifiant.

Pour construire une cible spécifique, utilisez la commande suivante :

AUTOBUILD=1 fakeroot debian/rules binary-debs flavours=k7

Ceci aura pour effet de ne compiler que la variante AMD k7 de l'architecture i386.

Sur certaine installation, le message suivant peut survenir :

debian/rules:1637: *** Error. I do not know where the kernel image goes to [kimagedest undefined] The usual case for this is that I could not determine which arch or subarch tihs machine belongs to. Please specify a subarch, and try again.. Arrêt.

Dans ce cas, utilisez la commande suivante :

KPKG_ARCH=i386 AUTOBUILD=1 fakeroot debian/rules binary-debs flavours=k7

avec i386 ou tout autre architecture.

Installation

Les paquets ainsi générés sont placés dans ubuntu-2.6/debian/build. Maintenant que la construction a réussi, vous pouvez installer les paquets à l'aide de dpkg :

sudo dpkg -i linux-image-2.6.17-2-ef427c-k7_2.6.17-2.2_i386.deb
sudo dpkg -i linux-headers-2.6.17-2-ef427c-k7_2.6.17-2.2_i386.deb

Note : Si vous utilisez les modules du paquet linux-restricted-modules, il sera nécessaire de les recompiler en utilisant votre nouveau paquet linux-headers. Des détails sur cette manipulation seront ajoutés ultérieurement


Contributeurs : mr_pouit

Basé sur https://wiki.ubuntu.com/KernelCustomBuild

Méthode alternative

Cette méthode a été testée avec succès sur une Ubuntu 10.04 (Lucid Lynx)

Pré-requis

Afin de permettre la compilation du noyau, il vous faut certains paquets, ouvrez un terminal et tapez :

sudo apt-get install build-essential bin86 kernel-package libqt3-headers libqt3-mt-dev bzip2

Téléchargement et préparation du noyau

Nous allons maintenant télécharger le nouveau noyau dans le dossier /usr/src/ et le décompresser et continuer le travail dans /usr/src/linux dans le terminal, tapez ceci :

cd /usr/src && sudo wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.34.tar.bz2 && sudo tar -xvjf linux-2.6.34.tar.bz2 && sudo rm -rf /usr/src/linux && sudo ln -s /usr/src/linux-2.6.34 /usr/src/linux && cd /usr/src/linux

(au besoin, adaptez la 2.6.27 pour avoir la version du noyau désirée) (attention, cette manipulation a été testée avec le noyau 2.6.34 donc, si vous modifiez la version du noyau, ce manuel peut être dangereux pour votre système)

Nous allons ensuite continuer en appliquant les derniers correctifs sur le noyau :

sudo wget http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.34.bz2 && sudo -s -H && bzcat patch-2.6.34.bz2| patch -p1

(à l'heure où j'écris ce manuel, la dernière version du patch est la 34, pour vérifier que c'est toujours votre cas, rendez-vous sur http://www.kernel.org/pub/linux/kernel/v2.6/ et cherchez patch-2.6.20.X si X est plus grand que 34 alors, remplacez les 34 dans la commande ci-dessus par la nouvelle valeur)

Importation des paramètres du noyau actuel et configuration

Nous allons maintenant procéder à la partie intéressante du sujet : la configuration du noyau

La commande suivante aura pour effet de copier vos paramètres actuels dans le nouveau noyau et de lancer l'utilitaire de configuration qui vous permettra de personnaliser votre noyau :

sudo cp /boot/config-`uname -r` .config && sudo make oldconfig && sudo make xconfig

(NB : le terminal va vous demander des choses, notamment le paramétrage de nouvelles fonctions du noyau inexistantes dans l'ancien, appuyez juste sur "entrée" à moins de savoir exactement ce que vous faites)

Après un petit moment, vous allez voir la fenêtre de configuration apparaître à l'écran. Je vous laisse le choix des choses que vous voulez dans votre noyau mais je vous conseille juste dans "kernel hacking" de désactiver l'option "kernel debugging" (sinon la compilation va prendre un espace disque monstrueux !)

Une fois que vous avez choisi vos options, n'oubliez pas de les sauvegarder ;) (la petite disquette en haut à gauche :D), ensuite, fermez la fenêtre de configuration.

Si vous utilisez la version serveur, c'est-à-dire sans interface graphique, il vaut mieux utiliser menuconfig (qui est l'équivalent de xconfig mais en mode console) que xconfig (qui cherche à se connecter à un serveur X). Pour utiliser menuconfig, il faut installer la librairie de développement ncurses. Ce qui donne :

 sudo apt-get install libncurses5-dev

Puis :

sudo cp /boot/config-`uname -r` .config && sudo make oldconfig && sudo make menuconfig

Compilation

Pour cette partie-ci, j'espère que vous n'êtes pas pressés car une compilation de noyau prend quand même du temps (de 1-3 heures en fonction de votre machine)

Pour lancer la compilation, dans le terminal, il vous suffit d'avoir la permission root et de taper :

sudo make-kpkg clean && sudo make-kpkg --initrd --revision=386monNoyau kernel_image kernel_headers modules_image

(NB : vous pouvez remplacer revision=386monNoyau par ce que vous voulez, ça ne change rien)

Et voila, vous devriez en avoir pour un bon bout de temps, c'est le moment d'aller promener le chien.

Installation du nouveau noyau

Voilà, la compilation est terminée, il vous reste juste à installer le nouveau noyau toujours dans le même terminal :

cd .. && dpkg -i linux*.deb

Ensuite, vous redémarrez l'ordinateur ;)

Ce document est une traduction d'un article créé par master_kernel, vous pouvez consulter le document original à cette adresse : http://ubuntuforums.org/showthread.php?t=311158&highlight=master+kernel merci à lui pour cet excellent tutoriel.

Liens

Tutoriel sympa : http://ubuntuforums.org/showthread.php?t=441013

Turoriel Comment compiler le dernier noyau pour Ubuntu 7.10 via GIT:http://liaudetgael.free.fr/spip.php?article21

Tutoriel Comment changer l'image de chargement du noyau:http://liaudetgael.free.fr/spip.php?article22


Contributeurs : Doyen

  • tutoriel/comment_compiler_un_kernel_sur_mesure.txt
  • Dernière modification: Le 28/04/2018, 11:24
  • (modification externe)