8.10. Compilation d'un noyau
Les noyaux fournis par Debian intègrent le plus grand nombre possible de fonctionnalités ainsi qu'un maximum de pilotes, afin de couvrir le plus grand spectre de configurations matérielles existantes. C'est pourquoi certains utilisateurs préfèrent recompiler le noyau pour n'y inclure que le strict nécessaire. Il existe deux raisons à ce choix. Premièrement, cela peut être pour optimiser la consommation de mémoire, puisque le code du noyau, même s'il n'est jamais utilisé, occupe de la mémoire pour rien (et ne « descend » jamais sur l'espace d'échange, donc c'est de vraie mémoire vive qu'il s'agit), ce qui peut diminuer les performances globales du système. Il peut également s'agir de limiter le risque de failles de sécurité (le code compilé portant alors sur une fraction plus faible du code existant).
La recompilation du noyau est aussi nécessaire si l'on souhaite employer certaines fonctionnalités non intégrées dans sa version standard mais disponibles sous forme de correctifs, ou patches.
8.10.1. Introduction et prérequis
Comme on peut s'y attendre, Debian gère le noyau sous forme de paquet, ce qui n'est pas la manière traditionnelle de le compiler et de l'installer. Les noyaux restant sous le contrôle du système de paquetage, ils peuvent être rapidement supprimés ou déployés sur plusieurs machines. De plus, les scripts associés à ces paquets permettent également une meilleure interaction avec le chargeur de démarrage et le générateur d'images de démarrage (initrd).
Les sources Linux en amont contiennent tout ce qu'il faut pour construire un paquet Debian du noyau. Mais vous devez toujours installer build-essential pour vous assurer que vous avez les outils nécessaires pour construire un paquet Debian. De plus, l'étape de configuration du noyau nécessite le paquet libncurses-dev (anciennement libncurses5-dev, qui est maintenant un paquet de transition). Enfin, le paquet fakeroot permettra la création du paquet Debian sans utiliser les droits de l'administrateur.
8.10.2. Récupérer les sources
Comme tout ce qui peut être utile sur un système Debian, les sources du noyau Linux sont disponibles en paquets. Pour les récupérer, il faudra donc installer un paquet
linux-source-version. Une requête
apt search ^linux-source
permet d'obtenir la liste des différentes versions du noyau empaquetées par Debian. Les dernières versions en date sont vraisemblablement disponibles dans la distribution
Unstable : on peut les y récupérer sans grands risques (surtout si votre APT est configuré conformément aux instructions de la
Section 6.2.6, « Travailler avec plusieurs distributions »). Il est à noter que les codes sources contenus dans ces paquets ne correspondent pas exactement à ceux que publient Linus Torvalds et les développeurs du noyau : Debian applique en effet un certain nombre de patches — comme toutes les distributions. Ces modifications incluent des correctifs (dont certains concernent des failles de sécurité) ou des fonctionnalités qui sont en attente d'intégration dans une version ultérieure du noyau, ainsi que quelques fonctionnalités spécifiques à Debian.
Le reste de cette section se concentre sur la version 5.10 du noyau Linux, mais les exemples peuvent bien sûr être adaptés à la version particulière du noyau que vous voulez.
Ainsi donc, le paquet linux-source-5.10 a été installé. Il contient le fichier /usr/src/linux-source-5.10.tar.xz
, une archive compressée des sources du noyau. Il faut décompacter ces fichiers dans un nouveau répertoire (et non pas directement dans /usr/src/
, car il n'y a pas besoin de droits particuliers pour compiler un noyau Linux) : ~/kernel/
conviendra.
$
mkdir ~/kernel; cd ~/kernel
$
tar -xaf /usr/src/linux-source-5.10.tar.xz
To build a kernel from the pristine sources, just download the tarball of the version of your choice from
kernel.org
, verify the integrity after importing the kernel maintainers key, and then proceed as described in the following chapters.
8.10.3. Configuration du noyau
La prochaine étape consiste à configurer le noyau conformément à ses besoins. Le mode opératoire dépend des objectifs.
Lors de la recompilation d'une version plus récente du noyau (possiblement avec un patch supplémentaire), la configuration sera probablement maintenue aussi près que possible de celle proposée par Debian. Dans ce cas, et plutôt que de reconfigurer tout à partir de zéro, il suffit de copier le fichier
/boot/config-version
(la version est celle du noyau actuellement utilisé, qui peut être trouvée avec la commande
uname -r
) dans un répertoire
.config
. Assurez-vous de lire la barre latérale
TIP Missing debian/certs/debian-uefi-certs.pem
dans ce cas.
$
cp /boot/config-5.10.0-8-amd64 ~/kernel/linux-source-5.10/.config
Si vous ne souhaitez pas changer la configuration, vous pouvez en rester là et sauter directement à la
Section 8.10.4, « Compilation et génération du paquet ». Dans le cas contraire, ou si vous avez décidé de tout reconfigurer depuis zéro, il faudra prendre le temps de configurer votre noyau. Pour cela, il propose différentes interfaces, qu'on invoque depuis le répertoire des sources par la commande
make
suivie d'un argument.
make menuconfig
compile et exécute une interface évoluée en mode texte (c'est ici que le paquet libncurses-dev est requis) qui propose de naviguer dans une structure hiérarchique présentant les options proposées. Une pression sur la touche Espace change la valeur de l'option sélectionnée et Entrée valide le bouton sélectionné en bas de l'écran : Select permet de rentrer dans le sous-menu sélectionné, Exit remonte d'un cran dans la hiérarchie, et Help produit des informations plus détaillées sur le rôle de l'option sélectionnée. Les flèches permettent de se positionner dans la liste des options et des boutons. Pour quitter le configurateur, il faut sélectionner Exit depuis le menu principal. Le programme propose alors de sauvegarder les changements : acceptez si vous êtes satisfaits de vos choix.
Other interfaces have similar features, but they work within more modern graphical interfaces; such as make xconfig
which uses a Qt graphical interface, and make gconfig
which uses GTK+. The former requires qtbase5-dev, while the latter depends on libglade2-dev and libgtk2.0-dev.
Lorsque l'on utilise une de ces interfaces de configuration, il est généralement conseillé de partir d'une configuration par défaut raisonnable. Le noyau fournit de telles configurations dans arch/architecture/configs/*_defconfig
et il est possible de les mettre en place avec une commande telle que make x86_64_defconfig
(pour un PC 64 bits) ou make i386_defconfig
(pour un PC 32 bits).
8.10.4. Compilation et génération du paquet
Once the kernel configuration is ready, a simple make deb-pkg
will generate up to 5 Debian packages:
- linux-image-version
contains the kernel image and the associated modules,
- linux-headers-version
contains the header files required to build external modules,
- linux-firmware-image-version
contains the firmware files needed by some drivers (this package might be missing when you build from the kernel sources provided by Debian),
- linux-image-version-dbg
contains the debugging symbols for the kernel image and its modules (only created if CONFIG_DEBUG_INFO=y
), and
- linux-libc-dev
contains headers relevant to some user-space libraries like GNU glibc.
The version is defined by the concatenation of the upstream version (as defined by the variables VERSION
, PATCHLEVEL
, SUBLEVEL
, and EXTRAVERSION
in the Makefile
), of the LOCALVERSION
configuration parameter, and of the LOCALVERSION
environment variable. The package version reuses the same version string with an appended revision that is regularly incremented (and stored in .version
), except if you override it with the KDEB_PKGVERSION
environment variable.
$
make deb-pkg LOCALVERSION=-falcot KDEB_PKGVERSION=$(make kernelversion)-1
[...]
$
ls ../*.deb
../linux-headers-5.10.46-falcot_5.10.46-1_amd64.deb
../linux-image-5.10.46-falcot_5.10.46-1_amd64.deb
../linux-image-5.10.46-falcot-dbg_5.10.46-1_amd64.deb
../linux-libc-dev_5.10.46-1_amd64.deb
The whole process requires around 20 GB of free space, at least 8 GB of RAM, and several hours of compilation (utilizing one core) for a standard amd64 Debian kernel. These requirements can be drastically reduced by disabling the debug information using CONFIG_DEBUG_INFO=n
, but this will make it impossible to trace kernel errors (“oops”) using gdb
and also stop the creation of the linux-image-version-dbg package.
8.10.5. Compilation de modules externes
Some modules are maintained outside of the official Linux kernel. To use them, they must be compiled alongside the matching kernel. A number of common third party modules are provided by Debian in dedicated packages, such as vpb-driver-source (extra modules for Voicetronix telephony hardware) or leds-alix-source (driver of PCEngines ALIX 2/3 boards).
Debian fournit un grand nombre de modules externes, la commande apt-cache rdepends module-assistant$
permet d'en obtenir la liste. De toute façon, cette liste n'apporte rien puisqu'il n'y a pas de raison particulière de compiler des modules externes sauf quand on sait qu'on en a besoin — auquel cas la documentation du périphérique vous renseignera.
For example, let's look at the dahdi-source package: after installation, a .tar.bz2
of the module's sources is stored in /usr/src/
. While we could manually extract the tarball and build the module, in practice we prefer to automate all this using the DKMS framework (Dynamic Kernel Module Support). Most modules offer the required DKMS integration in a package ending with a -dkms
suffix. In our case, installing dahdi-dkms is all that is needed to compile the kernel module for the current kernel provided that we have the linux-headers-* package matching the installed kernel. For instance, if you use linux-image-amd64, you would also install linux-headers-amd64.
$
sudo apt install dahdi-dkms
[...]
Setting up dkms (2.8.4-3) ...
Setting up linux-headers-5.10.0-8-amd64 (5.10.46-4) ...
/etc/kernel/header_postinst.d/dkms:
dkms: running auto installation service for kernel 5.10.0-8-amd64:.
Setting up dahdi-dkms (1:2.11.1.0.20170917~dfsg-7.4) ...
Loading new dahdi-2.11.1.0.20170917~dfsg-7.4 DKMS files...
Building for 5.10.0-8-amd64
Building initial module for 5.10.0-8-amd64
Done.
dahdi_dummy.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/5.10.0-8-amd64/updates/dkms/
dahdi_dynamic_eth.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/5.10.0-8-amd64/updates/dkms/
[...]
DKMS: install completed.
$
sudo dkms status
dahdi, 2.11.1.0.20170917~dfsg-7.4, 5.10.0-8-amd64, x86_64: installed
$
sudo modinfo dahdi_dummy
filename: /lib/modules/5.10.0-8-amd64/updates/dkms/dahdi_dummy.ko
license: GPL v2
author: Robert Pleh <robert.pleh@hermes.si>
description: Timing-Only Driver
depends: dahdi
retpoline: Y
name: dahdi_dummy
vermagic: 5.10.0-8-amd64 SMP mod_unload modversions
parm: debug:int
8.10.6. Emploi d'un patch sur le noyau
Certaines fonctionnalités ne sont pas intégrées au noyau standard faute de stabilité ou d'accord des mainteneurs du noyau. Dans ce cas, il arrive qu'elles soient diffusées sous la forme de correctif (ou patch), que chacun est alors libre d'appliquer sur les sources du noyau.
Debian fournit parfois certains de ces patches par le biais des paquets linux-patch-*, mais ils ne font souvent pas parti des distributions stables (parfois pour la même raison qu'ils ne sont pas intégrés en amont dans la version officielle du noyau). Ces paquets installent des fichiers dans le répertoire /usr/src/kernel-patches/
.
To apply one or more of these installed patches, use the patch
command in the sources directory then start compilation of the kernel as described above. The following shows an old example using linux-patch-grsecurity2 and linux-source-4.9.
$
cd ~/kernel/linux-source-4.9
$
make clean
$
zcat /usr/src/kernel-patches/diffs/grsecurity2/grsecurity-3.1-4.9.11-201702181444.patch.gz | patch -p1
Attention, un patch ne fonctionnant pas forcément avec toutes les versions des noyaux, il est possible que patch
échoue à l'appliquer sur les sources du noyau. Un message vous en informera alors : dans ce cas, référez-vous à la documentation disponible dans le paquet Debian du patch (dans le répertoire /usr/share/doc/linux-patch-*/
). Il est probable que le mainteneur indique pour quelles versions du noyau il a été prévu.