Au moment du démarrage, le chargeur de démarrage charge le noyau (vmlinuz) et l'image initrd (INITial RamDisk) dans la mémoire et démarre le noyau. Le noyau vérifie la présence d'un initramfs et, s'il le trouve, le monte sur / et lance /init. Le programme init est typiquement un script shell. Le processus de démarrage est plus long, même significativement plus long, si un initramfs est utilisé.
Vmlinuz est un type de noyau Linux capable de charger en mémoire le système d’exploitation, de sorte que l’ordinateur devienne utilisable et que les programmes d’application puissent être exécutés.
En tête de cette image du noyau (vmlinuz) se trouve une routine qui effectue une configuration minimale du matériel, puis décompresse le noyau contenu dans l'image du noyau et la place dans une mémoire vive. Si une image de disque RAM initiale (initrd) est présente, Cette routine le déplace en mémoire (ou nous pouvons dire extraire l'image compressée du disque mémoire dans la mémoire réelle) et le note pour une utilisation ultérieure. La routine appelle ensuite le noyau et le démarrage du noyau commence.
## Initrd
Le disque virtuel initial (initrd) est un système de fichiers racine initial monté avant la disponibilité du système de fichiers racine réel. Le initrd est lié au noyau et chargé dans le cadre de la procédure d’amorçage du noyau. Le noyau monte ensuite cet initrd en tant que Une partie du processus de démarrage en deux étapes permet de charger les modules pour rendre les systèmes de fichiers réels disponibles et accéder au système de fichiers racine réel.
Initrd contient un ensemble minimal de répertoires et d'exécutables, tels que l'outil insmod pour installer les modules du noyau dans le noyau.
Ce fichier utilise le système de fichier cramFS, squashfs ou plus généralement initramfs (système de fichier compressé au format gzip et archivé via l'utilitaire cpio).
Pour la plupart des distributions, les modules du noyau sont la plus importante raison d'avoir un initramfs. Dans une distribution générale, il y a beaucoup d'inconnues comme les types de systèmes de fichiers et les couches des disques.
Pour commencer il faut créer la racine et les sous-répertoires requis.
mkdir -p rootfs cd rootfs mkdir -p bin dev etc lib mnt proc sbin sys tmp var cd -
Pour se connecter on aura besoin d'outils de base tels que sh et mount, mais on peut plus facilement utiliser busybox.
curl -L 'https://www.busybox.net/downloads/binaries/1.26.2-defconfig-multiarch/busybox-x86_64' >rootfs/bin/busybox chmod +x root/bin/busybox
On aura également besoin d'un script d'initialisation pour monter les systèmes requis.
cat >>root/init << EOF #!/bin/busybox sh mount -t devtmpfs devtmpfs /dev mount -t proc proc /proc mount -t sysfs sysfs /sys mount -t tmpfs tmpfs /tmp sh EOF
cd rootfs find . | cpio -ov --format=newc | gzip -9 >../initramfz cd -
Pour le tester dans qemu, on aura également besoin d'un noyau Linux; lorsqu'on utilisez déjà Linux, on peut simplement utiliser celui du système hôte, il se trouve probablement dans /boot/vmlinuz*
, ou un nom similaire.
qemu-system-x86_64 -kernel /boot/vmlinuz -initrd initramfz
Pour l'exécuter dans le terminal actuel au lieu d'obtenir une nouvelle fenêtre qemu, ajouter -nographic
et -append 'console=ttyS0
aux arguments qemu-system-*
.