Como extrair arquivos da uImage?

21

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

Devido a algumas pesquisas, eu gostaria de analisar 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 na rede.

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

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

user3085931
fonte

Respostas:

33
mkimage -l uImage

Despejará as informações no cabeçalho.

tail -c+65 < uImage > out

Receberá o conteúdo.

tail -c+65  < uImage | gunzip > out

irá descompactá-lo se tiver sido compactado com gzip.

Se esse foi um initramfs, você pode fazer cpio -t < outou pax < outlistar o conteúdo.

Se for uma imagem ramdisk, você pode tentar montá-la com:

mount -ro loop out /mnt

file out poderia lhe dizer mais sobre o que é.

Stéphane Chazelas
fonte
1
O cabeçalho diz que é uma: Imagem do Kernel do ARM Linux (não compactada). Não consigo abri-lo nem com o gunzip nem o cpio da maneira que você explicou. Também não foi possível
montar
@ user3085931, essa é uma imagem do kernel e não um sistema de arquivos. Você não pode fazer nada com isso, exceto inicializá-lo. O que você quer fazer com isso?
Stéphane Chazelas
mas o rootfs está incluído. Eu uso os 3 modos de compactação diferentes e, para um deles, não está funcionando, portanto, meu plano era abrir a imagem e verificar o que o bin
compactou.
@ user3085931, se o rootfs tiver sido anexado à imagem do kernel, de alguma forma o deslocamento deve ser especificado em algum lugar, como parâmetros passados ​​para o kernel ou incorporados no próprio kernel. Você tem um exemplo dessa imagem em algum lugar?
Stéphane Chazelas
Eu tenho jogado com um e ele foi compactado com lzma ( mkimage -lrelatado Image Type: MIPS Linux Kernel Image (lzma compressed)), então usei o unlzma para expandi-lo
northern-bradley
8

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

Obviamente, ele funciona com imagens simples, mas também suporta as imagens múltiplas 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.

Uwe Geuder
fonte
1
Funciona com imagens FIT.
socketpair
4

Caso haja várias imagens aqui dentro, é um bashscript rápido para extrair todas elas para 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 então verificar o que é o que (pode ser um kernel Linux empacotado, arquivar arquivos, árvore de dispositivos, ...). filee binwalk( http://binwalk.org/ ) pode ser útil.

phk
fonte
muito bom adição
user3085931 17/07/2016