uImage からファイルを抽出するにはどうすればいいですか?

uImage からファイルを抽出するにはどうすればいいですか?

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

調査の結果、生成されたファイルを調べたいのですが (たとえば、Buildroot によって設定されたさまざまな圧縮モードが適用され、それらが正しく実行されたかどうかを確認する必要があります)、ネット上で役立つ情報が見つかりません。

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

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

答え1

mkimage -l uImage

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

tail -c+65 < uImage > out

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

tail -c+65  < uImage | gunzip > out

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

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

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

mount -ro loop out /mnt

file outそれが何であるかについて、さらに詳しくお話しできます。

答え2

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 画像ではまだ試していませんが、おそらく動作するはずです。

答え3

内部に複数の画像がある場合、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/)が役に立つかもしれません。

答え4

7z私にとっては「うまく動作する」のですが、これはOpenWRTとSquashFSに特有のものかもしれません。私はOpenWRTフォーラムへのコメント

$ file image.bin 
image.bin: u-boot legacy uImage, OpenWrt fullimage, Linux/MIPS, Multi-File Image (Not compressed), 11334834 bytes, Mon Apr 12 09:59:28 2021, Load Address: 00000000, Entry Point: 00000000, Header CRC: 0XDFDE3FF5, Data CRC: 0X7704142B

$ 7z x image.bin

7-Zip [64] 17.04 : Copyright (c) 1999-2021 Igor Pavlov : 2017-08-28
p7zip Version 17.04 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,16 CPUs x64)

Scanning the drive for archives:
1 file, 11334898 bytes (11 MiB)

Extracting archive: image.bin
--       
Path = image.bin
Type = SquashFS
Offset = 2097224
Physical Size = 9237674
Headers Size = 47040
File System = SquashFS 4.0
Method = XZ
Cluster Size = 262144
Big-endian = -
Created = 2021-04-12 04:59:26
Characteristics = DUPLICATES_REMOVED EXPORTABLE 0x600
Code Page = UTF-8

Everything is Ok                                        

Folders: 145
Files: 2518
Size:       36789620
Compressed: 11334898


関連情報