¿Cómo extraer archivos de uImage?

¿Cómo extraer archivos de uImage?

Buildroot está generando imágenes para un dispositivo integrado donde deberían ejecutarse. Esto está funcionando 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 verificará si se hicieron correctamente), pero no puedo encontrar nada útil en la red.

Hasta donde yo 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 sobre cómo descomprimir esas imágenes (u/z) en el host?

Respuesta1

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 estaba comprimido con gzip.

Si se trata de un initramfs, puede hacer cpio -t < outo pax < outenumerar el contenido.

Si es una imagen de disco ram, puedes intentar montarla con:

mount -ro loop out /mnt

file outPodría decirte más sobre lo que es.

Respuesta2

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 admite 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 imágenes FIT de nuevo estilo, pero supongo que debería funcionar.

Respuesta3

En caso de que haya varias imágenes dentro, aquí hay un bashscript rápido para extraerlas todas 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 resultar útil.

Respuesta4

7z"simplemente funciona" para mí, aunque esto puede ser específico de OpenWRT y SquashFS. Lo probé basado enun comentario en los foros de OpenWRT.

$ file image.bin 
image.bin: u-boot legacy uImage, OpenWrt fullimage, Linux/MIPS, Multi-File Image (Not compressed), 11334834 bytes, Mon Apr 12 09:59:28 2021, Load Address: 00000000, Entry Point: 00000000, Header CRC: 0XDFDE3FF5, Data CRC: 0X7704142B

$ 7z x image.bin

7-Zip [64] 17.04 : Copyright (c) 1999-2021 Igor Pavlov : 2017-08-28
p7zip Version 17.04 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,16 CPUs x64)

Scanning the drive for archives:
1 file, 11334898 bytes (11 MiB)

Extracting archive: image.bin
--       
Path = image.bin
Type = SquashFS
Offset = 2097224
Physical Size = 9237674
Headers Size = 47040
File System = SquashFS 4.0
Method = XZ
Cluster Size = 262144
Big-endian = -
Created = 2021-04-12 04:59:26
Characteristics = DUPLICATES_REMOVED EXPORTABLE 0x600
Code Page = UTF-8

Everything is Ok                                        

Folders: 145
Files: 2518
Size:       36789620
Compressed: 11334898


información relacionada