Comment construire un initramfs à l’aide de Dracut sous Linux
Dans un précédent article, nous avons parlé de l’écoute et de l’extraction du contenu d’une image initramfs à l’aide d’outils simples et standard comme gzip, dd et cpio ou avec des scripts dédiés comme lsinitramfs, lsinitrd et unmkinitramfs. Dans ce tutoriel, nous apprenons à (re)construire un initramfs sous Linux en utilisant dracut.
Dans ce tutoriel, vous allez apprendre :
- Qu’est-ce que dracut
- Comment répertorier les modules dracut
- Comment construire un initramfs avec dracut
- Comment construire un initramfs pour une version spécifique du noyau
- Comment construire un initramfs pour tous les noyaux
- Comment construire un initramfs adapté à l’hôte
- Comment lister les fichiers contenus dans les initrams et obtenir leur contenu
- Comment inclure des fichiers supplémentaires dans l’initramfs
- Comment changer la méthode de compression initramfs
- Comment utiliser les fichiers de configuration dracut
Configuration logicielle requise et conventions utilisées
Présentation de dracut
Dracut est un outil utilisé pour construire des archives initramfs cpio. Il est à l’origine et est principalement utilisé sur Fedora et les autres distributions qui font partie de la famille Red Hat, mais peut également être utilisé sur des distributions communautaires comme Gentoo et Archlinux. Les fonctionnalités de l’application sont organisées en modules. Afin de lister tous les modules dracut disponibles sur le système, il suffit d’invoquer l’application avec l’option --list-modules, qui renvoie un résultat similaire à ce qui suit :
dracut --list-modules
bash
systemd
systemd-network-management
warpclock
fips
systemd-ac-power
systemd-ask-password
systemd-coredump
systemd-hostnamed
systemd-initrd
systemd-journald
systemd-ldconfig
systemd-modules-load
[...]
Tous les modules dracut se trouvent dans le répertoire /usr/lib/dracut/modules.d. Dans ce répertoire, tous les modules sont représentés sous forme de sous-répertoires et contiennent une série de scripts. Chaque module apporte une fonctionnalité spécifique. Le module plymouth, par exemple, (/usr/lib/dracut/modules.d/50plymouth), fournit la prise en charge des animations de démarrage (il nécessite l’installation du paquet « plymouth »).
Utilisation de base de Dracut
Dans son utilisation la plus basique, nous pouvons invoquer dracut sans aucune option ni argument. Lorsqu’il est utilisé de cette façon, le programme essaie de générer l’initramfs pour le noyau qui est actuellement utilisé par le système en utilisant le modèle de nom suivant :
/boot/initramfs-<kernel-version>La version du noyau peut être facilement obtenue en utilisant l’utilitaire uname avec l’option -r (abréviation de --kernel-release). On peut donc deviner le nom qui sera utilisé pour l’initramfs exécutant la commande suivante :
echo "/boot/initramfs-$(uname -r)"Si un initramfs portant le même nom que celui qui serait généré par dracut existe déjà, l’application refusera de l’écraser, affichant une erreur similaire à la suivante :
dracut: Will not override existing initramfs (/boot/initramfs-5.14.14-300.fc35.x86_64.img) without --forceComme suggéré dans le message lui-même, afin de remplacer un initramfs existant, nous devons exécuter dracut avec l’option --force.
Construire un initramfs pour une version spécifique du noyau
La façon la plus simple de construire un initramfs pour une version spécifique du noyau est d’invoquer dracut avec l’option --kver, et de fournir la version du noyau pour laquelle l’initramfs doit être construit comme argument :
sudo dracut --kver 5.14.14-300.fc35.x86_64Les initramfs seront construits à l’intérieur du répertoire /boot, en utilisant le modèle de nommage que nous avons vu ci-dessus. Si nous voulons construire un initramfs pour une version spécifique du noyau dans un emplacement personnalisé, nous pouvons invoquer dracut avec le chemin où l’image doit être créée comme premier argument, et passer la version du noyau comme seconde. À titre d’exemple, pour générer une image initramfs nommée d’après le noyau en cours d’exécution explicitement, dans le répertoire de travail actuel, nous exécuterions :
sudo dracut . 5.14.14-300.fc35.x86_64La commande ci-dessus générera un initramfs dans le répertoire à partir duquel il est lancé, nommé initramfs.img.
Construire des initramfs pour tous les noyaux existants
Parfois, nous pouvons vouloir construire ou reconstruire les initramfs pour tous les noyaux existants sur notre système d’exploitation. Dracut offre un moyen très simple d’accomplir cette tâche. Tout ce que nous avons à faire est d’exécuter l’application et d’utiliser l’option --regenerate-all. Les archives initramfs seront créées dans le répertoire par défaut. Comme dit précédemment, si l’initramfs d’un noyau spécifique existe déjà, nous devons également passer l’option --force :
sudo dracut --regenerate-all --forceCréation d’un initramfs adapté à l’hôte
Normalement, lorsque nous générons un initramfs avec dracut, une configuration d’hôte générique est créée. À l’intérieur de l’initramfs, tout ce qui pourrait être nécessaire pour démarrer une machine générique est inclus, afin d’assurer la compatibilité maximale possible. Si nous ne voulons que ce qui est réellement nécessaire pour qu’une machine spécifique soit placée à l’intérieur de l’initramfs, nous pouvons exécuter dracut avec l’option -H (abréviation de --hostonly). Pour reconstruire un initramfs adapté à l’hôte pour le noyau en cours d’exécution, nous exécuterions cette commande simple :
sudo dracut -H --forceLister les fichiers contenus dans les initrams et obtenir leur contenu
Dans un tutoriel précédent, nous avons vu comment nous pouvons inspecter le contenu d’un initramfs sous Linux. En quelques mots, la méthode recommandée pour effectuer l’action sur Fedora, et généralement sur les distributions qui font partie de la famille Red Hat, et qui utilisent dracut, est d’utiliser le script lsinitrd, en passant le chemin des initramfs que nous voulons examiner en argument. Pour inspecter le contenu de l’initramfs /boot/initramfs-5.14.14-300.fc35.x86_64.img, par exemple, nous exécuterions :
sudo lsinitrd /boot/initramfs-5.14.14-300.fc35.x86_64.imgLa commande ci-dessus, entre autres choses, produit une liste des fichiers contenus dans l’initramfs. Pour inspecter le contenu d’un fichier, nous pouvons utiliser l’option -f de lsinitrd et passer le chemin du fichier à l’intérieur de l’initramfs comme argument. Juste à titre d’exemple, pour lire le contenu du fichier etc/crypttab qui est inclus dans l’initramfs, nous exécuterions :
sudo lsinitrd /boot/initramfs-5.14.14-300.fc35.x86_64.img -f etc/crypttabInclure des fichiers supplémentaires dans l’initramfs avec l’option –include
Parfois, nous pouvons vouloir inclure des fichiers supplémentaires à l’intérieur de l’initramfs. Il y a essentiellement deux options que nous pouvons utiliser pour effectuer cette opération : --include et --install ; Voyons comment ils fonctionnent.
Inclusion de fichiers à l’aide de –include
L’option --include prend deux arguments, dans l’ordre :
- Le chemin du fichier à inclure dans l’initramfs (source)
- Le chemin que le fichier doit avoir à l’intérieur de l’initramfs (destination)
Supposons que nous voulions reconstruire l’initramfs pour le noyau en cours d’exécution, et que nous voulions inclure le fichier /custom-content.conf en tant que /etc/custom-content.conf à l’intérieur de celui-ci. Nous courrions :
sudo dracut --include /custom-content.conf /etc/custom-content.conf --forceEn utilisant l’option --include, nous pouvons également inclure le contenu d’un répertoire à l’intérieur de l’initramfs. Supposons que nous ayons le répertoire /foo et que nous voulions inclure son contenu dans le répertoire / à l’intérieur de l’initramfs. Nous courrions :
sudo dracut --include /foo / --forceSeul le contenu du répertoire sera copié à l’intérieur de l’initramfs, et non le répertoire lui-même.
Installation de fichiers à l’aide de l’option –install
L’option --install peut également être utilisée pour inclure des fichiers à l’intérieur de l’initramfs. La principale différence avec --include est que les fichiers sont installés à l’intérieur de l’initramfs au même endroit qu’ils ont dans le système. Lors de l’utilisation de l’option, nous fournissons la liste des fichiers qui doivent être inclus en argument ; Plusieurs fichiers doivent être spécifiés entre guillemets, séparés par des espaces. Pour régénérer les initramfs pour le noyau en cours d’exécution et installer les fichiers /custom-content.conf et /custom-content0.conf, par exemple, nous exécuterions :
sudo dracut --install "/custom-content.conf /custom-content0.conf" --forceLes fichiers à inclure doivent exister sur le système de fichiers source, sinon une erreur sera générée. Si nous ne sommes pas sûrs qu’un fichier existe ou non, nous pouvons utiliser --install-optional, à la place : les fichiers ne seront inclus que s’ils existent.
Contrôle de la compression de l’initramfs
Par défaut, l’archive cpio contenant les fichiers initramfs est compressée à l’aide de gzip. Nous pouvons toutefois décider d’utiliser une méthode de compression alternative ou de ne pas compresser du tout. Nous pouvons configurer ce paramètre à l’aide des options de ligne de commande appropriées. Ils sont nommés d’après l’algorithme utilisé pour la compression. Parmi les autres :
- –no-compress (Initramfs n’est pas compressé)
- –gzip
- –bzip2
- –lzma
- –xz
- –lzo
- –lz4
Fichier de configuration Dracut
Jusqu’à présent, nous avons vu comment configurer de nombreux aspects de la génération d’initramfs en utilisant les options de ligne de commande dracut. Comme alternative, nous pouvons modifier le comportement de dracut en utilisant son fichier de configuration. Avant de parler de certaines des configurations que nous pouvons configurer, il est important de comprendre comment les fichiers de configuration sont traités. Par ordre de priorité :
- Options d’exécution
- Fichiers de configuration se terminant par « .conf " dans /etc/dracut.conf.d
- Fichiers de configuration se terminant par « .conf " dans /usr/lib/dracut/dracut.conf.d
- Configurations dans /etc/dracut.conf
Les options de ligne de commande remplacent toujours ce qui est indiqué dans les fichiers de configuration. Le fichier de configuration principal de dracut est /etc/dracut.conf, mais l’installation peut être rendue modulaire à l’aide de fichiers de configuration dédiés se terminant par le suffixe .conf, qui peuvent être placés dans les répertoires /usr/lib/dracut/dracut.conf.d (généralement les configurations « vendor ») et /etc/dracut.conf.d. Les fichiers de configuration de ce dernier répertoire remplacent ceux portant le même nom dans le premier. Les fichiers avec le suffixe .conf sont traités dans l’ordre alphanumérique. Les directives existantes dans ces fichiers remplacent celles spécifiées dans le fichier /etc/dracut.conf. Pour la liste complète des instructions qui peuvent être utilisées dans les fichiers de configuration, veuillez consulter la page de manuel en exécutant :
man dracut.confNous ne rapportons ici que quelques exemples :
| Configuration | Explication |
|---|---|
| dracutmodules+="<modules dracut> » | Liste séparée par des espaces des modules qui doivent être utilisés pour l’initramfs |
| add_dracutmodules+="<modules dracut> » | Liste séparée par des espaces des modules supplémentaires qui doivent être utilisés pour l’initramfs |
| install_items+= "<fichier>[ <fichier> ...]” | Liste des fichiers séparés par des espaces qui doivent être installés dans l’initramfs |
| compress="{cat|bzip2|lzma|xz|gzip|lzo|lz4|zstd|<compresseur [args ...]>}” | Spécifier la méthode de compression |
| hostonly="{oui|non} » | Spécifiez si seulement ce qui est nécessaire pour l’hôte doit être inclus dans l’initramfs |
Conclusions
Dans ce tutoriel, nous avons parlé de dracut, l’outil utilisé pour compiler initramfs sur de nombreuses distributions Linux, principalement sur celles qui font partie de la famille Red Hat. Nous avons vu les bases de dracut, comment construire un initramfs pour une version spécifique du noyau et pour tous les noyaux installés sur le système, comment construire un initramfs adapté à l’hôte, comment lister les fichiers à l’intérieur de l’initramfs et comment inclure des fichiers supplémentaires. Nous avons également vu comment changer la méthode de compression initramfs et, enfin, comment utiliser les fichiers de configuration dracut.
