Wie extrahiere ich Dateien aus uImage?

Wie extrahiere ich Dateien aus uImage?

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

Aufgrund einiger Recherchen würde ich mir die generierte Datei gerne genauer ansehen (z. B. wurden verschiedene vom Buildroot festgelegte Komprimierungsmodi angewendet und nun soll überprüft werden, ob sie korrekt durchgeführt wurden), aber ich kann im Internet nichts Nützliches finden.

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

Kann mir jemand einen Hinweis geben, wie ich diese (u/z)Images auf dem Host dekomprimieren kann?

Antwort1

mkimage -l uImage

Die Informationen werden im Header gespeichert.

tail -c+65 < uImage > out

Werde den Inhalt erhalten.

tail -c+65  < uImage | gunzip > out

erhält es unkomprimiert, wenn es gzip-komprimiert war.

Wenn es sich dabei um ein Initramfs handelte, können Sie den Inhalt mit cpio -t < outoder pax < outauflisten.

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

mount -ro loop out /mnt

file outkönnte dir mehr darüber sagen, was es ist.

Antwort2

U-Boot bringt sein eigenes dumpimageTool mit (zu finden im Tools-Verzeichnis Ihres U-Boot-Baums)

Natürlich funktioniert es mit einfachen Bildern, aber es unterstützt auch die alten Multi-Bilder

$ ~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 FIT-Bildern im neuen Stil ausprobiert, aber ich denke, es sollte einfach funktionieren.

Antwort3

Für den Fall, dass mehrere Bilder vorhanden sind, gibt es hier ein kurzes bashSkript, um sie alle in die Dateien image_0, image_1, … zu extrahieren:

#!/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

Anschließend muss geprüft werden, was was ist (könnte ein gepackter Linux-Kernel, ein Archiv mit Dateien, ein Gerätebaum usw. sein). fileund binwalk(http://binwalk.org/) könnte hilfreich sein.

Antwort4

7z"funktioniert einfach" für mich, obwohl dies spezifisch für OpenWRT und SquashFS sein kann. Ich habe es basierend aufein Kommentar in den OpenWRT-Foren.

$ file image.bin 
image.bin: u-boot legacy uImage, OpenWrt fullimage, Linux/MIPS, Multi-File Image (Not compressed), 11334834 bytes, Mon Apr 12 09:59:28 2021, Load Address: 00000000, Entry Point: 00000000, Header CRC: 0XDFDE3FF5, Data CRC: 0X7704142B

$ 7z x image.bin

7-Zip [64] 17.04 : Copyright (c) 1999-2021 Igor Pavlov : 2017-08-28
p7zip Version 17.04 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,16 CPUs x64)

Scanning the drive for archives:
1 file, 11334898 bytes (11 MiB)

Extracting archive: image.bin
--       
Path = image.bin
Type = SquashFS
Offset = 2097224
Physical Size = 9237674
Headers Size = 47040
File System = SquashFS 4.0
Method = XZ
Cluster Size = 262144
Big-endian = -
Created = 2021-04-12 04:59:26
Characteristics = DUPLICATES_REMOVED EXPORTABLE 0x600
Code Page = UTF-8

Everything is Ok                                        

Folders: 145
Files: 2518
Size:       36789620
Compressed: 11334898


verwandte Informationen