¿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?

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.


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.


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.


muy buena adición
— user3085931
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.