Compiler son kernel sous debian
Ce document me sert avant tout de mémo et est amené à évoluer, il existe des dizaines de sites expliquant plus en détails comment compiler son kernel.
L'intérêt de compiler son noyau est de bénéficier des dernières avancées, de drivers plus à jour etc ... De plus sous debian, les derniers kernels en date ne sont pas forcément fournis sous forme de paquets (linux-image). Il faut souvent attendre un peu (même en unstable ou testing). Enfin une compilation personnelle vous permet de choisir et charger uniquement les options dont vous avez besoin (inutile d'avoir les drivers de matériel que vous ne possédez pas), ce qui optimise les performances de manière significative. Rentrons donc dans le vif du sujet.
Mise en garde :
Gardes toujours au moins un noyau sur lequel tu sais que tu pourras booter sans soucis, ce qui t'éviteras quelques nuits blanches en cas de kernel panic.
Pré requis :
- Posséder une distribution de type debian, ou debian-like (ubuntu ...)
- Avoir les packages suivants installés :
- fakeroot
- kernel-package, pour bénéficier de la commande make-kpkg
- libc-dev (dans mon cas libc6-dev)
- libncurses-dev (dans mon cas libncurses5-dev)
- initrd-tools
Installation :
Récupération du noyau à compiler :
$ cd /tmp && wget -c ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.20.1.tar.bz2
Extraction du noyau à compiler :
$ tar jxf linux-2.6.20.1.tar.bz2 && cd linux-2.6.20.1
Une fois que tout est prêt il nous reste à choisir ce que l'on souhaite activer dans notre nouveau noyau. Pour cela on a le choix entre deux solutions :
- Partir à la découverte des multiples options disponibles dans le noyau
- Utiliser la configuration de son noyau précédent
Pour rapatrier la configuration du dernier noyau on effectue un :
$ cp /boot/config-2.6.19 .config ( le dossier courant à ce stade devrait être /tmp/linux-2.6.20.1 )
Ici le config-2.6.19 correspond à la configuration de mon noyau précédent, vous devez choisir le votre.
Ensuite on lance le make menuconfig (qui ouvre une interface semi-graphique en ncurses) :
$ make menuconfig
Si tu as copié ton .config les options de ton précédent noyau seront chargés, sinon bonne chance dans les différents menus ; tu pourras choisir d'activer ou désactiver différentes options, voir de les utiliser sous forme de modules.
Choisis ensuite exit et acceptes de sauvegarder ta configuration.
Compiler son noyau
Ton noyau fraîchement configuré, tu vas enfin pouvoir le compiler :
$ make-kpkg - -rootcmd fakeroot - -initrd - -append-to-version=tontexte - -revision=2.6.20.1 kernel-image
Attention il n'y a pas d'espaces entre les tirets, il faut juste que je trouve la syntaxe wiki pour les afficher sinon cela me donne un texte barré sous dotclear.
Le paramètre --rootcmd fakeroot permet d'obtenir les droits root, ce qui est nécessaire pour la création du .deb du noyau.
Note : on aurait aussi pu utiliser --rootcmd sudo
Le paramètre --initrd permet de créer un fichier initrd. Cela est particulièrement utile pour utiliser des modules du noyau dès l'amorçage de l'image de celui-ci.
Le paramètre --append-to-version permet de rajouter un texte personnalisé qui appraitra en bout de chaine, lors du choix du noyau dans grub. Si c'est ta première compilation et que tu te sens un brin mégalo à l'idée d'avoir compilé ton noyau, rien ne t'empêche d'ajouter un texte du style -martin-ce-super-héros.
Toutefois au fil du temps, l'excitation retombant tu te cantonneras certainement à quelquechose de plus sobre comme la date
Une fois la commande lancée et 3-4 cafetières vides plus loin tu devrais te retrouver avec un package de la sorte : kernel-image-2.6.20.1-tontexte.deb
Si la compilation échoue n'essaies surtout pas d'aller plus loin, il se peut que tu ais fais des erreurs de configuration, qu'il te manques des packages parmis ceux évoqués en début de tutoriel ou plein d'autres bonnes raisons. Dans tous les cas une recherche sur ton moteur de recherche préféré devrait vite t'apporter des éléments de réponse.
Une fois le package debian généré, tu prendras soin de faire un clean dans l'arborescence des sources:
$ make-kpkg clean
Dans le cas où tout s'est bien passé tu peux installer le paquet comme un package traditionnel :
# dpkg -i kernel-image-2.6.20.1.tontexte.deb
Note : le # désigne un shell ouvert en root, cela revient à lancer la commande précédée de sudo, un accès root étant généralement déconseillé.
dpkg va donc installer le nouvau noyau en :
- Installant les modules dans /lib/modules/2.6.20.1-tontexte
- Créant System.map-2.6.20.1-tontexte, /boot/config-2.6.20.1-tontexte et /boot/vmlinuz-2.6.20.1-tontexte
- Ajoutant le nouveau noyau dans /boot/grub/menu.lst en première position dans la liste
Une fois que tu as vérifié que tout s'était bien passé, tu peux redémarrer ta machine:
- reboot ( ou shutdown -r now mais c'est plus long :-p )
Le boot se fera normalement sur le premier noyau de la liste c'est à dire celui que tu viens d'installer.
Problèmes potentiels au boot :
Table des partitions avancée :
Il peut arriver que le noyau Linux ne reconnaisse pas le disque si la table des partitions avancée est activée dans le fichier .config.
On a alors droit à un kernel panic en règle :
VFS: Cannot open root device "hda1" or unknown block (0,0) Kernel panic - not syncing: VFS Unable to mount root fs on unknow block (0,0)
Dans ce cas, après make menuconfig, édites le fichier .config en changeant:
CONFIG_PARTITION_ADVANCED=y en
- CONFIG_PARTITION_ADVANCED
Le # a pour effet de mettre la ligne en commentaire.
Utilisation d'initrd
L'installation du noyau sans créer de fichier d'init peut poser quelques problèmes, aussi n'oublies pas l'option --initrd sur la ligne de commande make-kpkg.
Désinstaller un noyau :
Si ton nouveau noyau fonctionne correctement, ce que tu verras à l'usage, tu pourras supprimer le plus ancien, en veillant à en avoir au moins toujours un autre en plus du courant. Personnellement j'aime bien en avoir toujours 3 dans ma liste donc une fois le nouveau installé et après quelques jours à le tester je supprime le plus ancien avec la commande :
# apt-get remove --purge kernel-image-version-a-supprimer
ou
# dpkg --purge kernel-image-version-a-supprimer
Voilà, c'est fini, ce n'était pas si compliqué !