Menu Fermer

Qu’est-ce que initrd dans Linux : rôle et comment ça marche

En jetant un coup d’œil au contenu du répertoire /boot de votre Linux, vous avez remarqué plusieurs fichiers dont initrd.img, vmlinuz et System.map.
Dans ce tutoriel, nous allons nous intéresser à initrd (Initramfs).
Qu’est-ce initdr ? Quel est son rôle et à quoi sert-il ?

Dans ce tutoriel, je vous explique ce qu’est le fichier initrd dans Linux.

Qu'est-ce que initrd dans Linux : rôle et comment ça marche

Qu’est-ce que initrd et à quoi sert-t-il ?

Initial RAM disk (initrd ou Initramfs) qui est un système de fichiers racine initial qui est monté en mémoire au démarrage du système lorsque le système de fichiers racine réel est indisponible.
Comme son nom l’indique, c’est un disque RAM ou disque virtuel mémoire.
Le chargeur de démarrage (GRUB, rEFInd, Syslinux, etc) charque ce dernier afin de pouvoir charger en mémoire, les modules nécessaires au chargement du noyaux Linux.
L’Initrd est lié au noyau Linux et est utilisé dans le cadre de la procédure de démarrage du kernel Linux.

En effet, le noyau Linux charge les pilotes et modules nécessaires au fonctionnement de l’appareil.
Mais lorsque les modules ne sont pas compilés directement dans le noyaux Linux, ils sont stockés dans la partition racine dans le répertoire /lib/modules/.
Or ce dernier est inaccessible, car pour accéder au disque certains modules doivent être chargés au préalable.
De plus, la partition racine n’est pas nécessairement en ext4 et peut être accédé par NFS, stocké dans un système RAID comme mdam, LVM (Logical Volume Management) ou sur un disque chiffré avec LUKS.
Ainsi, c’est le serpent qui se mort la queue.
initrd résout ce problème en chargeant les modules minimaux qui vont permettre de monter la partition racine en lecture seule.
Notamment, les utilitaires minimaux dont insmod est présent avec quelques modules du noyaux.

Quelle est la structure du fichier initrd (Initramfs)

Dans le fichier image, on trouve les répertoires early et early2 qui stockent les microcodes (voir plus bas).
On trouve aussi un main qui comme son nom l’indique est la partie principale du disque RAM.

Ce répertoire stocke les dernières mises à jour du microcode, des firmwares, des modules externes, de scripts et binaires.
L’arborescence est relativement similaire à Linux avec les dossiers :

bin  conf  etc  init  lib  lib32  lib64  libx32  run  sbin  scripts  usr  var
Quelle est la structure du fichier initrd

lsinitramfs

Cette commande permet de lister le contenu d’un fichier initrd.img :

lsinitramfs <fichier initrd.img>
La commande lsinitramfs pour lister le contenu du fichier initrd.img :

unmkinitramfs

Cette commande permet de décompresser le contenu d’un fichier initrd.img :

mkdir /tmp/initrd
cd !$
cp /boot/initrd.img .
unmkinitramfs initrd.img .
La commande unmkinitramfs pour décompresser un fichier initrd.img

initrd et microcode

Les fabricants de processeurs publient des mises à jour de stabilité et de sécurité du microcode du processeur. Ces mises à jour fournissent des correctifs de bogues qui peuvent être essentiels à la stabilité de votre système. Sans eux, vous pouvez ressentir des accidents parasites ou des arrêts de système inattendus qui peuvent être difficiles à retrouver.

Le noyau Linux possède un système de chargement de microcode x86 qui est censée. Cela permet des mises à jour du microcode sur des plates-formes au-delà du support de fin de vie OEM, et mettre à jour le microcode sur des systèmes LTS sans redémarrer.

Le fichier initrd peut aussi stocker le microcode du noyaux Linux.
Pendant BSP (processeur bootstrap) Boot (pré-SMP), le noyau scanne le fichier de microcode dans le INITRD. Si une correspondance de microcode du CPU est trouvée, elle sera appliquée dans le BSP et plus tard dans le système d’exploitation.

  • Intel: kernel/x86/microcode/GenuineIntel.bin
  • AMD : kernel/x86/microcode/AuthenticAMD.bin
initrd et microcode Linux

Les étapes du démarrage avec initrd

Le noyau utilise initrd pour effectuer deux étapes : charger les modules pour rendre les systèmes de fichiers réels disponibles et obtenir le système de fichiers racine réel.

Voici dans les grandes lignes les opérations effectuées durant le chargement d’initrd :

  • Le chargeur de démarrage charge le noyau et le disque RAM initial
  • Le noyau convertit initrd en un disque de RAM «normal» et libère la mémoire utilisée par initrd
  • Le dispositif racine est monté. Si c’est /dev/ram0, l’image initrd est ensuite montée comme racine
  • /sbin/init est exécuté (cela peut être n’importe quel exécutable valide, y compris les scripts shell; il est exécuté avec UID 0 et peut faire essentiellement tout ce que init peut faire).
  • init monte le «vrai» système de fichiers racine
  • init place le système de fichiers racine au répertoire racine à l’aide de l’appel du système PIVOT_ROOT
  • init exécute le /sbin/init sur le nouveau système de fichiers racine, effectuant la séquence de démarrage habituelle
  • Le système de fichiers INITRD est supprimé

Plus de détails :

initrd dans /boot et dans le chargeur de démarrage GRUB

Dans la configuration de grub (grub.cfg), la déclaration du initdr se fait de cette manière :

echo    'Loading initial ramdisk ...'
initrd  /boot/initrd.img-5.10.0-17-rt-amd64

Voici un exemple complet :

menuentry 'Debian GNU/Linux, with Linux 5.10.0-17-rt-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.10.0-17-rt-amd64-advanced-UUID=074e5a60-b0b8-4876-8673-bec4bc8394a5' {
                load_video
                insmod gzio
                if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
                insmod part_msdos
                insmod ext2
                set root='hd0,msdos1'
                if [ x$feature_platform_search_hint = xy ]; then
                  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  074e5a60-b0b8-4876-8673-bec4bc8394a5
                else
                  search --no-floppy --fs-uuid --set=root 074e5a60-b0b8-4876-8673-bec4bc8394a5
                fi
                echo    'Loading Linux 5.10.0-17-rt-amd64 ...'
                linux   /boot/vmlinuz-5.10.0-17-rt-amd64 root=UUID=074e5a60-b0b8-4876-8673-bec4bc8394a5 ro vga=normal nomodeset quiet apparmor=1 security=apparmor
                echo    'Loading initial ramdisk ...'
                initrd  /boot/initrd.img-5.10.0-17-rt-amd64
        }

On retrouve différents fichier initrd.img dans /boot correspondant aux versions du noyau Linux disponible.
Ce dernier étant le fichier vmlinuz.

initrd dans /boot et dans le chargeur de démarrage GRUB

On retrouve exactement la même chose sur Ubuntu.
Toutefois ce dernier utilise un lien symbolique avec les noms génériques tels que initrd.img, vmlinuz qui pointent vers la dernière version.

initrd dans /boot et dans le chargeur de démarrage GRUB