Bien que les utilisateurs de Linux augmentent au fil des années et que les distributions Linux soient de plus en plus utilisées en entreprise, cela n’empêche en rien l’ignorance du peuple face aux mystères qu’elles renferment. L’un de ces mystères, que peu de gens osent traiter, est la notion de kernel et des appels système.

Un mystère ne peut se démontrer, il ne peut que s’admettre.

Ne soyez pas effrayés, tout va bien se passer… je vais démystifier quelques petites choses qui vous aideront à mieux dompter ce que renferme le kernel. J’écrirai une série d’articles qui iront se plonger dans les abysses de Linux pour mieux comprendre ce que vous utilisez au quotidien sans même le savoir.

Présentation

Kernel veut dire “noyau” en anglais. Ce noyau porte bien son nom car il est partie centrale et intégrante d’un tout et sert de biais de communication.

Dans un premier temps, nous allons faire simple et considérer que le kernel est une couche située entre vos actions sur les serveurs Linux et le matériel. Il permet de transmettre les commandes des applications aux ressources physiques, et d’attribuer ces ressources aux applications.

Cette première représentation vous permet de mieux comprendre où le kernel se situe au sein d’un serveur (ou d’un poste de travail).

Le kernel est cet élément indispensable qui ne régit à aucunes règles liées au matériel (CPU, RAM, disque, carte réseau, …) ni aux applications.

Sur la plupart des serveurs (desktop), vous trouverez le kernel en version 3.x. C’est ce qui équipe la majeure partie des distributions communes et courantes.

Pour savoir sur quelle version de kernel vous vous trouvez, rien de plus simple :

uname -r

Résultat :

3.10.0-862.3.2.el7.x86_64

Décortiquons ceci :

  • Version majeure 3
  • Version mineure : 10 (liée à la version 3)
  • Patch de sécurité : 0 (lié à la version 3.10)
  • Version de release : 862
  • Nature de la distribution : el7 (Enterprise Linux: CentOS/RedHat)
  • Architecture physique : x86_64 (version 64-bits compatible)

Dans la famille du kernel, vous retrouverez plusieurs grandes versions :

  • prepatch : La branche pre-releases contient les versions intermédiaires qui seront délivrées dans la branche mainline,
  • mainline (ml) : La branche mainline contient les versions avec les nouvelles features qui sont renouvelées tous les 2-3 mois,
  • stable : La branche stable contient les versions stables où sont reportés tous les bug et fix décelés sur la branche mainline et sont appliqués les patchs de sécurité, ces versions sont renouvelées (quasi) chaque semaine,
  • longterm (lt) : La branche longterm contient les versions rétro-compatibles et seuls les bug/fix/patch importants y sont reportés, elles sont renouvelées tous les 3-6 mois.

Contexte

Le kernel permet de retranscrire les demandes de l’application vers les composants matériels du système. Ces demandes applicatives peuvent varier d’un kernel à l’autre (il existe plusieurs types de kernels) et d’une version à l’autre (chaque kernel évolue dans le temps).

En créant un serveur, vous allez faire émerger une version de kernel. Dans 99,99% des cas, le type et la version de kernel suffit à son utilisation (ouuf…!!), rassurant pour la population d’utilisateurs de Linux. Pour le faible pourcentage restant, il en va de soi de faire attention à la version utilisée, car tous les applicatifs ne requièrent pas la même version du kernel.

Le kernel est l’un des premiers éléments chargé par votre système.

En général il est installé sur votre système dans la partition /boot :

ls -l /boot

Résultat :

-rw-r--r--. 1 root root   147823 May 21  2018 config-3.10.0-862.3.2.el7.x86_64
drwxr-xr-x. 3 root root       17 Jun  5  2018 efi
drwxr-xr-x. 2 root root       39 Jan 15 13:38 grub
drwx------. 5 root root       97 Jan 15 13:38 grub2
-rw-------. 1 root root 43335076 Jun  5  2018 initramfs-0-rescue-b30d0f2110ac3807b210c19ede3ce88f.img
-rw-------. 1 root root 42815902 Jun  5  2018 initramfs-3.10.0-862.3.2.el7.x86_64.img
-rw-------. 1 root root 10593734 Jan 15 10:25 initramfs-3.10.0-862.3.2.el7.x86_64kdump.img
-rw-------. 1 root root 20614415 Jun  5  2018 initramfs-3.10.0-862.el7.x86_64.img
-rw-------. 1 root root  3409912 May 21  2018 System.map-3.10.0-862.3.2.el7.x86_64
-rwxr-xr-x. 1 root root  6228832 Jun  5  2018 vmlinuz-0-rescue-b30d0f2110ac3807b210c19ede3ce88f
-rwxr-xr-x. 1 root root  6228832 May 21  2018 vmlinuz-3.10.0-862.3.2.el7.x86_64

Notre kernel est reconnaissable par sa notation “vmlinux-“. Dans notre cas, le kernel est constitué au travers du fichier /boot/vmlinuz-3.10.0-862.3.2.el7.x86_64.

Si vous vous sentez l’âme d’un aventurier, tel un Indiana Jones à la recherche de son arche perdue, vous pouvez chercher à créer et/ou modifier vous-même le kernel à des fins mystiques. Sachez que dans les systèmes embarqués, les kernels linux utilisés sont des versions ultra-light qui incluent uniquement les modules nécessaires à faire tourner l’embarqué. Ceci permet de diminuer l’allocation de ressources pour charger les modules, de diminuer le nombre d’appels au kernel et ainsi diminuer la consommation électrique de système. Quand vous voulez faire tourner une carte embarquée avec une pile 9v pendant 1 an, il faut faire des choix et le tuning du kernel en est un de taille.

Restez prudent en manipulant le kernel, car cela peut être dangereux.

Risques

Attention en manipulant le kernel, c’est l’un des premiers éléments chargé par votre système. Si le serveur ne trouve pas le kernel à l’endroit indiqué, le système ne démarrera pas, et il faudra alors débugguer le Grub pour changer la destination.

Gardez en tête que c’est un point névralgique du système. Quand vous souhaiterez nettoyer les versions de kernels présents sur la machine, assurez-vous de supprimer la version que vous n’êtes pas en train d’utiliser. Ce serait dommage de scier la branche sur laquelle vous êtes assis.

Dans le cas où vous vous aventurez à modifier vous-même le kernel, ne paniquez pas si vous voyez un message affichant :

Kernel panic !

Les raisons peuvent être multiples, vérifiez les options et les dépendances que vous avez chargées, et assurez-vous qu’il n’en manquent pas. Certaines options du kernel en requièrent d’autres mais ne les stipulent pas explicitement.

Utilisation

Voyons maintenant comment utiliser le kernel, et revenir sur le fond de l’article, comment changer la version du kernel.

Identifier l’existant

Si vous lisez cet article, c’est que vous vous retrouvez dans la situation peu confortable de changer la version du kernel Linux. Détendez-vous je vais vous guider pas-à-pas.

Quelle est la version actuelle du kernel ?

uname -r

Quels kernels sont présents sur le système ?

ls -l /boot

Vous avez une version du kernel en 3.10 et vous souhaitez passer sur une version en 4.x, c’est parti !

Récupérer la version souhaitée

Quelle version de kernel vous souhaitez récupérer ?

Nous allons récupérer un kernel LTS (longterm support) compatible avec de la production : 4.4

Où se procurer un kernel LTS ?

Habitué des systèmes CentOS/RHEL, je travaille avec elrepo.org pour récupérer les version de kernel. On y trouve les kernels mainline (ici 4.20) et longterm (ici 4.4).

Elrepo fournit une liste de miroirs où sont hébergés les kernels. On y trouve notamment les derniers kernels disponibles pour les systèmes EL7 arch x86_64 au format RPM. Si votre distribution et/ou votre architecture varie, je vous laisse naviguer sur le miroir pour retrouver les paquets correspondants.

Donc on a le binaire, le nom du binaire, et sa version.

Installer le nouveau kernel

Pour installer le kernel, vous avez 2 possibilités :

  1. Installer le paquet depuis le site : elrepo
    • yum install -y http://elrepo.reloumirrors.net/kernel/el7/x86_64/RPMS/kernel-lt-4.4.169-1.el7.elrepo.x86_64.rpm
  2. Installer le paquet depuis le repository yum : elrepo, j’explicite cette partie ci-dessous :

Installer le repository elrepo

yum install -y https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

Chercher les versions de kernels disponibles

yum list kernel-*

Résultat :

Installed Packages
kernel.x86_64                                      3.10.0-862.3.2.el7                        installed
kernel-lt.x86_64                                   4.4.169-1.el7.elrepo                      @elrepo-kernel
kernel-ml.x86_64                                   4.20.2-1.el7.elrepo                       @elrepo-kernel
kernel-tools.x86_64                                3.10.0-862.3.2.el7                        installed
kernel-tools-libs.x86_64                           3.10.0-862.3.2.el7                        installed
Available Packages
kernel.x86_64                                      3.10.0-957.1.3.el7                        updates
kernel-abi-whitelists.noarch                       3.10.0-957.1.3.el7                        updates
kernel-debug.x86_64                                3.10.0-957.1.3.el7                        updates
kernel-debug-devel.x86_64                          3.10.0-957.1.3.el7                        updates
kernel-devel.x86_64                                3.10.0-957.1.3.el7                        updates
kernel-doc.noarch                                  3.10.0-957.1.3.el7                        updates
kernel-headers.x86_64                              3.10.0-957.1.3.el7                        updates
kernel-tools.x86_64                                3.10.0-957.1.3.el7                        updates
kernel-tools-libs.x86_64                           3.10.0-957.1.3.el7                        updates
kernel-tools-libs-devel.x86_64                     3.10.0-957.1.3.el7                        updates

On a donc des kernels en version 4.4 (kernel-lt) et 4.20 (kernel-ml).

Installer le kernel 4.4

yum install kernel-lt

Localisation du kernel

ls -l /boot

Résultat :

-rwxr-xr-x. 1 root root 6228832 Jun  5  2018 /boot/vmlinuz-0-rescue-b30d0f2110ac3807b210c19ede3ce88f
-rwxr-xr-x. 1 root root 6228832 May 21  2018 /boot/vmlinuz-3.10.0-862.3.2.el7.x86_64
-rwxr-xr-x. 1 root root 6022464 Dec 21 15:48 /boot/vmlinuz-4.4.169-1.el7.elrepo.x86_64

Nous avons installé le kernel, mais le système ne l’utilise pas encore.

uname -r

Activer le nouveau kernel

L’installation du kernel avec yum ne fait que déposer le fichier dans le répertoire /boot. Il faut maintenant faire pointer le système sur ce fichier.

J’utilise la commande grubby pour activer le kernel sur le système.

grubby --set-default=/boot/vmlinuz-4.4.169-1.el7.elrepo.x86_64

Il faut maintenant redémarrer le système…

shutdown -r now

… et constater le changement de kernel.

uname -r

Félicitations ! Vous savez maintenant changer le kernel d’un système Linux.

Everyone knew it was impossible, until a fool who didn’t know came along and did it. Albert Einstein

Si cet article vous a plu, vous en retrouverez bientôt d’autres sur le thème du kernel :

  • Fonctionnement du kernel et appels système
  • Comment Docker communique avec le kernel