uImage에서 파일을 추출하는 방법?


21

Buildroot는 실행해야하는 임베디드 디바이스의 이미지를 생성합니다. 이것은 매우 잘 작동합니다. 이 이미지에는 rootfs가 포함되어 있습니다.

일부 연구로 인해 생성 된 파일을 살펴보고 싶습니다 (예 : Buildroot에서 설정 한 다른 압축 모드가 적용되었으며 올바르게 수행되었는지 확인해야 함).하지만 인터넷에서 유용한 것을 찾을 수 없습니다.

내가 아는 한 uImage와 zImage의 차이점은 작은 헤더이므로 u-boot는 해당 바이너리 파일을 읽을 수 있습니다. 그러나 uImage와 zImage를 열 수는 없습니다.

누구든지 호스트의 이미지 (u / z)를 압축 해제하는 방법에 대한 힌트를 줄 수 있습니까?

답변:


33
mkimage -l uImage

헤더에 정보를 덤프합니다.

tail -c+65 < uImage > out

내용을 얻습니다.

tail -c+65  < uImage | gunzip > out

gzip 압축 된 경우 압축 해제됩니다.

이것이 initramfs 인 경우 cpio -t < out또는 pax < out내용을 나열 하거나 나열 할 수 있습니다 .

램 디스크 이미지 인 경우 다음을 사용하여 이미지를 마운트하고 마운트 할 수 있습니다.

mount -ro loop out /mnt

file out 그것이 무엇인지 더 말해 줄 수 있습니다.


1
헤더는 ARM Linux 커널 이미지 (압축되지 않음)라고 알려줍니다. gunzip이나 cpio를 사용하여 설명 한대로 열 수 없습니다. 이미지 마운트도 불가능했습니다
user3085931

@ user3085931, 파일 시스템이 아닌 커널 이미지입니다. 부팅하지 않고는 아무것도 할 수 없습니다. 그것으로 무엇을하고 싶습니까?
Stéphane Chazelas

그러나 rootfs는 포함되어 있습니다. 그 중 하나가 작동하지 않습니다 나는 3 개 가지 압축 모드를 사용하고, 그러므로 나의 계획은 이미지를 열고 빈 압축 된 내용을 확인하는 것이 었습니다
user3085931

@ user3085931에서 rootfs가 커널 이미지에 추가 된 경우 오프셋은 커널에 전달되거나 커널 자체에 포함 된 매개 변수로 어딘가에 지정되어야합니다. 어딘가에 그러한 이미지의 예가 있습니까?
Stéphane Chazelas

나는 하나와 함께 연주하고 그것은 lzma로 압축되었습니다 ( mkimage -l보고 Image Type: MIPS Linux Kernel Image (lzma compressed)) 그래서 unlzma를 사용하여 그것을 확장
Northern-bradley

8

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 이미지로 시도하지는 않았지만 작동해야한다고 생각합니다.


1
FIT 이미지와 함께 작동합니다.
소켓 페어

4

경우 여러 이미지 내부 여기에 빠른있다 bash파일로 그들 모두를 추출하는 스크립트 image_0, image_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 커널, 파일이있는 아카이브, 장치 트리 등). filebinwalk( http://binwalk.org/ ) 도움이 될 수 있습니다.


아주 좋은 또한
user3085931
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.