Come estrarre i file da uImage?


21

Buildroot sta generando immagini per un dispositivo incorporato dove dovrebbero essere eseguite. Funziona molto bene. In quelle immagini, è incluso il rootfs.

A causa di alcune ricerche, vorrei esaminare quel file generato (ad esempio sono state applicate diverse modalità di compressione impostate da Buildroot e ora devono essere controllate se sono state eseguite correttamente), ma non riesco a trovare qualcosa di utile in rete.

Per quanto ne so, la differenza tra uImage e zImage è solo una piccola intestazione, quindi u-boot è in grado di leggere quel file binario. Ma non posso aprire né uImage né zImage.

Qualcuno può darmi un suggerimento su come decomprimere quelle (u / z) immagini sull'host?

Risposte:


33
mkimage -l uImage

Dump delle informazioni nell'intestazione.

tail -c+65 < uImage > out

Otterrà il contenuto.

tail -c+65  < uImage | gunzip > out

lo comprime non compresso se è stato compresso con gzip.

Se quello era un initramfs, puoi fare cpio -t < outo pax < outelencare il contenuto.

Se è un'immagine ramdisk, puoi provare a montarla con:

mount -ro loop out /mnt

file out potrebbe dirti di più di cosa si tratta.


1
Header mi dice che si tratta di: ARM Linux Kernel Image (non compresso). non posso aprirlo né con gunzip né cpio nel modo in cui l'hai spiegato. Anche
montare

@ user3085931, quindi questa è un'immagine del kernel e non un filesystem. Non puoi farci nulla se non avviarlo. Che cosa vuoi fare con esso?
Stéphane Chazelas,

ma il rootfs è incluso. Uso le 3 diverse modalità di compressione e per una di esse non funziona, quindi il mio piano era quello di aprire l'immagine e controllare cosa ha compresso il cestino
user3085931

@ user3085931, se il rootfs è stato aggiunto all'immagine del kernel, allora in qualche modo l'offset deve essere specificato da qualche parte o come parametri passati al kernel o incorporati nel kernel stesso. Hai un esempio di tale immagine da qualche parte?
Stéphane Chazelas,

ne ho giocato con uno ed è stato compresso con lzma ( mkimage -lriferito Image Type: MIPS Linux Kernel Image (lzma compressed)), quindi ho usato unlzma per espanderlo
-bradley,

8

U-Boot porta il suo dumpimagestrumento (trovalo nella directory degli strumenti del tuo albero U-Boot)

Ovviamente funziona con immagini semplici, ma supporta anche le multi immagini di vecchio stile

$ ~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

Non l'ho ancora provato con nuove immagini FIT di stile, ma immagino che dovrebbe funzionare.


1
Funziona con immagini FIT.
socketpair,

4

Nel caso in cui ci sono diverse immagini all'interno: ecco un breve bashscript per tutti estrarre nei file 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

È quindi necessario controllare che cos'è (potrebbe essere un kernel Linux compresso, un archivio con file, una struttura ad albero dei dispositivi, ...). filee binwalk( http://binwalk.org/ ) potrebbe essere utile.


aggiunta molto bella
user3085931
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.