Как извлечь файлы из uImage?

21

Buildroot генерирует образы для встроенного устройства, на котором они должны работать. Это работает очень хорошо. В этих изображениях включены rootfs.

Из-за некоторых исследований я хотел бы изучить этот сгенерированный файл (например, были применены различные режимы сжатия, установленные Buildroot, и теперь я должен проверить, правильно ли они были сделаны), но я не могу найти что-то полезное в Сети.

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

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

user3085931
источник

Ответы:

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, тогда это образ ядра, а не файловая система. Вы ничего не можете сделать с этим, кроме загрузки. Что вы хотите с этим сделать?
Стефан Шазелас
но rootfs включен. Я использую 3 различных режима сжатия, и для одного из них он не работает, поэтому я планировал открыть изображение и проверить, что сжато в bin
user3085931
@ user3085931, если rootfs был добавлен к образу ядра, то каким-то образом смещение должно быть указано где-либо либо как параметры, переданные ядру, либо как встроенные в само ядро. У вас есть пример такого изображения где-нибудь?
Стефан Шазелас
Я играл с одним, и он был сжат с помощью lzma (по mkimage -lсообщениям Image Type: MIPS Linux Kernel Image (lzma compressed)), поэтому использовал unlzma, чтобы расширить его
Northern-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.
Гнездовая пара
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/ ) может быть полезным.

PHK
источник
очень хорошее дополнение
user3085931