Comment extraire des fichiers de uImage?

21

Buildroot génère des images pour un périphérique intégré où elles devraient s'exécuter. Cela fonctionne très bien. Dans ces images, le rootfs est inclus.

En raison de certaines recherches, j'aimerais examiner ce fichier généré (par exemple, différents modes de compression définis par Buildroot ont été appliqués et doivent maintenant être vérifiés s'ils ont été correctement effectués), mais je ne trouve rien d'utile sur le Net.

Pour autant que je sache, la différence entre une uImage et une zImage n'est qu'un petit en-tête, donc u-boot est capable de lire ce fichier binaire. Mais je ne peux ouvrir ni uImage ni zImage.

Quelqu'un peut-il me donner un indice sur la façon de décompresser ces images (u / z) sur l'hôte?

user3085931
la source

Réponses:

33
mkimage -l uImage

Videra les informations dans l'en-tête.

tail -c+65 < uImage > out

Obtiendra le contenu.

tail -c+65  < uImage | gunzip > out

l'obtiendra non compressé s'il était compressé avec gzip.

S'il s'agissait d'un initramfs, vous pouvez faire cpio -t < outou pax < outlister le contenu.

S'il s'agit d'une image ramdisk, vous pouvez essayer de la monter avec:

mount -ro loop out /mnt

file out pourrait vous en dire plus sur ce que c'est.

Stéphane Chazelas
la source
1
L'en-tête me dit que c'est une: image du noyau Linux ARM (non compressée). je ne peux pas l'ouvrir ni avec gunzip ni cpio comme vous l'avez expliqué. Le montage de l'image n'était pas possible non plus
user3085931
@ user3085931, c'est une image du noyau et non un système de fichiers. Vous ne pouvez rien y faire à part le démarrer. Que voulez-vous en faire?
Stéphane Chazelas
mais le rootfs est inclus. J'utilise les 3 modes de compression différents et pour l'un d'eux, cela ne fonctionne pas, mon plan était donc d'ouvrir l'image et de vérifier ce qui a été compressé
user3085931
@ user3085931, si le rootfs a été ajouté à l'image du noyau, alors en quelque sorte le décalage doit être spécifié quelque part soit en tant que paramètres passés au noyau ou incorporés dans le noyau lui-même. Avez-vous un exemple d'une telle image quelque part?
Stéphane Chazelas
j'ai joué avec un et il a été compressé avec lzma ( mkimage -lrapporté Image Type: MIPS Linux Kernel Image (lzma compressed)) donc utilisé unlzma pour l'étendre
-bradley
8

U-Boot apporte son propre dumpimageoutil (trouvez-le dans le répertoire tools de votre arborescence U-Boot)

Bien sûr, cela fonctionne avec des images simples, mais il prend également en charge les images multiples à l'ancienne

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

Je ne l'ai pas encore essayé avec des images FIT de nouveau style, mais je suppose que cela devrait simplement fonctionner.

Uwe Geuder
la source
1
Il fonctionne avec des images FIT.
socketpair
4

Dans le cas où il y a plusieurs images est à l' intérieur ici un rapide bashscript pour les extraire tous dans les fichiers 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

Vous devez ensuite vérifier ce qui est quoi (pourrait être un noyau Linux compressé, une archive avec des fichiers, une arborescence de périphériques,…). fileet binwalk( http://binwalk.org/ ) pourrait être utile.

phk
la source
très belle addition
user3085931