Initramfs/Guide
Certains systèmes sous Linux requièrent un système de fichiers virtuel initial (initramfs) pour démarrer correctement. Ce guide aborde le concept de système de fichiers virtuel initial (initramfs) et la manière de créer et de gérer des instances d'un tel système.
Concept du système de fichiers virtuel initial (Initramfs)
Introduction
Beaucoup d'utilisateur ne se soucient pas de ce système de fichiers virtuel. Leur système utilise un schéma de partitionnement simple, sans pilote exotique ou sans configuration particulière (comme un système de fichiers chiffré/crypté), et ainsi, le noyau Linux est en mesure de passer le contrôle au binaire init de leur système. Mais, pour beaucoup de systèmes, un système de fichiers virtuel (initramfs system) initial est presque indispensable.
Le processus de démarrage de Linux
Dès que le noyau Linux a le contrôle sur le système (qu'il obtient après avoir été chargé par le chargeur de démarrage), il prépare ses structures mémoire et ses pilotes. Il passe ensuite le contrôle à une application (en général init) dont la tâche est de terminer la préparation du système et de s'assurer que, à la fin du processus de démarrage, tous les services nécessaires sont démarrés et que l'utilisateur est en mesure de se connecter. L'application init accomplit cela en lançant, entre autres services, le démon udev qui chargera ensuite et préparera le système en fonction des périphériques détectés. Lorsque udev est lancé, tous les systèmes de fichiers qui n'ont pas encore été montés le sont, et le reste des services est démarré.
Pour les systèmes dans lesquels tous les fichiers et outils nécessaires résident sur le même système de fichiers, l'application init peut parfaitement contrôler la suite du processus de démarrage. Mais lorsque des systèmes de fichiers multiples sont définis (ou des installations plus exotiques ont lieu), ceci peut devenir plus problématique :
- Quand la partition /usr est sur un système de fichiers séparé, les outils et les pilotes qui ont des fichiers stockés dans /usr ne peuvent être utilisés sauf si /usr est accessible. Si ces outils sont nécessaires pour rendre /usr accessible, alors il devient impossible de démarrer le système.
- Si le système de fichier root est chiffré/crypté, alors le noyau Linux ne sera incapable de trouver l'application init ce qui conduira à un système non amorçable (unbootable).
La solution à ces problèmes a été pendant longtemps d'utiliser un disque racine initial initrd.
Le disque root initial
initrd est une structure de disque en mémoire (ramdisk) qui contient les outils et scripts nécessaires au montage des systèmes de fichiers requis avant que le contrôle ne soit passé à l'application init du système de fichier root. Le noyau Linux déclenche le script de configuration (ordinairement appelé linuxrc mais ça n'est pas une obligation) sur ce disque root, lequel prépare le système, commute vers le système de fichiers root réel et appelle ensuite init.
Bien que la méthode de l'initrd soit suffisante, elle présente quelques inconvénients :
- C'est un périphérique de blocs à part entière, qui nécessite le surcoût d'un système de fichiers complet sur lui, et a une taille fixe. Choisissez un initrd trop petit, et vous ne pourrez y placer tous les scripts nécessaires. Choisissez-le trop grand et vous allez gaspiller la mémoire.
- Comme c'est un périphérique réel statique, il consomme de la mémoire cache dans le noyau Linux et est sujet aux méthodes de gestion de fichiers utiliser(tel que paging) accroissant la consommation de mémoire de initrd.
C'est pour résoudre ces problèmes, que le système de fichiers virtuel initial (initramfs) a été inventé.
Le système de fichiers virtuel initial
Un système de fichiers virtuel initial (initramfs) est un système de fichiers initial en mémoire ram basé sur tmpfs (un système de fichiers léger de taille flexible, en mémoire), qui n'utilise pas un périphérique de blocs séparé (ainsi aucun cache n'est nécessaire, ce qui élimine les surcoûts mentionnés précédemment). Tout comme le initrd, il contient les outils et les scripts nécessaire au montage des systèmes de fichiers avant que le contrôle e soit passé à l'application init du système de fichiers root réel.Ces outils peuvent être, des couches d'abstraction du chiffrage (pour les système chiffrés/cryptés), des gestionnaire de volumes logiques, le raid logiciel, des chargeurs de systèmes de fichiers basés sur des pilotes bluetooth, etc.
Le contenu de l'initramfs est créé en créant une archive cpio. cpio est une ancienne (mais éprouvée) solution d'archivage de fichiers. Les archives produites sont appelées fichiers cpio. cpio est comparable à l'archiveur tar. cpio a été choisi ici parce que le code était plus facile à mettre en œuvre et qu'il prenait en charge des fichiers de périphériques, ce que tar ne permettait pas à ce moment.
Tous les fichiers, les outils, les bibliothèques, les fichiers de configuration (si applicables), etc. sont placés dans l'archive cpio. L'archive est ensuite compressée avec l'utilitaire gzip et stockée avec le noyau Linux. Le chargeur d'amorçage (boot loader) le présente ensuite au noyau Linux au moment du démarrage ainsi le noyau sait qu'un système de fichiers virtuel initial (initramfs) est nécessaire.
Une fois détecté, le noyau Linux crée un système de fichiers tmpfs, extrait le contenu de l'archive dans ce système de fichiers, et lance le script init situé à la racine du système de fichiers tmpfs. Ce script monte ensuite la racine (root) du système de fichiers réel (après s'être assuré qu'il peut le faire, par exemple en chargeant des modules additionnels, en préparant un couche d'abstraction du chiffrage, etc.) ainsi que les autres systèmes de fichiers vitaux (comme /usr and /var).
Dès lors que le système de fichier racine (root) et les autres systèmes de fichiers vitaux sont montés, le script init du initramfs commute la racine (root) vers le système de fichiers racine réel et, finalement, appelle le binaire /sbin/init sur ce système pour continuer le processus de démarrage.
Créer un système de fichiers virtuel initial (initramfs)
Introduction et configuration du chargeur de démarrage (bootloader)
Pour créer un système de fichiers virtuel initial, il est important de connaître quels pilotes, scripts et outils additionnels sont nécessaires au démarrage du système. Par exemple, lors de l'utilisation de LVM, il faut disposer des outils de prise en charge de LVM dans l'initramfs. De la même manière, lors de l'utilisation de RAID logiciel, mdadm est nécessaire, et ainsi de suite.
The root disk and root filesystem needs to be accessible
In practice, this usually means CONFIG_SATA_AHCI or CONFIG_BLK_DEV_NVME (for the disk), and CONFIG_EXT4_FS (the filesystem) should ideally be built-in [=y] to the kernel; otherwise having these as modules [=m] will require these modules to be loaded by the initramfs first so booting can continue.
If LVM is used, then LVM tools will be needed in the initramfs.
If software RAID is used, mdadm utilities will be needed, or DMRAID, etc... ZFS and BTRFS would also require consideration here.
Plusieurs outils existent pour aider l'utilisateur à créer l'archive compressée du système de fichiers virtuel initial (archives cpio compressées) pour son système. Ceux qui tiennent à conserver un contrôle total, peuvent aussi créer facilement une image initramfs personnalisée.
Une fois créée, la configuration du chargeur de démarrage devra être ajustée pour l'informer qu'un initramfs doit être utilisé. Par exemple, si le fichier initramfs est stocké dans /boot/initramfs-3.2.2-gentoo-r5, alors la configuration dans /boot/grub/grub.conf pourrait ressembler à ceci :
Usually this is done by re-generating the config file grub-mkconfig -o /boot/grub/grub.cfg
For instance, if the initramfs file is stored as /boot/initramfs-5.15.32-gentoo-r1.img, then afterwards, the GRUB configuration in /boot/grub/grub.cfg would look somewhat like the following:
title Gentoo Linux 3.2.2-r5
root (hd0,0)
kernel /boot/kernel-3.2.2-gentoo-r5
initrd /boot/initramfs-3.2.2-gentoo-r5
En utilisant genkernel
L'utilitaire de compilation du noyau genkernel peut être utilisé pour générer un initramfs, même si genkernel n'a pas été utilisé pour configurer et compiler le noyau.
Pour créer un initramfs en utilisant genkernel, il est recommandé que d'inclure tous les pilotes et codes nécessaires au montage des systèmes de fichiers / et /usr dans le noyau (pas en tant que modules). Ensuite lancez genkernel comme indiqué ci-dessous :
Si les modules sont nécessaires dans l'initramfs, exécutez genkernel comme ceci:
root #
genkernel --install initramfs
Selon le système, il peut être nécessaire d'ajouter une, ou plus, des options suivantes :
Option | Description |
---|---|
--disklabel
|
Ajoute la prise en charge des LABEL= de disque dans votre /etc/fstab
|
--dmraid
|
Ajoute la prise en charge du RAID matéril factice |
--firmware
|
Ajoute le micro-code trouvé sur le système. |
--gpg
|
Ajoute la prise en charge de GnuPG |
--iscsi
|
Ajoute la prise en charge de iSCSI |
--luks
|
Ajoute la prise en charge des conteneurs de chiffrage luks |
--lvm
|
Ajoute la prise en charge de LVM |
--mdadm
|
Ajoute la prise en charge du RAID logiciel |
--multipath
|
Ajoute la prise en charge pour des accès entrée/sortie multiples vers un SAN |
--zfs
|
Ajoute la prise en charge de ZFS |
Une fois terminé, le fichier initramfs résultant est stocké dans le répertoire /boot.
En utilisant dracut
L'utilitaire dracut a été créé dans le seul but de gérer les fichiers initramfs.
Pour installer l'outil Dracut, exécutez :
root #
emerge --ask sys-kernel/dracut
L'étape suivante consiste à configure dracut en éditant /etc/dracut.conf.
Une fois configuré, créer un initramfs en appelant dracut comme indiqué ci-dessous :
root #
dracut
L'image résultante prend en charge les systèmes de démarrage génériques en se basant sur la configuration déclarée dans /etc/dracut.conf. Il est aussin possible de générer un initramfs spécifique a votre système (dans lequel dracut essaie de détecter le outils, pilotes, etc. nécessaires depuis le système existant). Si la prise en charge nécessaire (code et pilote) est incluse dans le noyau (pas en tant que module séparés et référence aux firmware), alors l'option --no-kernel
peut être ajouter:
root #
dracut --host-only --no-kernel
Pour plus d'informations, jetez un coup d'œil aux pages de manuel de dracut et dracut.cmdline :
user $
man dracut
user $
man dracut.cmdline
Voir aussi
- Initramfs — is used to prepare Linux systems during boot before the init process starts.
- Initramfs - make your own — build an initramfs which does not contain kernel modules.
- Custom Initramfs — the successor of initrd. It provides early userspace which can do things the kernel can't easily do by itself during the boot process.
- Early Userspace Mounting — how to build a custom minimal initramfs that checks the /usr filesystem and pre-mounts /usr.
Ressources externes
- Le fichier ramfs-rootfs-initramfs.txt dans la documentation du noyau linux (Linux kernel).