UImage'dan dosya nasıl çıkartılır?


21

Buildroot, çalışması gereken gömülü bir aygıt için görüntüler oluşturuyor. Bu çok iyi çalışıyor. Bu görüntülerde, rootfs dahil edilmiştir.

Bazı araştırmalar nedeniyle, oluşturulan dosyaya bakmak istiyorum (örneğin, Buildroot tarafından ayarlanan farklı sıkıştırma modları uygulandı ve şimdi doğru şekilde yapılıp yapılmadıklarının kontrol edilmesi gerekiyor), ancak Net'te yararlı bir şey bulamıyorum.

Bildiğim kadarıyla, bir uImage ve zImage arasındaki fark sadece küçük bir başlıktır, bu yüzden u-boot bu ikili dosyayı okuyabilir. Ancak ne uImage ne de zImage'i açabilirim.

Biri bana ana bilgisayardaki bu (u / z) Resimleri açmanın nasıl bir ipucu verebilir?

Yanıtlar:


33
mkimage -l uImage

Bilgileri başlık içine atar.

tail -c+65 < uImage > out

İçeriği alacak.

tail -c+65  < uImage | gunzip > out

eğer gzip sıkıştırılmışsa sıkıştırılmayacaktır.

Bu bir initramfs ise, içeriği yapabilir cpio -t < outveya pax < outlisteleyebilirsiniz.

Eğer bir ramdisk görüntüsü ise, onu deneyerek monte edebilirsiniz:

mount -ro loop out /mnt

file out ne olduğu hakkında daha fazla şey söyleyebilirim.


1
Üstbilgi bana bunun bir olduğunu söyledi: ARM Linux Çekirdek Görüntüsü (sıkıştırılmamış). Ne gunzip ne de cpio ile açıkladığın gibi açamam. Görüntünün montajı da mümkün değildi
user3085931 14.03

@ user3085931, o zaman bu bir dosya sistemi değil bir çekirdek görüntüsüdür. Önyükleme dışında onunla hiçbir şey yapamazsın. Bununla ne yapmak istiyorsun?
Stéphane Chazelas

ancak rootfs dahil edilmiştir. 3 farklı sıkıştırma modunu kullanıyorum ve bunlardan biri için çalışmıyor, bu nedenle planım görüntüyü açmak ve çöp kutusunun ne sıkıştırıldığını kontrol
etmekti

@ user3085931, rootfs çekirdek resmine eklendiyse, bir şekilde ofset, çekirdeğe iletilen parametreler olarak ya da çekirdeğin içine gömülen parametreler olarak belirtilmelidir. Bir yerlerde böyle bir resim örneği var mı?
Stéphane Chazelas

biriyle oynuyordum ve lzma ile sıkıştırıldı ( mkimage -lbildirildi Image Type: MIPS Linux Kernel Image (lzma compressed)) bu yüzden genişletmek için unlzma kullandım
kuzey-bradley

8

U-Boot kendi dumpimagearacını getirir (U-Boot ağacınızın tools dizininde bulabilirsiniz)

Elbette basit görüntülerle çalışır, ancak aynı zamanda eski tarz çoklu görüntüleri de destekler

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

Henüz yeni stil FIT görüntüleri ile denemedim, ama sadece çalışması gerektiğini düşünüyorum.


1
FIT görüntülerle çalışır.
socketpair

4

Durumda birkaç görüntü içeride burada hızlıdır vardır bashdosyalar halinde hepsini ayıklamak için komut 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

Sonra neyin ne olduğunu kontrol etmeniz gerekir (dolu bir Linux çekirdeği olabilir, dosyalarla arşivlenebilir, cihaz ağacı,…). fileve binwalk( http://binwalk.org/ ) yardımcı olabilir.


çok güzel bir ek
user3085931
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.