Website-Suche

So erstellen Sie ein initramfs mit Dracut unter Linux


In einem früheren Artikel haben wir über das Abhören und Extrahieren des Inhalts eines initramfs-Bildes mit standardmäßigen, einfachen Tools wie gzip, dd und cpio oder mit dedizierten Skripten wie lsinitramfs, lsinitrd und unmkinitramfs gesprochen. In diesem Tutorial lernen wir, wie man ein initramfs unter Linux mit dracut (neu) erstellt.

In diesem Tutorial lernen Sie:

  • Was ist Dracut
  • So listen Sie Dracut-Module auf
  • Wie man ein initramfs mit dracut erstellt
  • Wie man ein initramfs für eine bestimmte Kernel-Version erstellt
  • Wie man ein initramfs für alle Kernel erstellt
  • So erstellen Sie ein auf den Host zugeschnittenes initramfs
  • So listen Sie Dateien auf, die in den Initrams enthalten sind, und erhalten deren Inhalt
  • Wie man zusätzliche Dateien in das initramfs einbindet
  • So ändern Sie die initramfs-Komprimierungsmethode
  • So verwenden Sie Dracut-Konfigurationsdateien

Verwendete Softwareanforderungen und Konventionen

Wir stellen vor: dracut

Dracut ist ein Werkzeug, das zum Erstellen von initramfs cpio-Archiven verwendet wird. Es stammt ursprünglich und wird hauptsächlich auf Fedora und den anderen Distributionen verwendet, die Teil der Red Hat-Familie sind, kann aber auch auf Community-Distributionen wie Gentoo und Archlinux verwendet werden. Die Anwendungsfunktionalitäten sind in Modulen organisiert. Um alle auf dem System verfügbaren Dracut-Module aufzulisten, müssen wir einfach die Anwendung mit der Option --list-modules aufrufen, die eine Ausgabe ähnlich der folgenden zurückgibt:

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
[...]

Alle Dracut-Module befinden sich im Verzeichnis /usr/lib/dracut/modules.d. In diesem Verzeichnis werden alle Module als Unterverzeichnisse dargestellt und enthalten eine Reihe von Skripten. Jedes Modul bietet eine bestimmte Funktionalität. Das plymouth-Modul (/usr/lib/dracut/modules.d/50plymouth) bietet beispielsweise Unterstützung für Boot-Animationen (es erfordert die Installation des Pakets "plymouth").

Dracut grundlegende Verwendung

In seiner grundlegendsten Verwendung können wir dracut ohne Option oder Argument aufrufen. Wenn es auf diese Weise verwendet wird, versucht das Programm, das initramfs für den Kernel zu generieren, der gerade vom System verwendet wird, und zwar nach folgendem Namensmuster:

/boot/initramfs-<kernel-version>

Die Kernel-Version kann einfach mit dem Dienstprogramm uname mit der Option -r (kurz für --kernel-release) abgerufen werden. Wir können daher den Namen erraten, der für das initramfs verwendet wird, das den folgenden Befehl ausführt:

echo "/boot/initramfs-$(uname -r)"

Wenn bereits ein initramfs mit dem gleichen Namen existiert wie der, der von dracut generiert würde, weigert sich die Anwendung, es zu überschreiben, und zeigt einen Fehler ähnlich dem folgenden an:

dracut: Will not override existing initramfs (/boot/initramfs-5.14.14-300.fc35.x86_64.img) without --force

Wie in der Nachricht selbst vorgeschlagen, müssen wir, um ein vorhandenes initramfs zu überschreiben, dracut mit der Option --force ausführen.

Erstellen eines initramfs für eine bestimmte Kernel-Version

Der einfachste Weg, ein initramfs für eine bestimmte Kernel-Version zu erstellen, besteht darin, dracut mit der Option --kver aufzurufen und die Kernel-Version, für die das initramfs erstellt werden soll, als Argument anzugeben:

sudo dracut --kver 5.14.14-300.fc35.x86_64

Das initramfs wird im Verzeichnis /boot erstellt, wobei das oben gezeigte Benennungsmuster verwendet wird. Wenn wir ein initramfs für eine bestimmte Kernel-Version an einem benutzerdefinierten Ort erstellen möchten, können wir dracut mit dem Pfad aufrufen, in dem das Image als erstes Argument erstellt werden soll, und die Kernel-Version als zweites Argument übergeben. Nur als Beispiel: Um ein initramfs-Image zu erzeugen, das explizit nach dem aktuell laufenden Kernel benannt ist, würden wir im aktuellen Arbeitsverzeichnis folgendes ausführen:

sudo dracut . 5.14.14-300.fc35.x86_64

Der obige Befehl erzeugt ein initramfs in dem Verzeichnis, aus dem es gestartet wird, mit dem Namen initramfs.img.

Erstellen von initramfs für alle vorhandenen Kernel

Manchmal möchten wir vielleicht das initramfs für alle vorhandenen Kernel auf unserem Betriebssystem erstellen oder neu erstellen. Dracut bietet eine sehr einfache Möglichkeit, diese Aufgabe zu erfüllen. Alles, was wir tun müssen, ist, die Anwendung auszuführen und die Option --regenerate-all zu verwenden. Die initramfs-Archive werden im Standardverzeichnis erstellt. Wie bereits erwähnt, müssen wir, wenn das initramfs für einen bestimmten Kernel bereits existiert, auch die Option --force übergeben:

sudo dracut --regenerate-all --force

Erstellen eines auf den Host zugeschnittenen initramfs

Normalerweise wird beim Generieren eines initramfs mit dracut eine generische Host-Konfiguration erstellt. Im initramfs ist alles enthalten, was zum Booten einer generischen Maschine benötigt wird, um die größtmögliche Kompatibilität zu gewährleisten. Wenn wir nur das wollen, was tatsächlich für eine bestimmte Maschine benötigt wird, können wir dracut mit der Option -H (kurz für --hostonly) ausführen. Um ein auf den Host zugeschnittenes initramfs für den aktuell laufenden Kernel neu zu erstellen, würden wir diesen einfachen Befehl ausführen:

sudo dracut -H --force

Auflisten der in den initrams enthaltenen Dateien und Abrufen ihres Inhalts

In einem früheren Tutorial haben wir gesehen, wie wir den Inhalt eines initramfs unter Linux überprüfen können. In wenigen Worten, die empfohlene Methode zum Ausführen der Aktion auf Fedora und im Allgemeinen auf den Distributionen, die Teil der Red Hat-Familie sind und dracut verwenden, besteht darin, das Skript lsinitrd zu verwenden und den Pfad des initramfs zu übergeben, das wir als Argument untersuchen möchten. Um den Inhalt des /boot/initramfs-5.14.14-300.fc35.x86_64.img initramfs zu überprüfen, würden wir zum Beispiel Folgendes ausführen:

sudo lsinitrd /boot/initramfs-5.14.14-300.fc35.x86_64.img

Der obige Befehl erzeugt unter anderem eine Liste der Dateien, die im initramfs enthalten sind. Um den Inhalt einer Datei zu überprüfen, können wir die Option -f von lsinitrd verwenden und den Pfad der Datei im initramfs als Argument übergeben. Nur als Beispiel, um den Inhalt der Datei etc/crypttab zu lesen, die im initramfs enthalten ist, würden wir wie folgt ausführen:

sudo lsinitrd /boot/initramfs-5.14.14-300.fc35.x86_64.img -f etc/crypttab

Einbinden zusätzlicher Dateien in das initramfs mit der Option –include

Manchmal möchten wir vielleicht zusätzliche Dateien in das initramfs einfügen. Grundsätzlich gibt es zwei Optionen, die wir verwenden können, um diese Operation durchzuführen: --include und --install; Mal sehen, wie sie funktionieren.

Einbinden von Dateien mit –include

Die Option --include akzeptiert zwei Argumente in der angegebenen Reihenfolge:

  1. Der Pfad der Datei, die in das initramfs aufgenommen werden soll (source)
  2. Der Pfad, den die Datei im initramfs (Ziel) haben soll

Nehmen wir an, wir wollen das initramfs für den aktuell laufenden Kernel neu erstellen und die Datei /custom-content.conf als /etc/custom-content.conf darin einfügen. Wir würden laufen:

sudo dracut --include /custom-content.conf /etc/custom-content.conf --force

Mit der Option --include können wir auch den Inhalt eines Verzeichnisses in das initramfs einbinden. Angenommen, wir haben das Verzeichnis /foo und möchten seinen Inhalt unter dem Verzeichnis / innerhalb des initramfs einschließen. Wir würden laufen:

sudo dracut --include /foo / --force

Es wird nur der Inhalt des Verzeichnisses in das initramfs kopiert und nicht das Verzeichnis selbst.

Installieren von Dateien mit der Option –install

Die Option --install kann auch verwendet werden, um Dateien in das initramfs einzuschließen. Der Hauptunterschied zu --include besteht darin, dass Dateien im initramfs an der gleichen Stelle installiert werden, an der sie sich im System befinden. Wenn Sie die Option verwenden, geben wir die Liste der Dateien an, die als Argument eingefügt werden sollen; Es sollten mehrere Dateien in Anführungszeichen angegeben werden, die durch Leerzeichen getrennt sind. Um das initramfs für den aktuell laufenden Kernel neu zu generieren und die Dateien /custom-content.conf und /custom-content0.conf zu installieren, würden wir zum Beispiel Folgendes ausführen:

sudo dracut --install "/custom-content.conf /custom-content0.conf" --force

Die einzuschließenden Dateien müssen auf dem Quelldateisystem vorhanden sein, andernfalls wird ein Fehler generiert. Wenn wir uns nicht sicher sind, ob eine Datei existiert oder nicht, können wir stattdessen --install-optional verwenden: Dateien werden nur aufgenommen, wenn sie existieren.

Steuern der initramfs-Komprimierung

Standardmäßig wird das cpio-Archiv, das die initramfs-Dateien enthält, mit gzip komprimiert. Wir können uns jedoch entscheiden, eine alternative Kompressionsmethode oder gar keine Kompression zu verwenden. Wir können diesen Parameter mit den entsprechenden Befehlszeilenoptionen konfigurieren. Sie sind nach dem Algorithmus benannt, der für die Komprimierung verwendet wird. Unter den anderen:

  • –no-compress (Initramfs ist nicht komprimiert)
  • –gzip
  • –bzip2
  • –lzma
  • –xz
  • –LZO
  • –lz4

Dracut-Konfigurationsdatei

Bisher haben wir gesehen, wie man viele Aspekte der initramfs-Generierung mit Hilfe von dracut-Befehlszeilenoptionen konfigurieren kann. Als Alternative können wir das Verhalten von Dracut ändern, indem wir die Konfigurationsdatei verwenden. Bevor wir über einige der Konfigurationen sprechen, die wir einrichten können, ist es wichtig zu verstehen, wie Konfigurationsdateien verarbeitet werden. In der Reihenfolge der Priorität:

  1. Laufzeit-Optionen
  2. Konfigurationsdateien, die auf ".conf" enden, in /etc/dracut.conf.d
  3. Konfigurationsdateien, die auf ".conf" enden, in /usr/lib/dracut/dracut.conf.d
  4. Konfigurationen in /etc/dracut.conf

Befehlszeilenoptionen überschreiben immer das, was in den Konfigurationsdateien angegeben ist. Die Hauptkonfigurationsdatei von Dracut ist /etc/dracut.conf, aber die Einrichtung kann modular gestaltet werden, indem spezielle Konfigurationsdateien verwendet werden, die mit dem Suffix .conf enden und in den Verzeichnissen /usr/lib/dracut/dracut.conf.d (normalerweise "vendor"-Konfigurationen) und /etc/dracut.conf.d abgelegt werden können. Die Konfigurationsdateien im letztgenannten Verzeichnis ersetzen die gleichnamigen Dateien im ersteren Verzeichnis. Dateien mit der Endung .conf werden in alphanumerischer Reihenfolge verarbeitet. Direktiven, die in diesen Dateien vorhanden sind, überschreiben die in der Datei /etc/dracut.conf angegebenen Anweisungen. Eine vollständige Liste der Anweisungen, die in Konfigurationsdateien verwendet werden können, finden Sie auf der Handbuchseite, indem Sie Folgendes ausführen:

man dracut.conf

Hier berichten wir nur über einige Beispiele:

KonfigurationErklärung
dracutmodules+="<dracut modules>"Leerzeichengetrennte Liste der Module, die für das initramfs verwendet werden sollen
add_dracutmodules+="<Dracut Module>"Leerzeichengetrennte Liste von zusätzlichen Modulen, die für das initramfs verwendet werden sollen
install_items+= "<Datei>[ <Datei> ...]”Leerzeichengetrennte Liste der Dateien, die im initramfs installiert werden sollen
compress="{cat|bzip2|lzma|xz|gzip|lzo|lz4|zstd|<compressor [args ...]>}”Angeben der Komprimierungsmethode
hostonly="{ja|nein}"Geben Sie an, ob nur das, was für den Host benötigt wird, in das initramfs aufgenommen werden soll

Schlüsse

In diesem Tutorial haben wir über dracut gesprochen, das Tool, das build initramfs auf vielen Linux-Distributionen verwendet, hauptsächlich auf denen, die Teil der Red Hat-Familie sind. Wir sahen die Grundlagen des Designs, wie man ein initramfs für eine bestimmte Kernel-Version und für alle auf dem System installierten Kernel erstellt, wie man ein auf den Host zugeschnittenes initramfs erstellt, wie man Dateien innerhalb des initramfs auflistet und wie man zusätzliche Dateien einbindet. Wir haben auch gesehen, wie man die initramfs-Komprimierungsmethode ändert und schließlich, wie man dracut-Konfigurationsdateien verwendet.

Verwandte Artikel: