initrd/initramfs est facultatif et non obligatoire. bzImage est l'image pure du noyau et peut être démarré directement par le chargeur de démarrage. Cependant, il peut être nécessaire d'exécuter certaines tâches (chargement de modules de système de fichiers, de pilotes pour l'accès au disque, montage du système de fichiers racine à partir d'un support échangeable sans nom/chemin fixe, etc.) qui nécessitent généralement l'accès à un système de fichiers et à des outils de l'espace utilisateur.
C'est ce que initramfs est pour :il s'agit d'une archive CPIO qui est attachée à l'image du noyau (l'image du noyau est le conteneur pour l'initramfs et non l'inverse) soit dans l'image du noyau elle-même, soit par le chargeur de démarrage au moment du démarrage.
Cette archive CPIO contient un rootfs initial avec les modules nécessaires pour configurer tous les périphériques pour accéder au système de fichiers racine approprié et certains programmes pour identifier ces périphériques, charger les modules, effectuer d'autres tâches de démarrage, remonter le système de fichiers racine approprié sur / et démarrer / sbin /init
initrd est similaire, à la différence principale qu'il s'agit d'une image de système de fichiers, qui peut être et est généralement compressée. Le noyau doit prendre en charge le système de fichiers utilisé et montera cette image en tant que /.
initialÉtant donné que CPIO est plus simple de plusieurs ordres de grandeur, initramfs est préféré à initrd, car cela évite à la fois l'exigence de tout module de système de fichiers intégré et facilite également la création d'initramfs. Au lieu d'avoir à créer une image ext2, à monter un périphérique en boucle et à la remplir, cela se résume à une simple création d'archive, un peu comme l'utilisation de tar.
Cependant, si vous compilez votre noyau avec tous les pilotes et modules requis intégrés dans l'image du noyau et que votre périphérique de système de fichiers racine a un nom fixe dans le système, vous n'avez pas besoin d'initramfs car le noyau peut alors faire les choses par lui-même.
Exemple minimal de QEMU + Buildroot
Voici un exemple concret minimal qui montre qu'initrd n'est pas obligatoire :https://github.com/cirosantilli/linux-kernel-module-cheat/tree/0b4f156b1b536a89c90882ed8ce551abcd3780af#initrd
Avec cette configuration, nous pouvons facilement exécuter deux commandes QEMU fonctionnelles de type :
qemu-system-x86_64 -drive file=rootfs.ext2
et :
qemu-system-x86_64 -initrd rootfs.cpio
Où :
rootfs.ext2
etrootfs.cpio
sont fondamentalement le même système de fichiers racine, mais dans des formats différents- la première commande a un disque dur et pas de
-initrd
- la deuxième commande un
-initrd
mais pas de disque dur
Dans les deux cas, Linux démarre bien, sauf que dans le -initrd
système, les écritures de fichiers ne sont pas persistantes puisque tout est en mémoire.