Ich benutze Debian Live-Build, um auf einem bootfähigen System zu arbeiten. Am Ende des Prozesses erhalte ich die typischen Dateien, die zum Booten eines Live-Systems verwendet werden: eine Squashfs-Datei, einige GRUB-Module und Konfigurationsdateien sowie eine initrd.img-Datei.
Mit diesen Dateien kann ich problemlos booten und die initrd über an den Kernel übergeben
initrd=/path/to/my/initrd.img
in der Bootloader-Befehlszeile. Aber wenn ich versuche, den Inhalt meines initrd-Images zu untersuchen, dann so:
$file initrd.img
initrd.img: ASCII cpio archive (SVR4 with no CRC)
$mkdir initTree && cd initTree
$cpio -idv < ../initrd.img
Der Dateibaum, den ich bekomme, sieht folgendermaßen aus:
$tree --charset=ASCII
.
`-- kernel
`-- x86
`-- microcode
`-- GenuineIntel.bin
Wo befindet sich der tatsächliche Dateisystembaum mit dem typischen Verzeichnis / bin, / etc, / sbin ..., das die tatsächlichen Dateien enthält, die während des Startvorgangs verwendet wurden?
Antworten:
Die angegebene Methode zum Überspringen von cpio-Blöcken funktioniert nicht zuverlässig. Das liegt daran, dass bei den initrd-Images, die ich selbst erhalten habe, nicht beide Archive mit einer 512-Byte-Grenze verknüpft waren.
Tun Sie stattdessen Folgendes:
Verwenden Sie die letzte Nummer (21136), die sich für mich nicht an einer 512-Byte-Grenze befindet:
quelle
cd
in dem Verzeichnis , in dem Sie Ihre cpio - Archiv extrahiert, laufenfind | cpio -H newc -o > /tmp/my_archive.cpio
, gzip es dann mitgzip /tmp/my_archive.cpio
und schließlich verketten es mit der mit dem Mikrobild, wenn Sie einen hatte:cat my_microcode_image.cpio /tmp/my_archive.cpio.gz > mynewinitrd.img
. Wenn Sie kein Mikrocode-Image hatten, können Sie Ihre gezippte Datei einfach so verwenden, wie sie in Ihrem Bootloader enthalten istcpio -i
anstatt incpio -tdv | head
.Wenn Sie wissen, dass Ihre
initrd.img
Datei aus einem unkomprimierten cpio-Archiv und einem gz-komprimierten cpio-Archiv besteht, können Sie mit den folgenden Methoden alle Dateien (aus beiden Archiven) in Ihr aktuelles Arbeitsverzeichnis extrahieren (in Bash getestet):Die obige Befehlszeilengibt den Inhalt
initrd.img
als Standardeingabe in eine Subshell , die die beiden Befehle ausführtcpio -id
undzcat | cpio -id
sequentiell. Der erste Befehl (cpio -id
) wird beendet, sobald alle Daten des ersten cpio-Archivs gelesen wurden. Der verbleibende Inhalt wird dann an übergebenzcat | cpio -id
, der das zweite Archiv dekomprimiert und entpackt.quelle
Es stellt sich heraus, dass die initrd, die durch Debians Live-Build erzeugt wird (und zu meiner Überraschung vom Kernel akzeptiert wird), tatsächlich die Verkettung von zwei Bildern ist:
Nach dem Extrahieren der ursprünglichen initrd.img, direkt aus der Live-Build-Ausgabe, habe ich diese Ausgabe erhalten:
Dies bedeutet, dass die CPIO-Extraktion nach dem Parsen von 896 Blöcken mit jeweils 512 Bytes beendet wurde. Aber die ursprüngliche initrd.img war viel größer als 896 * 512 = 458752B = 448 KB:
Das gesuchte initrd-Image wurde also direkt nach dem ersten cpio-Archiv (das die Mikrocode-Updates enthält) angehängt und kann mit dd aufgerufen werden:
quelle
Sie können
unmkinitramfs
initramfs-tools> = 0.126 verwenden, die seit Debian 9 (stretch) und Ubuntu 18.04 (bionic) enthalten sind.quelle
Basierend auf der Idee in der Antwort von @ woolpool habe ich eine rekursive Funktion geschrieben, die für jedes cpio-Archiv unabhängig von der Anordnung der verketteten Daten funktioniert und keine speziellen Tools wie binwalk erfordert. Zum Beispiel produzierte mein mkinitramfs eine cpio; cpio; gzip-Datei. Es funktioniert, indem jeder Teil der verketteten initrd-Datei extrahiert wird, der Rest in einem tempfile gespeichert wird und dann das "file" -Programm verwendet wird, um zu entscheiden, was mit dem nächsten Teil geschehen soll.
Zur Verwendung geben Sie ein: uncpio initrdfilename
quelle
Wenn Sie diese Aufgabe häufig ausführen müssen, möchten Sie möglicherweise eine kleine Bash-Funktion wie die folgende erstellen (und sie möglicherweise Ihrer .bashrc-Datei hinzufügen):
Der Code basiert auf Marc's Antwort, ist aber deutlich schneller, da binwalk nur nach gzip-Dateien sucht. Sie können es folgendermaßen aufrufen:
Sie müssen
binwalk
installiert sein, damit es funktioniert.quelle