initrd
initrd (INITial RamDisk) et initramfs (INITial RAM filesystem) sont deux types d'images de systèmes de fichiers permettant l'utilisation de mécanismes de mise en place de répertoire racine temporaire minimal chargé dans la mémoire vive au démarrage du noyau Linux. Ces mécanismes sont utilisés pour préparer le système d’exploitation avant la mise en place du vrai système de fichiers racine contenant le reste du système d’exploitation, en utilisant un point de montage.
En informatique embarquée, il est courant d’avoir l’ensemble du système d’exploitation dans ce répertoire racine minimal pour des raisons de performance et de temps de démarrage. Cette image chargée en mémoire contient alors l’intégralité du système d’exploitation. Dans ce cas, toute modification effectuée dans la racine du système sera perdue après un redémarrage[1],[2].
Contexte
De nombreuses distributions Linux se basent sur un seul noyau générique — que les développeurs de la distribution mettent en place afin de pouvoir fonctionner sur une grande variété de systèmes. Ce noyau contient un nombre minimal de pilotes périphériques, afin de pouvoir démarrer convenablement tout en limitant sa taille finale[3].
Les autres pilotes de périphériques (disques, SCSI, réseaux…) prennent alors la forme de modules noyau insérables à chaud, car inclure tous les pilotes possibles et imaginables dans le noyau lui-même entraînerait un noyau d’une taille importante, trop importante même pour pouvoir être utilisée sur des machines limitées en mémoire vive. Cela pose alors la question de savoir parmi ces modules lesquels sont nécessaires très tôt lors du démarrage du système, par exemple, les modules permettant de monter le système de fichiers principal qui contient le reste de la distribution.
Pour éviter de devoir recompiler le noyau afin d’intégrer tel ou tel module directement dans celui-ci, une étape de démarrage intermédiaire — nommée early user space — utilisant un système de fichier racine temporaire comme initramfs ou initrd est utilisé. Ce système de fichier racine temporaire peut contenir des utilitaires en espace utilisateur permettant de détecter le matériel présent au démarrage, les modules noyau nécessaires, ainsi que d’autres moyens d’auto-détection afin de pouvoir mettre le vrai système de fichiers racine en place[4].
Utilisation
Une image de ce système de fichier racine initial (ainsi qu’une image du noyau Linux) doivent être placés dans un lieu accessible par le chargeur d’amorçage Linux utilisé (par exemple GRUB ou U-Boot) ou le firmware de démarrage (voir UEFI). Cet endroit prend souvent la forme d’une petite partition dédiée sur le disque local nommé /boot
et formaté usuellement ext2 (ou FAT32 dans le cadre d’un système UEFI). Il peut également s’agir d’un endroit distant, accessible par TFTP pour les chargeurs d’amorçage pouvant démarrer depuis un lien Ethernet (voir système sans disque (en)).
L’image se présente souvent sous la forme d’un fichier portant le nom initrd.img-<version>
, même s’il s’agit dans les faits d’un initramfs.
Le chargeur d’amorçage va ensuite charger le noyau ainsi que le système de fichier racine temporaire dans la mémoire vive du système, et va passer l’adresse de ce dernier au noyau. À la fin de cette séquence, le noyau tente alors de déduire le format du système de fichier racine temporaire passé en paramètre, en regardant ses premiers blocs de données — qui permettent de savoir si on a affaire à un initrd ou initramfs.
initrd
Dans le cas d’un initrd, l’image représente un système de fichiers (éventuellement compressé) qui est mis à disposition dans un périphérique de bloc spécial /dev/ram0
. Celui-ci est alors monté comme système de fichier racine initial. Le pilote de périphérique devant monter celui-ci doit absolument être présent dans le noyau lui-même (par exemple, cramfs ou plus récemment SquashFS).
De nombreuses distributions ont au début utilisé un système de fichier ext2 compressé à cet usage. D’autres (comme Debian 3.1) lui ont préféré le système de fichier en lecture seule cramfs afin de permettre le démarrage sur des systèmes possédant peu de mémoire vive. En effet, une image cramfs peut être directement montée à chaud sans devoir réserver de place pour la décompression. Depuis, SquashFS a remplacé cramfs dans la quasi-totalité de cet usage.
Une fois le système de fichier racine initial monté, le noyau exécute /linuxrc
comme premier processus[5]. Son rôle est de mettre en place le vrai système de fichier racine. Quand ce script termine, le noyau s’assure que celui-ci a bien été monté, et exécute /sbin/init
pour amorcer le démarrage de la partie utilisateur. Si le système de fichier racine n’a pas pu être monté, une erreur de type kernel panic peut alors survenir.
initrd fut utilisé par Debian jusqu’au noyau 2.4 avant d’utiliser initramfs à partir du noyau 2.6[6]. Ce mécanisme fut également utilisé sur ArchLinux, Mandriva et Ubuntu.
initramfs
Dans le cas d’un initramfs (disponible depuis Linux 2.6[7]), l’image se présente sous la forme d’une archive cpio (éventuellement compressée). L’archive est dépaquetée par le noyau dans une instance spéciale de tmpfs qui deviendra alors le système de fichier racine initial.
Une fois ce dernier monté, le noyau lance alors /init
comme premier processus gérant la partie utilisateur.
Par rapport à initrd, cette technique a l’avantage de ne pas nécessiter un système de fichiers intermédiaire — et donc l’intégration des pilotes de périphériques qui vont avec dans le noyau[7].
Certains systèmes utilisent dracut afin de générer cette image initramfs[8].
En fonction des algorithmes de compression intégrés lors de la compilations du noyau, celui-ci peut décompresser une image initramfs initialement compressée au format gzip, bzip2, LZMA, XZ, LZO et LZ4[9].
Références externes
Notes et références
- (en) Gene Sally, « Survey of Filesystems for Embedded Linux », sur elinux.org, Timesys (consulté le ), p. 18
- (en) Rob Landley, « Introducing initramfs, a new model for initial RAM disks », sur linuxdevices.com, LinuxDevices, (consulté le ) : « One especially interesting feature for embedded Linux developers is that relatively simple, deeply embedded systems can use initramfs as their sole filesystem. »
- (en) Werner Almesberger, « Booting linux: the history and the future » [« Démarrer Linux : historique et futur »] [archive du ], sur www.linuxsymposium.org, Proceedings of the Ottawa Linux Symposium,
- (en) Rob Landley, « Introducing initramfs, a new model for initial RAM disks » [« Introduction à initramfs, un nouveau modèle pour les initrd »]
- (en) « linux/do_mounts_initrd.c#74 at 4f671fe2f9523a1ea206f63fe60a7c7b3a56d5c7 », sur git.kernel.org (consulté le ) : «
info = call_usermodehelper_setup("/linuxrc", argv, envp_init, GFP_KERNEL, init_linuxrc, NULL, NULL);
» - « initrd », sur wiki.debian.org, Wiki Debian (consulté le )
- (en) Rob Landley, « ramfs, rootfs and initramfs », sur kernel.org, Linux kernel source tree, (consulté le )
- (en) Richard Leland Petersen, Fedora 13: Administration, Networking, Security, Surfing Turtle Press (ISBN 978-1-936280-02-5, lire en ligne), p. 76 :
« Dracut uses kernel parameters listed on the GRUB kernel command line to configure the initramfs RAM file system on the fly, providing more flexibiltity and furthercutting down on RAM file system code. »
- (en) Kyungsik Lee, « LZ4 Compression and Improving Boot Time » [PDF], sur events.linuxfoundation.org, (consulté le ), p. 18
- Portail GNU/Linux