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


21

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

いくつかの研究により、生成されたファイルを調べたいと思います(たとえば、Buildrootによって設定された異なる圧縮モードが適用され、正しく実行されたかどうかを確認します)が、ネットで何か有用なものが見つかりません。

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

ホスト上のそれらの(u / z)Imagesを解凍する方法のヒントを教えてもらえますか?

回答:


33
mkimage -l uImage

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

tail -c+65 < uImage > out

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

tail -c+65  < uImage | gunzip > out

gzipで圧縮されている場合は、非圧縮になります。

それがinitramfsであった場合は、コンテンツを一覧表示するcpio -t < outpax < out、一覧表示することができます。

ramdiskイメージの場合は、次の方法で試してマウントできます。

mount -ro loop out /mnt

file out それが何であるかについてあなたにもっと伝えることができます。


1
ヘッダーは、それがARM Linuxカーネルイメージ(非圧縮)であることを示しています。あなたがそれを説明したように、gunzipでもcpioでも開くことができません。イメージをマウントすることはできませんでした、あまりにも
user3085931

@ user3085931、それはファイルシステムではなくカーネルイメージです。起動する以外は何もできません。あなたはそれで何をしたいですか?
ステファンシャゼル

しかし、rootfsは含まれています。したがって、私の計画は、画像を開いて、ビンが圧縮されている内容を確認することでした、私は3種類の圧縮モードを使用し、そのうちの一つのためにそれは働いていない
user3085931

@ user3085931、rootfsがカーネルイメージに追加されている場合は、カーネルに渡されるパラメーターとして、またはカーネル自体に埋め込むために、何らかの方法でオフセットをどこかで指定する必要があります。そのようなイメージの例はどこかにありますか?
ステファンシャゼル14

私は1つで遊んでいて、lzmaで圧縮mkimage -lされていたImage Type: MIPS Linux Kernel Image (lzma compressed)ので(報告されています)、unlzmaを使用してそれを拡張しました

8

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画像で試していませんが、うまくいくはずです。


1
FIT画像で動作します。
ソケットペア

4

場合にはいくつかの画像は、内部ここにあります迅速ある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/)が役立つ場合があります。


非常に素晴らしい追加
user3085931
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.