web-dev-qa-db-fra.com

Comment extraire des fichiers de uImage?

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?

23
user3085931
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 < out ou pax < out pour répertorier 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.

34
Stéphane Chazelas

U-Boot apporte son propre outil dumpimage (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.

9
Uwe Geuder

Dans le cas où il y a plusieurs images à l'intérieur, voici un script bash rapide pour les extraire toutes 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,…). file et binwalk ( http://binwalk.org/ ) pourraient être utiles.

5
phk