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