Cette page n'a pas encore d'étiquettes.
Apportez votre aide…

Ceci est une ancienne révision du document !



Comment compiler un kernel sur mesure ? (ancienne méthode)

  • Warty, Hoary et Breezy.
  • Pour les versions suivantes, utilisez cette page.

Note du traducteur: kernel ici signifie noyau en français, je n'ai pas traduit ce mot car beaucoup d'entre vous l'ont entendu, ou l'entendront sûrement au milieu d'une conversation en français, cependant il est important d'en comprendre le sens pour mieux le situer dans le fonctionnement du système.

Le kernel Linux est le coeur du système d'exploitation Ubuntu. Le kernel fourni par Ubuntu devrait normalement vous fournir tous les pilotes nécessaires, mais dans le cas où vous souhaiteriez le modifier, le reconfigurer ou simplement auriez besoin de le recompiler pour quelques raisons que ce soit, ce guide devrait vous aider.

Vous aurez besoin des paquets build-essential fakeroot et kernel-package, pour faire un nouveau kernel.

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

les kernels se font dans le dossier /usr/src, pour travailler dans ce dossier ajoutez vous au groupe src:

 sudo adduser <user> src

en remplacant <user> par votre login. Fermez puis relancez la session, ou relancez une nouvelle session avec su

 su <user>
 groups
user src audio adm dialout cdrom floppy video plugdev lpadmin

groups listera tous les groupes dans lesquels vous êtes, src doit normalement apparaitre dans la liste. Si vous vous êtes logué dans votre session bash par un nouveau su la commande exit en tant que user fermera cette nouvelle session et vous redonnera l'ancienne qui était loguée sans appartenir au groupe src.

Cherchez les sources du kernel que vous souhaitez avec:

 apt-cache search source 2.6

Choisissez la version des sources du kernel que vous désirez.

  • Question: Le paquet des sources du kernel s'appelle quelques fois kernel-source-2.6.5 etc… et d'autres linux-source-2.6.8.1. Pourquoi ?

Le paquet kernel-source viens de Debian, le linux-source de Ubuntu. Utilisez linux-source si possible. Toutes les dépendances n'ont pas encore été changées, donc si vous avez des messages d'avertissements à propos de "paquet kernel-source non-installé" même si linux-source est installé, vous pouvez les ignorer sans problèmes. –Bronson

Téléchargez les sources du kernel : (ici nous utilisons la version par defaut installée avec Ubuntu Hoary 2.6.10-5)

 sudo apt-get install linux-source-2.6.10

Il va probablement vous proposer d'installer deux paquets libncurses-dev et libqt3-dev, le premier est nécessaire pour le menuconfig et le second pour le xconfig, installez au moins l'un des deux. (Nous verrons plus loin pourquoi) (Pour se servir toutefois de gconfig, il est nécessaire d'avoir le paquet libglade2-dev.)

Les sources vont êtres téléchargées et installées dans /usr/src

Je vais prendre le kernel 2.6.10 comme exemple, c'est la version installée avec Ubuntu Hoary

 cd /usr/src
ls -l
linux-source-2.6.10.tar.bz2

Si vous voyez un lien nommé linux pointant sur les sources d'un ancien kernel supprimez le.

 rm linux

Attention: ne decompressez pas les sources tant que ce lien existe. Si les sources sont décompressées dans le répertoire des anciennes, la compilation ne marchera pas.

Et décompressez l'archive avec:

tar jxvf linux-source-2.6.10.tar.bz2

pour en savoir plus sur la commande tar c'est ici

Cela devrait créer un dossier linux-source-2.6.10 dont vous êtes le propriétaire et appartenant au groupe src

Créez un lien symbolique nommé linux vers le dossier des sources

 ln -s linux-source-2.6.10 linux

Vérifiez que tout est en ordre. Vous devriez obtenir quelque chose comme ça :

ls -F
linux@  linuxsource-2.6.10/  linux-source-2.6.10.tar.bz2

Pour configurer votre kernel, vous disposez de plusieurs interfaces possibles, vous pourrez y accéder en utilisant l'une de ces options derrière make:

  • xconfig en qt
  • gconfig en gtk
  • menuconfig en ncurses
  • config en text

Choisissez en une à votre goût, puis rendez vous dans le dossier /usr/src/linux:

cd ./linux

Et lancez-la.

Par exemple pour lancer l'interface qt:

 make xconfig

Note : si vous avez un message d'erreur au lancement de make xconfig, vous pouvez avoir besoin d'installer les packages de développement de QT:

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

Si vous n'utilisez pas X, ou si vous ne voulez pas utiliser votre souris:

make menuconfig

Il existe deux façons d'intégrer une option dans le kernel:

  • en dur c'est à dire que l'option est integrée au kernel et ne peut pas en être dissociée
  • en module l'option, peut être ajoutée ou retirée du kernel pendant que celui-ci est en marche (avec les commandes modprobe ou insmod pour charger le module ou rmmod pour le decharger).

Mettre une option en module permet d'alléger le noyau sans lui retirer de fonctionnalités. Cependant on ne peut pas tout mettre en module, certaines options ne peuvent être ajoutées qu'en dur et d'autres ne sont utilisables pour vous qu'en dur. Ainsi, vous devrez vous assurer que les pilotes de votre bus, disques, et système de fichiers sont compilés en dur (et non en module) dans votre kernel. Dans le cas contraire votre kernel ne se lancera pas.

Toute votre configuration sera sauvegardé dans /usr/src/linux/.config nous verrons plus loin comment réutiliser ce fichier.

Connaitre les composants exacts de sa machine n'est pas toujours facile (surtout si ce n'est pas votre machine), pensez à utiliser des commandes comme lspci, lshw, lspnp, lsusb, lsmod, etc… Elles vous seront d'un grand secours pour savoir quels sont les chipset que vous utilisez et quels sont les modules qui sont chargés.

make-kpkg

Pour faire la nouvelle image du kernel nous allons utiliser "make-kpkg", un script qui automatisera la séquence make dep; make clean; make bzImage; make modules. Prenez quelques minutes pour regarder les pages du manuel de make-kpkg. La ligne de commande make-kpkg peut être complexe et au premier abord quelque peu intimidant. Sa syntaxe basique est:

make-kpkg <options> <cible>

Nous utiliserons kernel_image en cible, cela permet de créer un paquet qui contient l'image du kernel, ses modules et permet aussi la configuration automatique de Grub ou de LILO.

Examinons quelques options importantes et couramment utilisées.

--append-to-version

La première option vous permet de rajouter quelque chose à la version du kernel. Vous pouvez utiliser des caractères alphanumériques et les caractères "+" et ".", n'utilisez pas d'underscore "_".

Voila la version du kernel que j'utilise maintenant:

 uname -r
2.6.10-5-k7

Vous devriez éviter d'utiliser –append-to-version avec des valeurs comme "-686", "-k7", "-sparc". Elles sont habituellement utilisées pour les kernels précompilés.

Les modules du kernel se trouvent dans /lib/modules. Chaque kernel a son sous-répertoire pour ses modules. A chaque fois que vous installez un kernel avec un nom différent, l'installateur du paquet crée un nouveau sous-répertoire dans /lib/modules pour le mettre.

Cela signifie qu'en utilisant une nouvelle valeur pour –append-to-version à chaque nouvelle recompilation, vous vous assurez de ne pas avoir de conflits entre les modules de deux kernels différents.

Si vous installez un kernel avec le même nom (même version et –append-to-version) qu'un kernel déjà présent, le paquet du nouveau kernel écrasera l'ancien et ses modules. Cependant, vous serez averti et aurez une chance d'annuler l'opération. Vous pourrez donc relancer la compilation de votre kernel avec un –append-to-version différent.

--revision

Une autre option de make-kpkg est "–revision". Elle affecte le nom du paquet Debian mais pas celui du kernel. Comme "–append-to-version", vous pouvez utiliser des caractères alphanumériques, "+" et ".". N'utilisez pas d'underscore "_". Si vous ne donnez pas de valeur à –revision, make-kpkg utilisera "10.00.Custom".

Puisque –revision n'affecte pas la version du kernel en elle-même, elle n'évitera pas de conflit entre deux versions identiques. Cette option ne sert que pour que vous puissiez voir la différence entre deux paquets que vous avez recompilés avec de petits changements.

--initrd

Cette option crée un fichier initrd qui permet d'utiliser des modules directement à l'amorçage du kernel. Vous aurez besoin de ces deux packages pour utiliser cette option:

apt-get install cramfsprogs initrd-tools

Nom de paquets du kernel

Les paquets contenant les images kernels (c'est à dire le résultat d'une compilation de source du kernel) avec Debian sont de la forme:

kernel-image-(version du kernel)(–append-to-version)_(–revision)-(architecture).deb

Le nom du paquet est toute la partie précédent le premier underscore:

ls
kernel-image-2.6.10.181004_10.00.Custom_i386.deb

Maintenant vous comprenez pourquoi les underscores ne sont pas autorisés avec make-kpkg: ils séparent les éléments du nom du paquet.

Je vous recommande d'utiliser plusieurs –append-to-version différents à chaque compilation, et de laisser make-kpkg assigner le –revision par défaut. J'utilise la date pour faire mon –append-to-version, mais vous êtes libres de créer vos propres méthodes.

N'oubliez pas: si –append-to-version ou –revision ne vous semble toujours pas clair, ou si vous souhaitez utiliser d'autres options. Lisez /usr/share/doc/kernel-package/README.gz (utilisez la commande "zless").

Fakeroot

Lorsque vous vous êtes ajouté au groupe src, vous avez rendu possible à votre utilisateur de faire la plus grande partie du paquetage du kernel possible. Cependant les fichiers qui font partie d'un paquet du kernel (comme le kernel ou ses modules) doivent appartenir au root et être executés avec des droits root, ils doivent donc être crées avec des droits root.

En utilisant fake-root vous pourrez lancer make-kpkg en tant que simple utilisateur, et la majeure partie du travail sera faite avec des permissions normales. Vers la fin de l'empaquetage, fakeroot simulera un environnement de root pour créer le paquet kernel-image.

Les pages du manuel de make-kpkg proposent une façon de l'utiliser avec fakeroot. Nous allons utiliser la méthode la plus simple en mettant fakeroot au début de la ligne de commande de make-kpkg, comme ceci:

fakeroot make-kpkg <options> <target>

Faire l'image du kernel

Finalement ! Vous êtes fin prêt à créer votre paquet

 fakeroot make-kpkg clean

Puis:

 fakeroot make-kpkg --append-to-version=.181004 --initrd kernel_image

Maintenant tout ce qu'il vous reste à faire, c'est d'attendre que votre machine ait fini la création du paquet. Prenez quelques minutes et détendez vous pendant que l'ordinateur fait sa part du travail. ;-)

Une fois le kernel compilé, vous devez installer le paquet kernel-image, qui contient le kernel et tous ses modules. Tout d'abord assurez-vous que la compilation est réussie en regardant le contenu du répertoire /usr/src

 cd ..
 ls -1
kernel-image-2.6.10.181004_10.00.Custom_i386.deb
linux
linux-source-2.6.10
linux-source-2.6.10.tar.bz2

Il est là!

Pour installer le kernel et tous ses modules:

 sudo dpkg -i kernel-image-2.6.10.181004_10.00.Custom_i386.deb

Pour installer le paquet kernel-image depuis votre disque dur, vous devez spécifier le nom exact du paquet. Pensez à utiliser l'auto-complétion avec la touche tab.

Si tout s'est bien passé, tout ce qu'il vous reste à faire maintenant c'est de redémarrer. Si votre nouveau kernel ne démarre pas, relancez l'ancien au menu de sélection de Grub. Revenez à la configuration de votre kernel et changez-le autant que nécessaire, puis relancez le.

Garder ce kernel !

Si vous avez utilisé –append-to-version vous n'avez pas besoin de vous inquiéter qu'apt-get mette à jour votre kernel. Si vous êtes paranoïaque, vous pouvez vous assurez tout de même de le garder avec ça:

 echo "kernel-image-2.6.10.181004 hold" | sudo dpkg --set-selections

Bien sûr utilisez le nom du paquet que vous voulez garder (il faut qu'il soit installé ou connu de la liste de dpkg). Vérifiez que le paquet soit bien marqué en "hold" avec:

dpkg --get-selections | grep kernel-image
 kernel-image-2.6.10.181004_10.00.Custom_i386.deb    hold

Supprimer les liens symboliques

Ensuite vous devriez vous occuper des liens symboliques créés dans le répertoire /usr/src. Il y a plusieurs raisons de le faire:

  1. La prochaine fois que vous téléchargerez un kernel, ce ne sera peut-être pas un paquet .deb. Lorsque vous le décompresserez il se peut qu'il écrase vos anciennes sources à cause du lien.
  2. La prochaine fois que vous téléchargerez les sources du kernel en .deb, vous allez peut-être décompresser les sources sans problème, puis les compiler en oubliant que linux pointait sur vos anciennes sources.
  3. Lorsque vous téléchargez des patchs ou d'autres codes sources et que vous les placez dans /usr/src vous ne voudrez sûrement pas qu'elles se mélangent avec. En supprimant le lien symbolique vous empêcherez #1 d'arriver.

Pour supprimer le lien faites:

rm linux

Sauvegarder votre kernel

C'est toujours une bonne idée de garder le .deb de votre kernel. Copiez-le dans un endroit sûr à l'abri

{!}Une fois votre kernel empaqueté, vous pouvez l'installer sur n'importe quelle machine utilisant apt et ayant une configuration compatible avec les options que vous avez choisi pour votre kernel.

Faire une nouvelle disquette de démarrage

Si vous souhaitez créer une disquette de démarrage avec votre nouveau kernel, il vous suffit de vous munir d'une disquette et de taper:

cd /boot
 mkboot vmlinuz-2.6.10.181004

Compiler votre prochain kernel

Si vous voulez recompiler votre kernel, parce que vous vous êtes acheté une nouvelle carte son par exemple, ou si vous aviez oublié de mettre un système de fichier que vous souhaitez utiliser maintenant. Tout ce que vous avez à faire est de relancez la configuration puis, une fois les modifications faites, le recompiler avec un nouveau –append-to-version. Votre session devrait ressembler à ça:

 cd /usr/src
ln -s linux-source-2.6.10 linux
cd linux
 make xconfig #   (reconfigurez votre kernel)
 fakeroot make-kpkg clean #   (grand nettoyage)
 fakeroot make-kpkg --append-to-version=.181004 --initrd kernel_image

Utiliser une configuration existante

Lorsque vous avez installé votre kernel sa configuration a été copiée dans /boot/config-x.y.z. Vous voudrez peut-être le copier dans un endroit plus sûr ?

Supposons que la semaine dernière vous avez courageusement exploré l'integralité des options du kernel, les modifiant sans arrêt jusqu'à créer votre kernel parfait. Supposons qu'aujourd'hui il y ait une nouvelle version du kernel et que vous souhaitiez mettre à jour le votre. Est il nécessaire de reprendre depuis le début la configuration de votre kernel? Non pas du tout.

Téléchargez et décompressez la nouvelle archive des sources dans /usr/src, refaite le lien linux pour qu'il pointe vers les nouvelles sources. Puis allez dans le dossier /usr/src/linux et copiez-y votre configuration actuel et lancez "make oldconfig":

cp /boot/config-2.6.10.081004 .config
 make oldconfig

On vous demandera si vous voulez activer ou non les nouvelles options. En général il est plus sûr de répondre non, sauf si vous voulez justement essayer une nouveauté.

Après avoir fini le make oldconfig vous pouvez relancer un make xconfig si vous n'êtes pas sûr d'une option ou si vous souhaitez changer une ancienne option.

Enfin, lancez la compilation des dernières sources avec votre configuration.

  1. Prévoir une disquette de démarrage, ou un ancien kernel démarrable avec grub
  2. Installer les paquets nécessaires
    1. build-essential
    2. fakeroot
    3. kernel-package
  3. Préparer l'arbre des sources
    1. s'ajouter au groupe src, se reconnecter
    2. enlever les vieux liens symboliques
    3. décompresser les sources du kernel
    4. faire le nouveau lien symbolique
  4. Configurer le kernel
    1. utiliser oldconfig si possible avec $ cp /boot/config-x.y.z .config
    2. $ make oldconfig ou $ make xconfig ou $ make menuconfig
    3. sauvegarder le fichier .config ailleurs pour pouvoir le réutiliser en cas de besoin
  5. Compiler le paquet kernel-image
    1. $ fakeroot make-kpkg clean
    2. $ fakeroot make-kpkg –append-to-version=alpha+numeric.mais.pas.underscore kernel_image –initrd binary
  6. Installer le paquet kernel-image
    1. $ dpkg -i kernel-image-x.y.z.aa.mm.jj_10.00.Custom_i386.deb
    2. Redémarrer
  7. Et ensuite ?
  8. Garder votre paquet avec $ echo "kernel-image-x.y.z.yymmdd hold" | dpkg –set-selections
  9. Supprimer les liens symboliques
  10. Sauvegarder la nouvelle image du kernel
  11. Supprimer les anciens paquets kernel-image
  12. Faire une nouvelle disquette de démarrage

Contributeurs : Lok

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

  • tutoriel/comment_compiler_un_kernel_sur_mesure_old.1253631464.txt.gz
  • Dernière modification: Le 18/04/2011, 14:50
  • (modification externe)