- Généralités
- Installation des dépendances
- Téléchargement du code source du noyau
- Application du patch RT (Real Time)
- Configuration du noyau
- Construction du noyau
- Installation du noyau modifié
Généralités
Le noyau Linux (ou Linux kernel) est le cœur d’un système d’exploitation de type UNIX. Logiciel libre principalement écrit en C, il assure la gestion des ressources matérielles (processeur, mémoire, périphériques, systèmes de fichiers, réseau) et fournit aux programmes une interface pour y accéder. Il prend aussi en charge l’amorçage du système.
Plusieurs versions du noyau peuvent coexister sur une machine, offrant la possibilité de choisir celle à utiliser au démarrage.
Pourquoi compiler son noyau ?
Les noyaux fournis par les distributions GNU/Linux sont conçus pour être compatibles avec un large éventail de machines et de matériels. Ils sont donc plus généralistes et un peu plus lourds, même si l’impact sur les performances reste généralement faible.
Les principales raisons de compiler son propre noyau sont :
- mieux comprendre le fonctionnement interne de Linux.
- activer la prise en charge d’un matériel ou d’une fonctionnalité absente du noyau fourni.
- appliquer un correctif spécifique.
Installation des dépendances
Commencez par installer toutes les dépendances pour recompiler le noyau.
apt install build-essential libncurses5-dev fakeroot xz-utils
Téléchargement du code source du noyau
Il est recommandé d’utiliser les sources fournies par votre distribution, car elles intègrent souvent des ajustements spécifiques, tels que des fonctionnalités supplémentaires ou des correctifs de sécurité.
Dans notre cas, nous allons installer les sources du noyau adaptées à la distribution Debian.
apt install linux-source
Le paquet installe dans le répertoire /usr/src/ deux archives compressées :
- linux-source-4.9.tar.xz : les sources complètes du noyau Linux,
- linux-patch-4.9-rt.patch.xz : un correctif RT (Real Time) qui permet d’ajouter au noyau un comportement temps réel.
Pour examiner ces archives, il suffit de lister leur contenu.
ls /usr/src
Note :
Les numéros de version du noyau peuvent varier. L’exemple précédent concernait la version 4.9. Lors de la compilation, il faudra donc adapter vos commandes en fonction de la version exacte des sources que vous utilisez.
Nous allons maintenant extraire les fichiers sources du noyau dans un répertoire dédié, par exemple dans le dossier personnel de l’administrateur (/root/kernel/).
mkdir -p ~/kernel/
cd ~/kernel/
tar -xaf /usr/src/linux-source-4.9.tar.xz
Application du patch RT (Real Time)
Pour appliquer le patch Linux-RT au noyau, commencez par vous placer dans le dossier contenant les sources du noyau, puis appliquez le patch avec la commande appropriée.
cd linux-source-4.9/
xzcat /usr/src/linux-patch-4.9-rt.patch.xz | patch -p1
Configuration du noyau
Lors de la recompilation d’un noyau (même d’une version plus récente), la configuration est généralement préservée proche de celle fournie par Debian. Plutôt que de repartir de zéro, il suffit de copier le fichier /boot/config-<version> où <version> correspond au noyau en cours d’utilisation (obtenu via uname -r) vers .config dans le répertoire des sources du noyau.
cp /boot/config-$(uname -r) ~/kernel/linux-source-4.9/.config
Pour lancer l’utilitaire de configuration du noyau, il faut taper la commande make menuconfig.
make menuconfig
La navigation dans cette interface est simple :
- Flèches haut/bas : pour monter/descendre
- Entrée : pour entrer dans les sous-menus
- Échap deux fois : pour sortir d’un sous-menu
- h : pour demander l’aide d’une option
- / : pour rechercher une option
- Espace : pour sélectionner une option
Ici vous définissez les paramètres du noyau comme ceci :
Preemption Model : On sélectionnera l’option la plus préemptible. En particulier si le patch Linux-RT est appliqué, on choisira Fully Preemptible Kernel pour obtenir la meilleure réactivité face aux interruptions.
-> Processor type and features --->
-> Preemption Model ( ... ) --->
(X) Fully Preemptible Kernel (Real-Time)
Timer Frequency : C’est la fréquence du tick système qui influe sur la granularité des timers logiciels de basse fréquence. 1000 Hz est le choix préféré pour les systèmes nécessitant des réponses interactives rapides aux événements.
-> Processor type and features --->
-> Timer frequency ( ... ) --->
(X) 1000 HZ
High Resolution Timer Support : Si l’architecture permet de disposer de timers haute résolution (fréquence supérieure à 1kHz) il est toujours intéressant de les utiliser. Cette option est indépendante de la précédente.
-> General setup --->
-> Timers subsystem --->
[*] High Resolution Timer Support
Tickless system : Cette option permet au processeur de s’endormir profondément lorsqu’il est inactif. Sur un système temps-réel, au contraire on la désactivera, car l’endormissement du processeur rallonge le temps de réaction aux interruptions.
-> General setup --->
-> Timers subsystem --->
-> Timer tick handling ( ... ) --->
(X) Full dynticks system (tickless)
CPU frequency scaling : La mise à l’échelle de la fréquence du CPU aide à économiser de l’énergie en ralentissant le CPU lorsque la charge est faible et en l’accélérant à nouveau lorsque la charge augmente. Cela peut avoir un impact sur les performances du système, car l’augmentation de la fréquence du CPU en réponse à une charge système plus élevée ne se produit pas instantanément.
-> Power management and ACPI options --->
-> CPU Frequency scaling --->
[*] CPU Frequency scaling
-> Default CPUFreq governor ( ... ) --->
(X) performance
Une fois la configuration du noyau prête, enregistrez (Save) et quittez (Exit) menuconfig.
Construction du noyau
Nous allons maintenant construire le noyau, ce qui prendra un certain temps (20-40 minutes sur un processeur moderne).
make clean
make -j `nproc` deb-pkg LOCALVERSION=-custom KDEB_PKGVERSION=$(make kernelversion)-1
Explications basiques :
make clean : Nettoye le code source.
make deb-pkg : Compile en créant des paquets debian (.deb).
-j `nproc` : Facultatif. Prend le nombre de threads total de votre processeur (la compilation sera la plus rapide possible).
LOCALVERSION= : Facultatif. Donne le nom custom au noyau. Vous pouvez utiliser votre propre nom.
KDEB_PKGVERSION= : Facultatif. Cet argument sert à versionner le kernel (soit version 1).
Installation du noyau modifié
Une fois la construction terminée, vérifiez les paquets Debian.
ls ../*.deb
Make deb-pkg générera jusqu’à 5 paquets Debian :
linux-headers-<version>.deb : Qui contient les fichiers d’en-tête nécessaires à la compilation modules externes.
linux-image-<version>.deb : Qui contient l’image du noyau et les modules associés.
linux-image-<version>-dbg.deb : Qui contient les symboles de débogage pour l’image du noyau et ses modules.
linux-libc-dev_<version>.deb : Qui contient des en-têtes pour certaines bibliothèques de l’espace utilisateur comme GNU glibc.
linux-firmware-image-<version>.deb : Qui contient les fichiers de firmware nécessaires à certains pilotes (ce paquet peut être manquant lorsque vous compilez à partir des sources du noyau fournies par Debian).
Ensuite, il faut installer tous les paquets Debian du noyau.
dpkg -i ../*.deb
Maintenant que le nouveau noyau est installé, redémarrez le système. Une fois que votre système a redémarré, votre nouveau noyau devrait être en cours d’exécution.
reboot
Pour vérifier la nouvelle version patché du noyau.
uname -a
Le noyau de votre distribution Debian est maintenant temps réel (PREEMPT RT)