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 < out
o pax < out
enumerar el contenido.
Si es una imagen de disco ram, puedes intentar montarla con:
mount -ro loop out /mnt
file out
Podría decirte más sobre lo que es.
Respuesta2
U-Boot trae su propia dumpimage
herramienta (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 bash
script 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,…). file
y 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