¿Cómo extraer archivos de uImage?

21

Buildroot está generando imágenes para un dispositivo incrustado donde deberían ejecutarse. Esto funciona muy bien. En esas imágenes, se incluye el rootfs.

Debido a algunas investigaciones, me gustaría examinar ese archivo generado (por ejemplo, se aplicaron diferentes modos de compresión establecidos por Buildroot y ahora se comprobará si se realizaron correctamente), pero no puedo encontrar algo útil en la red.

Hasta donde sé, la diferencia entre uImage y zImage es solo un pequeño encabezado, por lo que u-boot puede leer ese archivo binario. Pero no puedo abrir ni uImage ni zImage.

¿Alguien puede darme una pista de cómo descomprimir esas (u / z) Imágenes en el host?

usuario3085931
fuente

Respuestas:

33
mkimage -l uImage

Volcará la información en el encabezado.

tail -c+65 < uImage > out

Obtendrá el contenido.

tail -c+65  < uImage | gunzip > out

lo descomprimirá si fue comprimido con gzip.

Si ese fue un initramfs, puede hacer cpio -t < outo pax < outenumerar el contenido.

Si es una imagen de disco RAM, puede intentar montarla con:

mount -ro loop out /mnt

file out Podría decirle más sobre lo que es.

Stéphane Chazelas
fuente
1
El encabezado me dice que es un: ARM Linux Kernel Image (sin comprimir). No puedo abrirlo ni con gunzip ni cpio de la forma en que lo explicaste. Tampoco fue posible montar la imagen
user3085931
@ user3085931, entonces esa es una imagen del núcleo, no un sistema de archivos. No puedes hacer nada con él excepto arrancarlo. Que quieres hacer con eso?
Stéphane Chazelas
pero el rootfs está incluido. Utilizo los 3 modos de compresión diferentes y para uno de ellos no funciona, por lo tanto, mi plan era abrir la imagen y verificar qué se ha comprimido bin
user3085931
@ user3085931, si el rootfs se ha agregado a la imagen del kernel, entonces, de alguna manera, el desplazamiento debe especificarse en algún lugar ya sea como parámetros pasados ​​al kernel o incrustados en el mismo kernel. ¿Tienes un ejemplo de tal imagen en alguna parte?
Stéphane Chazelas
He estado jugando con uno y estaba comprimido con lzma ( mkimage -lreportado Image Type: MIPS Linux Kernel Image (lzma compressed)), así que usé unlzma para expandirlo
northern-bradley
8

U-Boot trae su propia dumpimageherramienta (encuéntrela en el directorio de herramientas de su árbol U-Boot)

Por supuesto, funciona con imágenes simples, pero también es compatible con las imágenes múltiples de estilo antiguo

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

Todavía no lo he probado con nuevas imágenes FIT de estilo, pero supongo que debería funcionar.

Uwe Geuder
fuente
1
Funciona con imágenes FIT.
socketpair
4

En caso de que haya varias imágenes en el interior que aquí hay una rápida bashsecuencia de comandos para extraer todos ellos en los archivos 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

Luego debe verificar qué es qué (podría ser un kernel de Linux empaquetado, un archivo con archivos, un árbol de dispositivos, ...). filey binwalk( http://binwalk.org/ ) podría ser útil.

phk
fuente
muy buena adición
user3085931