Compilation d'un kernel.org

Dépendances

Installer les paquets:

su
apt update
apt install build-essential fakeroot libncurses5-dev dpkg-dev libssl-dev bc gnupg dirmngr flex bison libelf-dev

Pour avoir un menu graphique de configuration des options:

    # permet make xconfig
apt install libqt4-dev
    # permet make gconfig
apt install libgtk2.0-dev libglade2-dev
exit

Préparation des dossiers

tout est à faire en user

    # création dossier kernel dans le home si inexistant
mkdir -p ~/kernel

    # on va dans le dossier
cd ~/kernel

Chargement

les versions rc (releases candidates), sont destinées aux beta-testeurs ou aux aventuriers. elles ne sont pas signées, pas mainline, les liens ci après devront être adaptés.

    # **/!\** modifier la version du kernel à charger selon la disponibilité
kversion=4.16.3

    # la signature des sources
wget https://www.kernel.org/pub/linux/kernel/v${kversion:0:1}.x/linux-$kversion.tar.sign
    # les sources du kernel
wget https://www.kernel.org/pub/linux/kernel/v${kversion:0:1}.x/linux-$kversion.tar.xz

vérification signature des sources:

xz -cd linux-$kversion.tar.xz | gpg --verify linux-$kversion.tar.sign
    gpg: Signature made mer. 03 mai 2017 17:38:11 CEST
    gpg: using RSA key 647F28654894E3BD457199BE38DBBDC86092693E
    gpg: Can't check signature: Pas de clef publique

Remarque: extraction clé, signature inconnue (Can't check signature).

recherche clé:

gpg --keyserver hkp://keys.gnupg.net --recv-keys 647F28654894E3BD457199BE38DBBDC86092693E
    gpg: key 38DBBDC86092693E: public key "Greg Kroah-Hartman (Linux kernel stable release signing key) 
               greg@kroah.com" imported
    gpg: no ultimately trusted keys found
    gpg: Total number processed: 1
    gpg: imported: 1

re-vérification:

xz -cd linux-$kversion.tar.xz | gpg --verify linux-$kversion.tar.sign
    gpg: Signature made mer. 03 mai 2017 17:38:11 CEST
    gpg: using RSA key 647F28654894E3BD457199BE38DBBDC86092693E
    gpg: Good signature from "Greg Kroah-Hartman (Linux kernel stable release signing key) greg@kroah.com" [unknown]
    gpg: WARNING: This key is not certified with a trusted signature!
    gpg: There is no indication that the signature belongs to the owner.
    Primary key fingerprint: 647F 2865 4894 E3BD 4571 99BE 38DB BDC8 6092 693E

Remarque :

éventuellement pour voir/contacter les signataires de cette clé:

gpg --list-sigs ABAF11C65A2970B130ABE3C479BE3E4300411886

Décompression

    # on décompresse
tar -xaf linux-$kversion.tar.xz

    # on va dans le nouveau dossier de l'archive
cd linux-$kversion

Configuration des options

à voir make help

make clean      # effacement des fichiers générés mais maintien de .config
make mrproper   # effacement des fichiers généréss + .config + divers fichiers sauvegardés
make distclean  # comme _mrproper_ + effacement sauvegarde editeur et fichier patch

reprise des options actuelles ou nouvelles configs

make olddefconfig       # réponse par défaut aux nouvelles options sans demander

make oldconfig          # config existant + demande pour les nouvelles options du kernel
make silentoldconfig    # comme ci-dessus, moins verbeux, mise à jour des dépendances
make oldnoconfig        # config existant + réponse **N** à tous les nouvelles options.
make localmodconfig     # config courante avec les modules chargés (lsmod) en désactivant les modules non chargés  
                        # pour créer un autre Pc, enregistrer lsmod de cet autre Pc et le passer comme 
                        # paramètre LSMOD
                        # autrePc$  lsmod > pclsmod  
                        # make LSMOD=pclsmod localmodconfig  
make localyesconfig     # comme localmodconfig, mais convertit tous les modules en core (=y options)

make allyesconfig   # nouvelle config avec toutes les options à **Yes** autant que possible
make allnoconfig    # nouvelle config avec toutes les options à **No** autant que possible
make alldefconfig   # nouvelle config avec toutes les options par **défaut**
make allmodconfig   # nouvelle config avec toutes les options à **"m"** autant que possible
make tinyconfig     # configure le plus petit noyau possible
make kvmconfig      # active options additionnelles pour la prise en charge des invités kvm
make xenconfig      # active options additionnelles pour xen dom0 la prise en charge des invités kernel
make defconfig      # création de `./.config` avec les valeurs par défaut de `arch/$ARCH/defconfig`  
                    # et `arch/$ARCH/configs/${PLATFORM}_defconfig`, selon l'architecture
make ${PLATFORM}_defconfig  # création de `./.config` avec les valeurs par défaut 
                            # de `arch/$ARCH/configs/${PLATFORM}_defconfig`

make savedefconfig  #sauve config courante comme `./defconfig` (config minima)

Remarque, voir aussi Documentation/kbuild/kconfig.txt

si les options ne sont pas récupérées automatiquement pour former .config
voir dans ce cas cp /boot/config-kernelPrecedant .config ou /usr/src/linux_headers-kernelPrecedant

parcourir ou modifier les options manuellement

make config     # en console pure
make menuconfig # en console ncurse 
make nconfig    # en console avec texte couleur étendu
make gconfig    # en graphique GTK+
make xconfig    # en graphique Qt

A voir:

désactiver les clés existantes du kernel

voir: https://lists.debian.org/debian-kernel/2016/04/msg00579.html

./scripts/config -d CONFIG_MODULE_SIG_ALL -d CONFIG_MODULE_SIG_KEY -d CONFIG_SYSTEM_TRUSTED_KEYS

à la compilation, questions posées pour trouver où sont les clés pour signer, ou valider pour défaut, ex:

* Certificates for signature checking
*
File name or PKCS#11 URI of module signing key (MODULE_SIG_KEY) [certs/signing_key.pem] (NEW) 
Provide system-wide ring of trusted keys (SYSTEM_TRUSTED_KEYRING) [Y/?] y
  Additional X.509 keys for default system keyring (SYSTEM_TRUSTED_KEYS) [] (NEW) 
  Reserve area for inserting a certificate without recompiling (SYSTEM_EXTRA_CERTIFICATE) [N/y/?] n
  Provide a keyring to which extra trustable keys may be added (SECONDARY_TRUSTED_KEYRING) [N/y/?] n

éviter de compiler debug

./scripts/config -d CONFIG_DEBUG_INFO

Compilation

make bindeb-pkg -j"$(nproc)" LOCALVERSION=-"$(dpkg --print-architecture)"
cd ..

avec certaines anciennes version de kernels, il fallait lancer la compilation avec fakeroot, mais plus maintenant

Rq:

Fichiers créés

fichiers créés:

linux...changes             # changelog
linux-firmware-image-...deb         # microcodes pour certains pilotes  
                    # ( absent quand on compile à partir des sources Debian) 
linux-image-...deb          # noyau Linux et modules
linux-headers-...deb            # entêtes pour construire des modules kernel externes
linux-libc-dev_...deb           # entêtes pour certaines bibliothèques de code en espace utilisateur
                    # pour le noyau comme GNU C (glibc)

Installation

su
dpkg -i linux-headers-x.x.x-architecture
dpkg -i linux-image-x.x.x-architecture
exit

Désinstallation

su
dpkg -P linux-image-x.x.x-architechure
dpkg -P linux-headers-x.x.x-architecture
exit

Rq: la partie _....deb est supprimée , juste le nom du paquet
vérifier avec apt search "linux-image-4.11|linux-headers-4.11" par exemple

recherche genérique :

dpkg -l linux-image*  linux-headers* | grep ^ii

Remarques

problème souvent rencontrés

au reboot

pcspkr is already registered

su
echo blacklist pcspkr > /etc/modprobe.d/blacklist-pcspkr.conf

conservation des noyaux installés

dans /etc/kernel/postinst.d/apt-auto-removal :

# Mark as not-for-autoremoval those kernel packages that are:
# - the currently booted version
# - the kernel version we've been called for
# - the latest kernel version (as determined by debian version number)
# - the second-latest kernel version
#
# In the common case this results in two kernels saved (booted into the
# second-latest kernel, we install the latest kernel in an upgrade), but
# can save up to four. Kernel refers here to a distinct release, which can
# potentially be installed in multiple flavours counting as one kernel.

su
mv /etc/kernel/postinst.d/apt-auto-removal /etc/kernel/postinst.d/apt-auto-removal.bak
exit

Pour info

compilation paquet standard :

make deb-pkg -j"$(nproc)" LOCALVERSION=-"$(dpkg --print-architecture)" KDEB_PKGVERSION="$(make kernelversion)"-1

produit tous les fichiers additionnels pour publier sur un dépôt Debian

linux...debian.tar.gz           # control paquet, accessoire pour dépôt debian
linux...dsc             # description, accessoire pour dépôt debian
linux...orig.tar.gz         # sources, accessoire pour dépôt debian

fichiers additionnels:

linux-image-...-dbg_...deb      # symboles de débogage pour l'image du noyau et des modules

non présent avec -d CONFIG_DEBUG_INFO

A voir