Wie extrahiere ich Dateien aus uImage?

21

Buildroot generiert Images für ein eingebettetes Gerät, auf dem sie ausgeführt werden sollen. Das funktioniert sehr gut. In diesen Bildern ist das rootfs enthalten.

Aufgrund einiger Nachforschungen würde ich gerne in diese generierte Datei schauen (z. B. wurden verschiedene von Buildroot festgelegte Komprimierungsmodi angewendet und sollen nun überprüft werden, ob sie korrekt ausgeführt wurden), aber ich kann im Netz nichts Nützliches finden.

Soweit ich weiß, ist der Unterschied zwischen uImage und zImage nur ein kleiner Header, sodass u-boot diese Binärdatei lesen kann. Ich kann aber weder uImage noch das zImage öffnen.

Kann mir jemand einen Hinweis geben, wie man diese (u / z) Images auf dem Host dekomprimiert?

user3085931
quelle

Antworten:

32
mkimage -l uImage

Gibt die Informationen im Header aus.

tail -c+65 < uImage > out

Bekomme den Inhalt.

tail -c+65  < uImage | gunzip > out

wird dekomprimiert, wenn es gzip-komprimiert wurde.

Wenn das ein initramfs war, können Sie den Inhalt tun cpio -t < outoder pax < outauflisten.

Wenn es sich um ein Ramdisk-Image handelt, können Sie versuchen, es mit folgendem Befehl bereitzustellen:

mount -ro loop out /mnt

file out könnte dir mehr darüber erzählen, was es ist.

Stéphane Chazelas
quelle
1
Header sagt mir, dass es ein: ARM Linux Kernel Image (unkomprimiert) ist. ich kann es weder mit gunzip noch mit cpio so öffnen, wie du es erklärt hast. Das Image zu
mounten
@ user3085931, dann ist das ein Kernel-Image, kein Dateisystem. Sie können nichts damit anfangen, außer es zu booten. Was willst du damit machen?
Stéphane Chazelas
aber das rootfs ist enthalten. Ich verwende die 3 verschiedenen Komprimierungsmodi und für einen von ihnen funktioniert es nicht. Daher war mein Plan, das Bild zu öffnen und zu überprüfen, was komprimiert wurde
user3085931
@ user3085931, wenn das rootfs an das Kernel-Image angehängt wurde, muss der Offset irgendwie irgendwo angegeben werden, entweder als Parameter, die an den Kernel übergeben oder im Kernel selbst eingebettet werden. Haben Sie irgendwo ein Beispiel für ein solches Bild?
Stéphane Chazelas
Ich habe mit einem gespielt und es wurde mit lzma komprimiert ( mkimage -lberichtet Image Type: MIPS Linux Kernel Image (lzma compressed)), also benutzte unlzma, um es zu erweitern
Northern-Bradley
6

U-Boot bringt ein eigenes dumpimageTool mit (finden Sie es im Tools-Verzeichnis Ihres U-Boot-Baums)

Natürlich funktioniert es mit einfachen Bildern, aber es unterstützt auch die alten Mehrfachbilder

$ ~2/tools/dumpimage -l uMulti 
Image Name:   
Created:      Thu Aug 31 19:54:29 2017
Image Type:   ARM Linux Multi-File Image (uncompressed)
Data Size:    5678650 Bytes = 5545.56 kB = 5.42 MB
Load Address: 10008000
Entry Point:  10008000
Contents:
   Image 0: 5028760 Bytes = 4910.90 kB = 4.80 MB
   Image 1: 602111 Bytes = 588.00 kB = 0.57 MB
   Image 2: 47762 Bytes = 46.64 kB = 0.05 MB
$ ~2/tools/dumpimage -i uMulti kernel.extracted
$ ~2/tools/dumpimage -i uMulti -p 1 initramfs.extracted
$ ~2/tools/dumpimage -i uMulti -p 2 device-tree.extracted

Habe es noch nicht mit neuen FIT-Bildern ausprobiert, aber ich denke, es sollte einfach funktionieren.

Uwe Geuder
quelle
1
Es funktioniert mit FIT-Bildern.
Socketpair
4

Falls es innerhalb hier mehrere Bilder ist eine schnelle bashSkript sie alle in die Dateien zu extrahieren image_0, image_1...:

#!/bin/bash

src_file=uImage

declare -ia sizes=( $(mkimage -l "$src_file" |
  awk '/^ +Image [0-9]+/ { print $3 }') )
declare -i offset="68+4*${#sizes[@]}"
declare -i size

for i in "${!sizes[@]}"; do

  size=${sizes[$i]}

  echo "Unpacking image_$i"
  dd if="$src_file" of="image_$i" bs=1 skip="$offset" count="$size"

  # going to offset of next file while rounding to 4 byte multiple
  offset+=$(( size + (4 - size % 4) % 4 ))

done

Sie müssen dann überprüfen, was was ist (könnte ein gepackter Linux-Kernel sein, Archiv mit Dateien, Gerätebaum, ...). fileund binwalk( http://binwalk.org/ ) könnten hilfreich sein.

phk
quelle
sehr schöne ergänzung
ergänzung user3085931