Jak wyodrębnić pliki z uImage?


21

Buildroot generuje obrazy dla urządzenia osadzonego, na którym powinny działać. To działa bardzo dobrze. W tych obrazach uwzględniono rootfy.

Z powodu niektórych badań chciałbym zajrzeć do wygenerowanego pliku (np. Zastosowano różne tryby kompresji ustawione przez Buildroot i teraz należy sprawdzić, czy zostały poprawnie wykonane), ale nie mogę znaleźć czegoś użytecznego w sieci.

O ile mi wiadomo, różnica między uImage i zImage jest tylko małym nagłówkiem, więc u-boot jest w stanie odczytać ten plik binarny. Ale nie mogę otworzyć ani uImage, ani zImage.

Czy ktoś może mi podpowiedzieć, jak zdekompresować te (u / z) obrazy na hoście?

Odpowiedzi:


33
mkimage -l uImage

Zrzuci informacje w nagłówku.

tail -c+65 < uImage > out

Dostanie treść.

tail -c+65  < uImage | gunzip > out

otrzyma go nieskompresowany, jeśli był skompresowany gzip.

Jeśli to był initramfs, możesz zrobić cpio -t < outlub pax < outwyświetlić zawartość.

Jeśli jest to obraz ramdysku, możesz spróbować zainstalować go za pomocą:

mount -ro loop out /mnt

file out mogę powiedzieć więcej o tym, co to jest.


1
Nagłówek mówi mi, że jest to: Obraz jądra Linux ARM (nieskompresowany). nie mogę go otworzyć ani z gunzipem, ani z cpio w sposób, w jaki to wyjaśniłeś. Montaż obrazu też nie był możliwy
user3085931

@ user3085931, to jest obraz jądra, a nie system plików. Nie możesz nic z tym zrobić poza uruchomieniem. Co chcesz z tym zrobić?
Stéphane Chazelas

ale rootfs jest włączony. Korzystam z 3 różnych trybów kompresji i dla jednego z nich nie działa, dlatego moim planem było otwarcie obrazu i sprawdzenie, co zostało skompresowane
użytkownik3085931

@ user3085931, jeśli rootfs został dołączony do obrazu jądra, to w jakiś sposób przesunięcie musi zostać określone gdzieś albo jako parametry przekazane do jądra, albo osadzone w samym jądrze. Czy masz gdzieś przykład takiego obrazu?
Stéphane Chazelas

bawiłem się z jednym i został skompresowany z LZMA ( mkimage -lzgłoszono Image Type: MIPS Linux Kernel Image (lzma compressed)), więc użyłem unlzma, aby go rozwinąć
Northern-Bradley

8

U-Boot oferuje własne dumpimagenarzędzie (znajdź je w katalogu narzędzi drzewa U-Boot)

Oczywiście działa z prostymi obrazami, ale obsługuje również wiele obrazów w starym stylu

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

Nie próbowałem tego jeszcze z obrazami FIT w nowym stylu, ale myślę, że powinno po prostu działać.


1
Działa z obrazami FIT.
socketpair

4

W przypadku, gdy istnieje kilka zdjęć wewnątrz o to szybkie bashskrypt, aby wyodrębnić je wszystkie do plików 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

Następnie musisz sprawdzić, co jest (może to być spakowane jądro Linuksa, archiwum z plikami, drzewo urządzeń,…). filei binwalk( http://binwalk.org/ ) mogą być pomocne.


bardzo fajny dodatek
użytkownik3085931
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.