Compiler son noyau Linux sous Debian et Ubuntu
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
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èmekernel_image
: crée un paquet contenant le noyau avec les modules du .configkernel_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 stylelinux-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 commandenproc
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….
Installation
Un fois que la compilation est terminée, vous aurez 2 paquets dans le dossier précédent :
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 ^^) :
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 :
- http://www.cyberciti.biz/faq/debian-ubuntu-building-installing-a-custom-linux-kernel/
- https://computerz.solutions/kernel-4-4-debian-8/
Dernière modification le 6 janvier 2018.
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?
Est il possible de compiler le kernel sur serveur et l’installer ensuite sur pc ?
Oui.
Pile quand j’en avais besoin et en français en plus 🙂
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
Non non il n’est juste pas activé par défaut ^^ (il l’est dans le .config que j’ai donné comme exemple)
Merci pour les autres qui se poseront peut-être la question 😉