Généralités système Linux

kernel - Compiler son kernel Linux

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

linux_logomed







Introduction





Le noyau Linux (ou kernel en anglais) est un noyau de système d'exploitation de type UNIX. Le noyau Linux est un logiciel libre développé essentiellement en langage C par des milliers de bénévoles et salariés communiquant par Internet.



Le noyau est le cœur du système, c'est lui qui s'occupe de fournir aux logiciels une interface pour utiliser le matériel.



C'est lui qui amorce le système d'exploitation.

Il est possible d'avoir plusieurs noyaux et utiliser celui de votre choix. Il est même recommandé d'avoir toujours un noyau fonctionnel sur sa machine.



Pourquoi compiler son noyau ? Les noyaux fournis par défaut dans votre distribution GNU/Linux sont des noyaux capables de tourner sur un maximum de machines et de matériels. Ils sont donc souvent plus lourds, mais la différence de rapidité est en général assez faible. En fait les vraies raisons de compiler son propre noyau sont les suivantes :



  • Comprendre comment fonctionne le noyau Linux.
  • Faire fonctionner un matériel ou une fonctionnalité qui n'est pas pris en charge par votre noyau actuel.
  • Vous voulez passer le temps.







Prérequis





Pour compiler son noyau, il est nécessaire d'avoir quelques prérequis :



Matériel





Un bon processeur pour que la compilation soit rapide.

Prévoir 1Go de RAM au moins.

Avoir 10Go de place sur le disque dur (partition /usr/src)



Pour info avec un kernel sur serveur assez épuré, 1h avec un Intel(R) Pentium(R) D CPU 2.80GHz, et moins de 15mn avec Intel(R) Core(TM) i7-3610QM CPU @ 3.20GHz





Logiciel





Sur la distribution concernée, on a besoin de quelques logiciels :



  • wget : pour télécharger les sources du noyau (ou un navigateur Internet en graphique)
  • tar : pour extraire l'archive du noyau
  • xz : pour décompresser le noyau
  • ncurses : pour afficher le menu de configuration
  • make : pour lancer le processus de compilation
  • gcc (c++) : le compilateur C





Les paquets se nomment ainsi suivant les distributions:



  • Gentoo / Calculate Linux : net-misc/wget app-arch/tar app-arch/xz-utils sys-libs/ncurses sys-devel/make sys-devel/gcc
  • Mageia : wget tar xz ncurses-devel make gcc-c++







Mise en œuvre





Dans un premier temps, il est nécessaire de se connecter en root.

Toutes les commandes doivent être lancées en root.



Récupération des ressources





On se positionne dans le dossier /usr/src . C'est le dossier qui contient des fichiers de code source, selon la norme FHS (File Hierarchy Standard)



Code BASH :
cd /usr/src




On récupère ensuite le kernel depuis le site kernel.org (Je prends, en date de la rédaction de cet article le dernier noyau LTS, soit le 3.14.33 )



kernel_org





Code BASH :
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.14.33.tar.xz




On décompresse ensuite l'archive compressée :



Code BASH :
tar -xf linux-3.14.33.tar.xz




Et on se rend dans le dossier précédemment désarchivé



Code BASH :
cd linux-3.14.33






Préparation à la compilation





On nettoie le dossier et on le prépare pour la compilation:



Code BASH :
make mrproper




On recupere la config en cours via :



Code BASH :
make oldconfig




Caché :
HOSTCC scripts/basic/fixdep

HOSTCC scripts/kconfig/conf.o

SHIPPED scripts/kconfig/zconf.tab.c

SHIPPED scripts/kconfig/zconf.lex.c

SHIPPED scripts/kconfig/zconf.hash.c

HOSTCC scripts/kconfig/zconf.tab.o

HOSTLD scripts/kconfig/conf

scripts/kconfig/conf --oldconfig Kconfig

#

# using defaults found in /boot/config-3.14.27-calculate

#

#

# configuration written to .config

#





Il se peut que des questions soient posées. C'est dans le cas ou les options du kernel à installer sont nouvelles par rapport à celui en cours d'exécution. Laisser les choix par défaut. en validant simplement les questions.





La personnalisation





Pour régler les options dans le futur noyau, et affiner la configuration, on exécute la commande suivante :



Code BASH :
make menuconfig




On a ensuite une petite interface de type "ncurses" dans la console :



kernel_menuconfig





On navigue dans les menus avec les flèches haut et bas.

Les touches gauche et droite permettent de naviguer dans le menu en dessous et Entrée pour valider le choix.



  • Select permet de sélectionner le menu en surbrillance ou de changer une valeur (un texte)
  • Exit permet de revenir au menu précédent
  • Help permet d'avoir de l'aide sur le menu en cours
  • Save permet de sauvegarder les modifications dans le fichier .config
  • Load permet de restaurer une configuration





On personnalise les options, par exemple, dans "General Setup" puis "Local Version" on peut mettre un suffixe au à la version du noyau, de notre choix :



kernel_menuconfig_personnalisation





On peut appuyer sur "?" pour avoir de l'aide (English of course!) sur l'option en question :



kernel_menuconfig_help





Il n'existe pas que des menus et des options de type texte.

Par exemple, si on va dans les FileSystems, on voit plusieurs possibilités pour chaque option :



Code TEXT :
< >
< M >
[ * ]




  • < > : Driver non compilé
  • < M > : Driver dynamique appelé module. Un module est compilé mais n'est pas lié au noyau. Un module sera chargé au boot du PC par un service du noyau en fonction des matériels réellement présents dans le PC. On pourra aussi charger manuellement un module si l'on veut (commande insmod).
  • [ * ]Le driver est compilé et lié de façon statique avec le noyau. On ne peut pas le retirer de la mémoire même si l'on ne s'en sert pas. On voit que si l'on incorpore tous les drivers dans le noyau, celui-ci devient énorme en taille et va contenir tout un tas de drivers inutiles car ne correspondant pas à un matériel présent dans le PC.





Par défaut, les options sont bien réglées.

On garde uniquement les * pour les éléments de base nécessaire au bon fonctionnement.

Le reste, en modules M.



Les modules ( < M > ) sont chargés à la demande. Si on met tout en drivers intégrés ( [ * ] ), on les charge au démarrage, le noyau est lourd et on ne peut pas les désactiver post-démarrage.



kernel_menuconfig_filesystems





Ensuite au sauvegarde la configuration en allant sur <Save>



kernel_menuconfig_save







La compilation