如何从uImage提取文件?


21

Buildroot正在为应在其上运行的嵌入式设备生成映像。这运作得很好。在那些映像中,包括rootfs。

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

据我所知,uImage和zImage之间的区别只是一个很小的头,因此u-boot能够读取该二进制文件。但是我无法打开uImage或zImage。

谁能给我提示如何在主机上解压缩(u / z)图像?

Answers:


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 2014年

@ user3085931,那是一个内核映像而不是文件系统。除了启动它之外,您无法对其进行任何操作。您想怎么办?
斯特凡Chazelas

但包括rootfs。我使用了3种不同的压缩模式,其中一种不起作用,因此我的计划是打开图像并检查已压缩bin的内容
user3085931 2014年

@ user3085931,如果已将rootfs附加到内核映像,则必须以某种方式指定偏移量,作为传递给内核的参数或嵌入到内核本身中。您在某处有这样的图像示例吗?
斯特凡Chazelas

我一直在玩它,并用lzma压缩(mkimage -l据报道Image Type: MIPS Linux Kernel Image (lzma compressed)),所以用unlzma对其进行了扩展
Northern-bradley

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图像。
socketpair,

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内核,包含文件的存档,设备树等)。filebinwalkhttp://binwalk.org/)可能会有所帮助。


非常好的补充
user3085931
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.