Mise à jour : Debian 9.4
Ce document décrit comment compiler un noyau pour un système debian.
debian-facile wiki : https://debian-facile.org/doc:systeme:kernel:compiler
Installer les outils nécessaires à la compilation du noyau :
# aptitude install fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison
Deux origines sont envisagées pour les sources du noyau
à partir du site officiel kernel.org
Télécharger les sources du noyau à partir du site https://kernel.org/ et plus particulièrement de la page https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/
Le noyau 4-15 est pris comme exemple.
$ wget -c https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/snapshot/linux-4.15.tar.gz
.....
linux-4.15.tar.gz [<=> ] 152,14M 667KB/s in 6m 31s
2018-04-29 12:31:07 (399 KB/s) - « linux-4.15.tar.gz » sauvegardé [159526686]
Extraire les sources (tar xvzf si tar.gz ou tar xvJf si tar.xz)
$ tar xvzf linux-4.15.tar.gz
Se déplacer dans le répertoire créé
$ cd linux-4.15
Le noyau 4-9 debian est pris comme exemple
Installer le paquet des sources de la version debian
# aptitude install linux-source-4.9
Extraire les sources dans le répertoire courant
$ tar xaf /usr/src/linux-source-4.9.tar.xz
Se déplacer dans le répertoire créé
$ cd linux-source-4.9
Cette étape permet de sélectionner les options du noyau et les modules à inclure (externes ou internes). Elle utilise la commande make dont les options sont disponibles avec
$ make help
Pour créer un fichier de configuration (.config) en répondant une par une à toutes les options :
$ make config
Les réponses sont du type Y/n/m. Taper la touche "Entrée" pour accepter la valeur par défaut.
Cette solution est à éviter compte-tenu du nombre de questions !
Pour créer un fichier de configuration à partir d'un fichier de configuration, par exemple celui du noyau en cours d'utilisation
copier le fichier de configuration dans le répertoire des sources
cp /boot/config-$(uname -r) .config
définir les nouvelles options (absentes du fichier initial)
de façon automatique (avec les valeurs par défaut) avec la commande
$ make olddefconfig
ou de façon interactive avec
$ make oldconfig
A noter que le fichier de configuration initial est sauvegardé sous .config.old
Pour connaître la liste des nouvelles options (différence entre les fichiers .config et .config.old)
$ make listnewconfig
Il est possible de modifier les options du fichier de configuration en utilisant un menu
Pour lancer le menu de configuration dans une fenêtre du terminal
$ make menuconfig
Pour lancer le menu de configuration dans une fenêtre gtk
Installer les dépendances
# aptitude install libglade2-dev libgtk2.0-dev
Lancer le menu
$ make gconfig
Pour lancer le menu de configuration dans une fenêtre qt
Installer les dépendances
# aptitude install libqt4-dev
Lancer le menu
$ make xconfig
Via le script ./scripts/config, il est possible de définir en ligne de commande les options de la configuration dont on connaît le nom.
Les principales commandes sont :
commands:
--enable|-e option Enable option
--disable|-d option Disable option
--module|-m option Turn option into a module
--set-str option string
Set option to "string"
--set-val option value
Set option to value
--undefine|-u option Undefine option
--state|-s option Print state of option (n,y,m,undef)
Pour afficher la valeur d'une option (--state ou -s)
$ ./scripts/config -s DEBUG_INFO
n
désactiver une option dont on connaît le nom :
./scripts/config -d NOM_OPTION
Pour activer une option
./scripts/config -e NOM_OPTION
Pour donner une valeur numérique à une option
Kernel hacking ---> Compile-time checks and compiler options ---> Compile the kernel with debug info
ou bien
./scripts/config -d DEBUG_INFO
Voir https://debian-facile.org/doc:systeme:kernel:compiler
$ ./scripts/config -d CONFIG_MODULE_SIG_ALL -d CONFIG_MODULE_SIG_KEY -d CONFIG_SYSTEM_TRUSTED_KEYS
Désactiver l'option de debuggage noyau pour limiter la taille du noyau
$ ./scripts/config -d DEBUG_INFO
Lancer la compilation (durée environ 1 heure pour un processeur i5 - 4 coeurs - 2,4GHz), qui permettra de construire les différents paquets et documents du nouveau noyau
$ make deb-pkg
-j<nombre_processeurs_disponibles>
OPTION=<valeur_option> (la valeur de l'option est utilisée pendant la compilation, mais le fichier de configuration n'est pas modifié)
Exemple :
Utilisation de tous les processeurs disponibles
Ajout de "custom" au nom de du noyau (doit-être en minuscules)
Ajout du numéro de version "1" au nom de noyau (doit-être un chiffre)
$ make deb-pkg -j"$(nproc)" LOCALVERSION=-custom KDEB_PKGVERSION=1
Autres exemples
LOCALVERSION=- “$(dpkg –-print-architecture)“
KDEB_PKGVERSION=“$(make kernelversion)-1”
La compilation s'interrompt pour que l'utilisateur définisse la valeur d'une option nouvelle non configurée
Additional X.509 keys for default system keyring (SYSTEM_TRUSTED_KEYS) [] (NEW)
Entrer la valeur par défaut en tapant sur la touche "Entrée".
La compilation se termine avec la construction des différents paquets et documents du nouveau noyau
Les fichiers sont créés dans le répertoire supérieur. Ils comprennent notamment, les paquets pour installer le noyau et les en-têtes du nouveau noyau.
$ ls .. |grep .deb$
linux-headers-4.15.0-custom_1_amd64.deb
linux-image-4.15.0-custom_1_amd64.deb
linux-libc-dev_1_amd64.deb
Installer les en-têtes, puis le noyau
# dpkg -i ../linux-headers-4.15.0-custom_1_amd64.deb # dpkg -i ../linux-image-4.15.0-custom_1_amd64.deb
L'initrd est généré et l'entrée correspondant au nouveau noyau est ajouté à grub
# aptitude purge linux-image-4.15.0-custom linux-headers-4.15.0-custom
ou
# dpkg -P ../linux-headers-4.15.0-custom_1_amd64.deb ../linux-image-4.15.0-custom_1_amd64.deb
Redémarrer le système
# reboot
Sélectionner dans le menu grub, la ligne correspondant au nouveau noyau.
Vérifier la version du nouveau noyau
$ uname -r
4.15.0-custom
Vérifier l'absence d'erreur dans les messages du noyau
# dmesg -k -l "emerg,alert,crit,err"
[ 8.661426] Error: Driver 'pcspkr' is already registered, aborting...
Vérifier l'installation des modules dkms
# dkms status |grep $(uname -r)
bbswitch, 0.8, 4.15.0-custom, x86_64: installed
nvidia-current, 384.111, 4.15.0-custom, x86_64: installed