web-dev-qa-db-ja.com

uImageからファイルを抽出する方法?

Buildrootは、実行する必要がある組み込みデバイスのイメージを生成しています。これは非常にうまく機能しています。これらのイメージには、rootfsが含まれています。

いくつかの調査のために、生成されたファイルを調べたいと思います(たとえば、Buildrootによって設定されたさまざまな圧縮モードが適用され、それらが正しく実行されたかどうかを確認する必要があります)。

私の知る限り、uImageとzImageの違いはほんの小さなヘッダーなので、u-bootはそのバイナリファイルを読み取ることができます。しかし、uImageもzImageも開くことができません。

ホストでそれらの(u/z)イメージを解凍する方法のヒントを誰かに教えてもらえますか?

23
user3085931
mkimage -l uImage

ヘッダーに情報をダンプします。

tail -c+65 < uImage > out

コンテンツを取得します。

tail -c+65  < uImage | gunzip > out

gzip圧縮されている場合は、解凍されます。

それがinitramfsだった場合は、cpio -t < outまたはpax < outでコンテンツを一覧表示します。

Ramdiskイメージの場合は、次のコマンドでマウントしてみてください。

mount -ro loop out /mnt

file outは、それが何であるかについてもっと教えてくれるでしょう。

34

U-Bootは独自のdumpimageツールを提供します(U-Bootツリーのtoolsディレクトリにあります)

もちろんシンプルな画像でも機能しますが、古いスタイルのマルチ画像もサポートしています

$ ~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画像でまだ試したことはありませんが、うまくいくはずです。

9
Uwe Geuder

ここに複数の画像がある場合は、それらをすべてファイルに抽出するための簡単なbashスクリプトimage_0image_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およびbinwalkhttp://binwalk.org/ )が役立つ場合があります。

5
phk