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 < out
oder pax < out
auflisten.
Wenn es sich um ein Ramdisk-Image handelt, können Sie versuchen, es mit folgendem Befehl zu mounten:
mount -ro loop out /mnt
file out
könnte dir mehr darüber sagen, was es ist.
Antwort2
U-Boot bringt sein eigenes dumpimage
Tool 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 bash
Skript, 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). file
und 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