Compiler son noyau Linux sous Debian et Ubuntu - Angristan
Compiler son noyau Linux sous Debian et Ubuntu

Compiler son noyau Linux sous Debian et Ubuntu

Ce billet a été écrit il y a longtemps. Il peut contenir des informations erronées.

C’est dimanche, il ne fait pas assez beau pour sortir (ok, fausse excuse)… Alors qu’est-ce qu’on fait ?

Ben on compile Linux, pardi ! Directement depuis le code source de kernel.org, signé de la main de notre cher Linus Torvalds. On va partir du code source de la dernière version longterm (4.4.7 actuellement), pour arriver à la fin à un paquet .deb à installer sur votre PC/serveur sous Debian/Ubuntu.

Pourquoi compiler soi-même son noyau ? Il y a des avantages :

  • Choix de la version et de la branche du noyau
  • Possibilité d’avoir le noyau le plus récent (Debian 8 est toujours en 3.16)
  • Choix des modules
  • Kernel plus léger, donc démarrage plus rapide et moins d’empreinte en mémoire
  • Sûreté du code source utilisé
  • Rajouter des patch de sécurité du type grsecurity
  • Parce qu’on peut 🙂

… et des désavantages :

  • Il faut une machine puissante sinon ça prends énormément de temps
  • Possibilité d’exploser sa machine si le noyau marche pas
  • Les options sont interminables…
  • Les modules peuvent casser certaines choses (cc Docker)
  • Possiblement moins secure, Debian inclut des patch par exemple

Mais bon faut se lancer ! Pour ma part, j’ai compilé le noyau pour un serveur sous Debian 8. Cela marche pour la plupart des versions plus ou moins récentes de Debian et Ubuntu.

J’ai pris une instance Cloud avec du SSD et un gros CPU, et ça ma pris une demi-heure. Cela peut prendre plusieurs heures sur les machines les moins véloces, alors préparez-vous un café !

Notez aussi qu’il existe plusieurs manières de compiler et d’installer Linux. Ici on le fait spécifiquement pour Debian, Ubuntu et leurs dérivées puisque l’on obtiens un paquet .deb à la fin.

Attention : Vous pouvez mettre H.S. votre machine si votre kernel n’est pas fonctionnel. Faites des sauvegardes !

Pré-requis

Prévoyez d’avoir au moins 10GB d’espace disque disponible.

On installe les dépendances qui nous serviront pour la compilation :

apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc liblz4-tool kernel-package

Téléchargement

On définit une variable pour la version de Linux que l’on souhaite utiliser, ici la 4.4.7 :

LINUX_VER=4.4.7

Ensuite on crée un dossier que l’on utilisera pour compiler et stocker le code source et le binaire de notre noyau :

cd /opt
mkdir linux
cd linux

On télécharge l’archive contenant le code source depuis le site officiel :

wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-${LINUX_VER}.tar.xz

On l’extrait, puis on rentre dans le dossier :

tar xvf linux-${LINUX_VER}.tar.xz
cd linux-${LINUX_VER}

Configuration

C’est la partie délicate. C’est dans le fichier .config présent dans ce dossier que tout se joue ! 😛

Vous pouvez le configurer via une interface graphique à l’aide de la commande :

make menuconfig

screenshot_17-04-2016_akCvVzfe

Vous pouvez partir sur la base de votre noyau actuell, en copiant son fichier de configuration :

cp /boot/config-$(uname -r) .config

Voici un autre exemple de configuration (thx WonderFall). Il a le NAT, AppArmor  et LZ4 d’activé.

Si vous n’êtes pas sûr ne touchez pas trop au fichier de configuration. 😉

Compilation

On nettoie un peu le tout :

make-kpkg clean

Puis… on compile !

make-kpkg --initrd --revision=$(date +%F) kernel_image kernel_headers -j $(nproc)

Bon ok, la commande est un peu indigeste !

Partons de la commande base :

make-kpkg --initrd  kernel_image kernel_headers

La commande make-kpkg nous permet de créer un paquet pour Debian /Ubuntu depuis les sources du noyau linux avec les options suivantes :

  • --initrd : crée une image initrd, ce qui permet de charger le noyau au démarrage de votre système
  • kernel_image : crée un paquet contenant le noyau avec les modules du .config
  • kernel_headers : crée un paquet avec les headers du noyau (souvent utiles pour des modifications ultérieures du noyau)

On peut ensuite ajouter les options suivantes :

  • --revision=1.0.custom : Permet de différencier son paquet. Personnellement, je trouve que --revision=$(date +%F) est une bonne idée. Ainsi à la fin vous aurez un paquet du style linux-image-4.4.7_2016-04-17_amd64.deb
  • -j 4 : diminutif de --jobs. permet de définir le nombre de cœurs à utiliser pour la compilation. Étant donné que la commande nproc nous retourne le nombre de cœurs, on peut donc utiliser -j $(nproc).

Voilà, maintenant vous savez ce que fait la commande :

make-kpkg --initrd --revision=$(date +%F) kernel_image kernel_headers -j $(nproc)

Note : si vous n’êtes pas connecté en tant que root (i.e. sudo), vous devrez rajouter fakeroot devant la commande make. La commande fakeroot permet d’exécuter la commande make-kpkg comme si elle avait les droits root. fakeroot permet de créer des archives avec des fichiers ayant les droits root, et donc ici se sera notre paquet .deb.

Vous n’avez plus qu’à patienter….

Compiler son noyau Linux sous Debian et Ubuntu

Installation

Un fois que la compilation est terminée, vous aurez 2 paquets dans le dossier précédent :

Compiler son noyau Linux sous Debian et Ubuntu

Il ne vous reste plus qu’à les installer (on utilise les variables précédentes)

cd ..
dpkg -i linux-image-${LINUX_VER}_$(date +%F)_amd64.deb
dpkg -i linux-headers-${LINUX_VER}_$(date +%F)_amd64.deb

Normalement GRUB choisira tout seul ce nouveau noyau. Si ce n’est pas le cas je vous renvoie à cet article. Il ne vous reste plus qu’à redémarrer !

On vérifie ensuite la version de notre noyau (il y a écrit docker parce que le hostname de ce serveur était docker ^^) :

Compiler son noyau Linux sous Debian et Ubuntu

En parlant de Docker, AUFS n’étant pas inclus dans le noyau, sauf un travers un patch, il faudra donc le remplacer par Overlay. (merci encore une fois @thewonderfall)

Si vous voulez charger votre nouveau noyau sans reboot, jetez à un coup d’œil sur cet cet article.

J’ai aussi fais un petit script pour automatiser le tout sur mon Github.

Voilà ! Un noyau Linux compilé par vos soins est désormais installé sur votre machine ! Notez qu’il faudra refaire toutes ces étapes à la main pour chaque mise à jour.

Sources :


Dernière modification le 6 janvier 2018.
S’abonner
Notification pour
guest

6 Commentaires
Le plus récent
Le plus ancien Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
AlainCo

Juste un point, récemment j’ai testé la procédure avec apt-get source
et il manque un fichier*
REPORTING-BUGS et le process de build plane à la fin sur un install
il suffit apparemment de faire un touch dans la racine et ca marche

https://www.debian-fr.xyz/viewtopic.php?f=8&t=1044

sinon petite question idiote, je voulais juste activer les trace I2C (pour un soucis i2c avec amdgpu-pro/ROCm)… c’est dans le config, et j’imagine que la seule solution c’est la recompilation d’après les sources?

Jean

Est il possible de compiler le kernel sur serveur et l’installer ensuite sur pc ?

Sélénuix

Pile quand j’en avais besoin et en français en plus 🙂

Novakin

Je pensais que c’était le patch grsecurity qui désactivait le NAT chez moi, en fait non même chose sur un kernel 4.5.1.

La solution :

Networking Support -> Networking options -> Network packet filtering framework (Netfilter) -> IP:Netfilter Configuration -> Enable: IPv4 masquerade support + iptables support
Networking Support -> Networking options -> Network packet filtering framework (Netfilter) -> IPV6:Netfilter Configuration -> ip6tables NAT support -> Enable: masquerade support