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내용을 나열할 수 있습니다.

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

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_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 커널, 파일이 포함된 아카이브, 장치 트리 등). file그리고 binwalk(http://binwalk.org/) 도움이 될 수 있습니다.

답변4

7zOpenWRT 및 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


관련 정보