Як витягти файли з uImage?


21

Buildroot створює зображення для вбудованого пристрою, де вони повинні працювати. Це працює дуже добре. У цих зображеннях входять корені.

У зв'язку з деякими дослідженнями я хотів би переглянути цей створений файл (наприклад, застосовано різні режими стиснення, встановлені Buildroot, і тепер перевіряється, чи правильно вони виконані), але я не можу знайти щось корисне в Мережі.

Наскільки я знаю, різниця між uImage та zImage - це лише невеликий заголовок, тому u-boot здатний прочитати цей двійковий файл. Але я не можу відкрити ні uImage, ні zImage.

Хтось може дати мені підказку, як розпакувати ці (u / z) зображення на хості?

Відповіді:


33
mkimage -l uImage

Знищить інформацію у заголовку.

tail -c+65 < uImage > out

Вийде вміст.

tail -c+65  < uImage | gunzip > out

не стиснеться, якщо воно було стиснене gzip.

Якщо це було initramfs, ви можете зробити cpio -t < outабо pax < outперерахувати вміст.

Якщо це зображення рамного диска, ви можете спробувати його встановити за допомогою:

mount -ro loop out /mnt

file out міг би розповісти вам більше про те, що це таке.


1
Заголовок каже мені, що це: зображення ядра ARM Linux (нестиснене). я не можу відкрити це ні gunzip, ні cpio так, як ти це пояснив. Не вдалося також встановити зображення
user3085931

@ user3085931, то це зображення ядра, а не файлова система. З цим не можна нічого робити, крім завантаження. Що ти хочеш з цим зробити?
Стефан Шазелас

але підводки входять. Я використовую 3 різних режими стиснення, і для одного з них він не працює, тому мій план полягав у тому, щоб відкрити зображення та перевірити, що
утиснуто

@ user3085931, якщо rootfs було додано до зображення ядра, то якимось чином зсув потрібно вказати десь як параметри, передані до ядра, або вбудовані в саме ядро. У вас є приклад такого образу десь?
Стефан Шазелас

я грав з одним, і він був стиснутий lzma ( mkimage -lповідомлялося Image Type: MIPS Linux Kernel Image (lzma compressed)), тому використовував unlzma, щоб розширити його
північно-Bradley

8

U-Boot пропонує власний dumpimageінструмент (знайдіть його в каталозі інструментів вашого дерева U-Boot)

Звичайно, він працює з простими зображеннями, але він також підтримує зображення у старому стилі

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

Ще не пробували його з новими стильовими образами FIT, але, мабуть, це просто спрацює.


1
Він працює із зображеннями FIT.
socketpair

4

У випадку, якщо всередині є кілька зображень, - це швидкий bashскрипт, щоб витягнути їх усі у файли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

Тоді вам потрібно перевірити, що є що (може бути запаковане ядро ​​Linux, архів з файлами, дерево пристрою,…). fileі binwalk( http://binwalk.org/ ) може бути корисним.


дуже приємне доповнення
user3085931
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.