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.
Table des matières
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
lsinitramfs
Cette commande permet de lister le contenu d’un fichier initrd.img :
lsinitramfs <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 .
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
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.
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.
Liens
- Système d’exploitation et OS : qu’est-ce que c’est ? comment ça marche ?
- Qu’est-ce que le noyau d’un OS (Kernel)
- Qu’est-ce que le Noyau Linux (kernel) : rôle, versions et comment ça marche
- Les modules du noyau Linux : charger, décharger et fonctionnement
- Comment compiler le noyau Linux
- Utiliser modprobe et configurer /etc/modprobe.d/
- Ajouter un module du noyau Linux avec module assistant sur Debian
- Qu’est-ce que initrd dans Linux : rôle et comment ça marche
- Qu’est-ce que vmlinuz dans Linux
- Comment connaître la version du noyau Linux
- sysctl : paramétrer le noyau Linux
- NTFS, EXT4 : Comprendre les systèmes de fichiers