Comment créer un noyau Linux personnalisé à partir des sources

Vous souhaitez personnaliser le noyau de votre distribution Linux ? Activer ou désactiver des fonctionnalités spécifiques ? Dans cet article, vous apprendrez à compiler votre noyau Linux personnalisé et à configurer votre système pour démarrer avec ce nouveau noyau.

Comment créer un noyau Linux personnalisé à partir des sources
Photo par Anders Jildén / Unsplash

Outils nécessaires

Consultez le fichier « Documentation/process/changes.rst » pour connaître les exigences minimales de compilation. noyau LinuxLa plupart des paquets requis sont peut-être déjà installés sur votre système. L'installation des paquets suivants garantira l'installation des paquets minimum et d'autres paquets supplémentaires pourraient être nécessaires :

  • pkg-config et g++ (compilateur C et C++)
  • libncurses5-dev afin d'utiliser certaines cibles « make » non GUI pour générer le fichier de configuration du noyau
  • libssl-dev pour les bibliothèques SSL/TLS
  • Et peut-être d'autres paquets, selon la cible « make » utilisée pour générer le fichier de configuration « .config » du noyau. Consultez les messages d'erreur lors de l'utilisation de ces cibles pour savoir quel(s) paquet(s) installer.

Configuration du noyau

Le fichier de configuration du noyau utilisé pour la compilation est nommé « .config » et inclut les paramètres de configuration qui contrôlent le comportement du noyau que nous allons construire (fonctionnalités qui seront incluses).

Le fichier « .config » est généré à l'aide de « cibles make » (make targets en anglais), représentant des scripts fournis pour faciliter la configuration des paramètres du noyau. Voici la liste et la description de certaines des « cibles make » disponibles pour configurer le noyau avant la compilation :

  • defconfig : créer une configuration par défaut en fonction du type de système détecté
  • oldconfig : mettre à jour un fichier de configuration '.config' existant avec uniquement les nouvelles fonctionnalités du noyau
  • menuconfig : lancer un menu textuel pour la configuration
  • clean : supprimer tous les fichiers objets créés précédemment
  • mrproper supprimer tous les fichiers objets et paramètres de configuration précédemment créés du fichier « .config ». Utile pour recommencer après la création d'un fichier de configuration.
  • xconfig : lancer une interface graphique pour la configuration
  • gconfig : lancer une interface graphique GTK pour la configuration

Pour utiliser l’une de ces cibles :

# Command : make TARGET_NAME

# Example of using the menuconfig target
make menuconfig

Utilisez « make help » pour obtenir des informations sur toutes les cibles disponibles.

Fichiers de compilation et post-compilation du noyau

Les fichiers sources du noyau sont fournis avec la cible « bzImage » pour créer un binaire compressé. Le type de fichier binaire compressé varie selon la version du noyau : gzip pour la version 2.6.x, bzip2 pour la version 3.x et xz pour les versions 4.x et supérieures.

La commande « make » peut être utilisée sans argument pour créer un binaire de noyau non compressé. Une fois la compilation terminée, le binaire du noyau résultant se trouve dans « arch/SYSTEM_ARCH/boot » (remplacez SYSTEM_ARCH par l'architecture du système pour lequel vous compilez le noyau : arm, arm64, x86...).

Un fichier « System.map » sera également créé dans le répertoire de base du code source. Il sert au débogage du noyau et peut éventuellement être placé dans le dossier système « /boot » avec le fichier binaire du noyau lors de la configuration du système pour le démarrage avec le nouveau noyau.

Exemples de compilation

Créer un fichier binaire du noyau non compressé

make clean
make

Créer un fichier binaire du noyau compressé

make clean
make bzImage

Création de packages RPM et DEB pour des installations rapides et scalable

Utilisez simplement les cibles suivantes à partir du répertoire de code source du noyau précédemment compilé :

  • bindeb-pkg : créer un package DEB contenant le binaire du noyau
  • binrpm-pkg : créer un package RPM contenant le binaire du noyau

Voici des exemples :

# Create a DEB package for the kernel installation
make bindeb-pkg

# Create a RPM package for the kernel installation
make binrpm-pkg

Après avoir installé les packages créés précédemment, vous aurez les fichiers suivants (exemples pour la version du noyau 5.6.11) dans le répertoire système '/boot' et serez prêt à démarrer dans le noyau nouvellement compilé :

  • config-5.6.11 : paramètres du fichier de configuration du noyau utilisés pour la compilation
  • System.map-5.6.11 : fichier de débogage du noyau
  • initrd.img-5.6.11 : le fichier du disque RAM initial. Il s'agit d'une image de système de fichiers en mémoire (RAM) contenant les binaires de certains modules du noyau nécessaires à la lecture des fichiers sur les périphériques de stockage sous-jacents, afin de lancer des scripts d'initialisation système tels que « /sbin/init » au démarrage.
  • vmlinuz-5.6.11 : fichier binaire du noyau

Les noms des fichiers binaires du noyau Linux commencent généralement par « vmlinuz » suivi de la version du noyau. Il s'agit d'une appellation conventionnelle reconnue par la plupart des distributions Linux et des outils gérant les images du noyau.

Compilation et installation des modules standard du noyau

Utilisez simplement les cibles « modules » et « modules_install » comme indiqué ci-dessous :

make modules
make modules_install

Après avoir exécuté les commandes ci-dessus, les modules du noyau configurés comme chargeables dans le fichier de configuration du noyau « .config » seront compilés et installés dans le répertoire « /lib/modules/KERNEL_VERSION ».

La présence de modules pour une version spécifique du noyau dans ce répertoire est une condition préalable à la création d'un fichier RAM disque initial pour ce noyau, car les outils utilisés pour sa création recherchent les modules nécessaires dans ce répertoire. Consultez la section suivante pour plus d'informations.

Création des fichiers initramfs et initrd

« initramfs » (pour les systèmes debian) et « initrd » (pour les systèmes rpm) sont des outils utilisés pour créer une image de système de fichiers en mémoire contenant certains binaires de modules du noyau nécessaires au noyau pour lire les fichiers sur les périphériques de stockage sous-jacents, afin de lancer des scripts d'initialisation du système comme « /sbin/init » pendant le démarrage.

Les outils « initramfs » et « initrd » recherchent les modules qui seront inclus dans le disque RAM initial, dans le répertoire « /lib/modules/KERNEL_VERSION ». Assurez-vous donc que les modules correspondant à la version du noyau pour laquelle vous créez le disque RAM initial sont disponibles dans ce dossier.

Lorsque vous travaillez avec le code source du noyau, les commandes « make modules » et « make modules_install » compileront et installeront les modules dans le répertoire « /lib/modules/KERNEL_VERSION ».

Le fichier de configuration de l'outil « initramfs » se trouve dans le répertoire « /etc/initramfs-tools/initramfs.conf ». Ce fichier contient les valeurs des paramètres par défaut qui seront utilisés lors de la génération du disque RAM initial avec la commande « initramfs ». Si vous souhaitez inclure des modules spécifiques dans le disque RAM initial, indiquez leurs noms à l'intérieur du fichier '/etc/initramfs-tools/modules' (un nom par ligne).

Voici une liste d’autres outils intéressants liés aux fichiers de disque RAM initiaux :

  • lsinitramfs : lister le contenu d'un disque RAM initial
  • update-initramfs : permet de créer/mettre à jour les fichiers de disque RAM initiaux pour des versions spécifiques du noyau. Lors de la création d'un disque RAM initial (avec l'option « -c »), la spécification d'une version est obligatoire. Lors de la création/mise à jour d'un disque RAM initial (avec l'option « -u »), le fichier de disque RAM sera par défaut créé/mis à jour pour le dernier noyau installé sur le système et sera disponible dans le répertoire « /boot ». Il est également possible de supprimer/mettre à jour les anciens fichiers de disque RAM initiaux ou de les remplacer. Les paramètres de configuration par défaut utilisés par l'outil peuvent être mis à jour dans « /etc/initramfs-tools/update-initramfs.conf ».

Exemples

Les fichiers de disque RAM initramfs/initrd utilisent une dénomination conventionnelle. En général, le fichier initial de disque RAM est nommé : « initrd.img-KERNEL_VERSION ». Par exemple : initrd.img-5.6.11. Cette convention est utilisée par l'outil « update-initramfs ».

  • Créer un fichier de disque RAM initial avec initramfs pour le noyau installé dans la version 5.6.11
mkinitramfs -o /boot/initrd.img-5.6.11
  • Créez un fichier de disque RAM initial dans le dossier « /boot » avec « update-initramfs » pour le noyau 5.6.11 installé. Le fichier créé sera automatiquement nommé « initrd.img-5.6.11 ». L'option « -b » permet de modifier le répertoire de destination du fichier.
update-initramfs -c -k 5.6.11
  • Créez un fichier de disque RAM initial avec « initramfs » pour le dernier noyau disponible sur le système. Créez ce fichier dans le dossier « /boot » par défaut. Si le fichier existe déjà, il sera mis à jour.
update-initramfs -u

Préparation du système pour le démarrage avec le noyau nouvellement créé

Si vous avez créé un package de distribution Linux spécifique pour l'installation du binaire du noyau, il vous suffit de l'installer :

# Debian based installation for kernel 5.6.11 DEB package
# created with 'make bindeb-pkg' from sources
dpkg -i linux-image-5.6.11_5.6.11-1_amd64.deb

Si vous venez de terminer la compilation du noyau à partir des sources, vous devez procéder comme suit :

  • Compiler et installer les modules standards (requis pour la génération du disque RAM initial avec les outils « initramfs » ou « initrd »)
  • Créer le fichier de disque RAM initial
  • Copiez les fichiers suivants dans le dossier « /boot ». Remplacez « KERNEL_VERSION » par le numéro de version du noyau. Remplacez « SYSTEM_ARCH » par l'architecture du système. Les chemins d'accès aux fichiers sources sont relatifs au répertoire de base du code source du noyau :
    • '.config' vers '/boot/config-KERNEL_VERSION'
    • 'System.map-KERNEL_VERSION' vers '/boot/System.map-KERNEL_VERSION'
    • 'arch/SYSTEM_ARCH/boot/bzImage' vers '/boot/vmlinuz-KERNEL_VERSION'
  • Mettez à jour la configuration de votre chargeur de démarrage. Si vous utilisez GRUB, exécutez simplement la commande « update-grub ». GRUB détectera automatiquement les nouveaux fichiers du noyau créés dans « /boot » et créera de nouvelles entrées de menu pour permettre le démarrage avec ces nouveaux noyaux :
bash$ sudo update-grub
Sourcing file `/etc/default/grub'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.6.11
Found initrd image: /boot/initrd.img-5.6.11
Found linux image: /boot/vmlinuz-4.15.0-99-generic
Found initrd image: /boot/initrd.img-4.15.0-99-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
Done

Pour en savoir plus sur GRUB, consultez L'essentiel sur GRUB legacy et GRUB2 sous Linux