Làm cách nào để giải nén tập tin từ uImage?


21

Buildroot đang tạo hình ảnh cho một thiết bị nhúng nơi chúng nên chạy. Điều này đang làm việc rất tốt. Trong những hình ảnh, rootfs được bao gồm.

Do một số nghiên cứu, tôi muốn xem xét tệp được tạo (ví dụ: các chế độ nén khác nhau được thiết lập bởi Buildroot đã được áp dụng và bây giờ sẽ được kiểm tra nếu chúng được thực hiện chính xác), nhưng tôi không thể tìm thấy thứ gì hữu ích trong Net.

Theo tôi biết, sự khác biệt giữa uImage và zImage chỉ là một tiêu đề nhỏ, vì vậy u-boot có thể đọc tệp nhị phân đó. Nhưng tôi không thể mở uImage hay zImage.

Ai đó có thể cho tôi một gợi ý về cách giải nén những hình ảnh (u / z) trên máy chủ không?

Câu trả lời:


33
mkimage -l uImage

Sẽ đổ thông tin trong tiêu đề.

tail -c+65 < uImage > out

Sẽ nhận được nội dung.

tail -c+65  < uImage | gunzip > out

sẽ giải nén nó nếu nó được nén bằng gzip.

Nếu đó là một initramfs, bạn có thể làm cpio -t < outhoặc pax < outliệt kê nội dung.

Nếu đó là hình ảnh ramdisk, bạn có thể thử và gắn nó với:

mount -ro loop out /mnt

file out có thể cho bạn biết thêm về những gì nó là.


1
Tiêu đề cho tôi biết đó là: ARM Linux Kernel Image (không nén). Tôi không thể mở nó bằng gunzip hay cpio theo cách mà bạn đã giải thích. Việc gắn hình ảnh cũng không thể thực hiện được
dùng3085931

@ user3085931, thì đó là hình ảnh hạt nhân không phải là một hệ thống tập tin. Bạn không thể làm bất cứ điều gì với nó ngoại trừ khởi động nó. Bạn muốn làm gì với cái này?
Stéphane Chazelas

nhưng rootfs được bao gồm. Tôi sử dụng 3 chế độ nén khác nhau và đối với một trong số chúng không hoạt động, do đó, kế hoạch của tôi là mở hình ảnh và kiểm tra xem bin đã nén gì
user3085931 6/214

@ user3085931, nếu rootfs đã được thêm vào hình ảnh kernel, thì bằng cách nào đó, phần bù phải được chỉ định ở đâu đó dưới dạng tham số được truyền cho kernel hoặc được nhúng trong chính kernel. Bạn có một ví dụ về một hình ảnh như vậy ở đâu đó không?
Stéphane Chazelas

Tôi đã chơi với một người và nó bị nén với lzma ( mkimage -lđã báo cáo Image Type: MIPS Linux Kernel Image (lzma compressed)) nên đã sử dụng unlzma để mở rộng nó
bắc-bradley

8

U-Boot mang dumpimagecông cụ riêng của nó (tìm nó trong thư mục công cụ của cây U-Boot của bạn)

Tất nhiên nó hoạt động với hình ảnh đơn giản, nhưng nó cũng hỗ trợ hình ảnh đa phong cách cũ

$ ~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

Chưa thử nó với hình ảnh FIT phong cách mới, nhưng tôi đoán nó chỉ nên hoạt động.


1
Nó hoạt động với hình ảnh FIT.
thất bại

4

Trong trường hợp có một số hình ảnh bên trong đây là một đoạn bashmã nhanh để trích xuất tất cả chúng vào các tệp 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

Sau đó, bạn cần kiểm tra xem đó là gì (có thể là một nhân Linux được đóng gói, lưu trữ với các tệp, cây thiết bị, một). filebinwalk( http://binwalk.org/ ) có thể hữu ích.


bổ sung rất hay
user3085931
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.