如何从uImage中提取文件?

use*_*931 29 embedded compression images u-boot buildroot

Buildroot 正在为它们应该运行的嵌入式设备生成图像。这工作得很好。在这些图像中,包含 rootfs。

由于一些研究,我想查看生成的文件(例如,应用了 Buildroot 设置的不同压缩模式,现在应检查它们是否正确完成),但我在网络中找不到有用的东西。

据我所知,uImage 和 zImage 之间的区别只是一个小标题,因此 u-boot 能够读取该二进制文件。但是我既不能打开 uImage,也不能打开 zImage。

谁能给我一个关于如何在主机上解压缩那些 (u/z) 图像的提示?

Sté*_*las 41

mkimage -l uImage
Run Code Online (Sandbox Code Playgroud)

将转储标题中的信息。

tail -c+65 < uImage > out
Run Code Online (Sandbox Code Playgroud)

会得到内容。

tail -c+65  < uImage | gunzip > out
Run Code Online (Sandbox Code Playgroud)

如果它是 gzip 压缩的,它将得到解压缩。

如果那是 initramfs,您可以执行cpio -t < outpax < out列出内容。

如果是 ramdisk 映像,您可以尝试使用以下命令挂载它:

mount -ro loop out /mnt
Run Code Online (Sandbox Code Playgroud)

file out 可以告诉你更多关于它是什么。

  • 标头告诉我这是一个:ARM Linux 内核映像(未压缩)。我无法按照您解释的方式使用gunzip 或cpio 打开它。也无法安装图像 (2认同)

Uwe*_*der 15

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
Run Code Online (Sandbox Code Playgroud)

还没有尝试使用新风格的 FIT 图像,但我想它应该可以工作。

  • 它适用于 FIT 图像。 (2认同)

phk*_*phk 5

如果里面有几个图像,这里是一个快速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
Run Code Online (Sandbox Code Playgroud)

然后你需要检查什么是什么(可能是一个打包的 Linux 内核、带有文件的存档、设备树,......)。filebinwalk( http://binwalk.org/ ) 可能会有所帮助。