Como extrair arquivos do uImage?

20

O Buildroot está gerando imagens para um dispositivo incorporado onde elas devem ser executadas. Isso está funcionando muito bem. Nessas imagens, o rootfs está incluído.

Devido a algumas pesquisas, eu gostaria de examinar esse arquivo gerado (por exemplo, diferentes modos de compactação definidos pelo Buildroot foram aplicados e agora devem ser verificados se foram feitos corretamente), mas não consigo encontrar algo útil em a rede.

Até onde eu sei, a diferença entre um uImage e zImage é apenas um pequeno cabeçalho, então o u-boot é capaz de ler esse arquivo binário. Mas eu não consigo abrir nem o uImage nem o zImage.

Alguém pode me dar uma dica de como descomprimir as imagens (u / z) no host?

    
por user3085931 06.02.2014 / 12:38

3 respostas

27
mkimage -l uImage

Vai despejar as informações no cabeçalho.

tail -c+65 < uImage > out

Receberá o conteúdo.

tail -c+65  < uImage | gunzip > out

irá obtê-lo descompactado se for compactado com gzip.

Se foi um initramfs, você pode usar cpio -t < out ou pax < out para listar o conteúdo.

Se é uma imagem do disco RAM, você pode tentar montá-lo com:

mount -ro loop out /mnt

file out poderia dizer mais sobre o que é isso.

    
por 06.02.2014 / 14:58
4

Caso existam várias imagens aqui dentro, é um rápido script bash para extraí-las em todos os arquivos 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

Você precisa verificar então o que é o que (pode ser um kernel do Linux compactado, um arquivo com arquivos, uma árvore de dispositivos,…). file e binwalk ( link ) podem ser úteis.

    
por 17.06.2016 / 16:32
4

O U-Boot traz sua própria ferramenta dumpimage (encontre-a no diretório de ferramentas da sua árvore do U-Boot)

Claro que funciona com imagens simples, mas também suporta as multi-imagens de estilo antigo

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

Ainda não tentei com novas imagens FIT de estilo, mas acho que deve funcionar.

    
por 01.09.2017 / 15:27