解压打包img文件

在开发过程中,经常使用替换法来判断某个问题。
比如说A版本的system.img和B版本的system.img,前者会出现bug,后者没有问题。此时我们考虑将B版本中system.img中的某些文件提取出来放入到A版本中看是否还会再现bug,以此来确定是哪个模块出现问题。
所以我们就需要压缩和解压.img文件的方法。


查看文件类型

解压某个文件,需要确定该文件类型,可用 file 命令来查看。

  • #file system.img 得到system.img的文件类型如下:可知这个文件属于 ext4 的文件系统,不是压缩文件。所以该文件不用压缩,只需挂载即可。

    1
    system.img: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-946fc0f9f25b (needs journal recovery) (extents) (large files)
  • #file ramdisk.img 得到ramdisk.img的文件类型如下,可知这个属于 gzip 的压缩文件。

    1
    ramdisk.img: gzip compressed data, from Unix
  • #file uramdisk.img得到ramdisk.img的文件类型如下:

    1
    2
    3
    4
    5
    6
    Image Name:   xxx Root Filesystem
    Created: Fri Mar 17 19:35:51 2017
    Image Type: ARM Linux RAMDisk Image (uncompressed)
    Data Size: 15643904 Bytes = 15277.25 kB = 14.92 MB
    Load Address: 00000000
    Entry Point: 00000000

cpio 命令

参考如下链接进行了解:
http://blog.csdn.net/wh_19910525/article/details/8112538


挂载ext4文件系统步骤

1
2
3
# mkdir tmp
# sudo mount -t ext4 -o loop system.img tmp/
# mount

可以看到 system.img 已挂载到 tmp/ 目录下,如下:

1
/home/VictorHuang/share/uncompress/system.img on /home/VictorHuang/share/uncompress/tmp type ext4 (rw)

这样就可以看到 tmp/ 目录下有相关的文件了:

1
2
3
4
5
6
7
8
9
总用量 40
drwxr-xr-x 7 root root 4096 11 1970 ./
drwxr-xr-x 3 VictorHuangVictorHuang 4096 317 17:52 ../
drwxr-xr-x 2 root 2000 4096 311 13:40 bin/
-rw-r--r-- 1 root root 1065 311 13:30 build.prop
drwxr-xr-x 8 root root 4096 311 13:39 etc/
drwxr-xr-x 7 root root 12288 311 13:40 lib/
drwx------ 2 root root 4096 11 1970 lost+found/
drwxr-xr-x 3 root root 4096 311 13:39 usr/

这样,我们就可以修改替换 /tmp 目录下的某些模块了,然后再将其打包为新的system.img文件烧写的机器中,看bug是否还会出现。


解压ramdisk.img

ramdisk.img 重命名为 ramdisk.img.gz,命令如下:

1
# mv ramdisk.img ramdisk.img.gz

使用 gunzip 命令解压 ramdisk.img.gz,获得 ramdisk.img,如下:

1
# gunzip ramdisk.img.gz

此时通过 file 命令查看 ramdisk.img 文件变为:

1
ramdisk.img: ASCII cpio archive (SVR4 with no CRC)

使用 cpio 命令并解压 ramdisk.img 的内容,如下:

1
2
# cd tmp/
# cpio -i -F ../ramdisk.img

此时可以看到 ramdisk.img 里面的内容了

1
2
3
4
5
6
7
8
9
10
11
drwxrwxr-x 5 VictorHuangVictorHuang   4096  317 18:52 ./
drwxr-xr-x 3 VictorHuangVictorHuang 4096 317 18:49 ../
drwxr-xr-x 2 VictorHuangVictorHuang 4096 317 18:52 bin/
-rw-r--r-- 1 VictorHuangVictorHuang 116 317 18:52 default.prop
-rw-r----- 1 VictorHuangVictorHuang 1092 317 18:52 fstab.xxx
-rwxr-x--- 1 VictorHuangVictorHuang 420288 317 18:52 init*
-rwxr-x--- 1 VictorHuangVictorHuang 17713 317 18:52 init.rc*
-rwxr-x--- 1 VictorHuangVictorHuang 12343 317 18:52 init_update.rc*
drwxr-xr-x 3 VictorHuangVictorHuang 4096 317 18:52 lib/
drwxr-x--- 2 VictorHuangVictorHuang 4096 317 18:52 sbin/
-rw-r--r-- 1 VictorHuangVictorHuang 4024 317 18:52 ueventd.rc


压缩ramdisk.img文件

1
2
# cd tmp/
# find . |cpio -ov -H newc |gzip > ../ramdisk.img

这之后在上层目录下就会有生成的 ramdisk.img 文件生成。


uramdisk.img介绍

uramdisk.img 是由 u-boot 引导的ramdisk文件,ramdisk.imguramdisk.img 的关系如下:

64 个字节 + ramdisk.img = uramdisk.img
通过 file 命令查看的 uramdisk.img 获得的信息如下:

1
uramdisk.img: u-boot legacy uImage, xxx initramfs, Linux/ARM, RAMDisk Image (gzip), 2963484 bytes, Fri Mar 17 16:22:54 2017, Load Address: 0x00000000, Entry Point: 0x00000000, Header CRC: 0x753FEFF1, Data CRC: 0xA1E950C0


ramdisk.img生成uramdisk.img

使用 mkimage 命令来创建,基本的命令格式如下:

1
mkimage -A arm -O linux -C none  -T ${TYPE} -a ${LOAD_ADDRESS} -e ${ENTRY_ADDRESS} -n "${BUILD_TARGET} `date +%Y%m%d-%H%M%S`" -d ${SRC_FILE}${DST_FILE}

  • ${TYPE} :可以为 kernel 或者 ramdisk,前者标记使用 zImage 生成 uImage,后者标记使用 ramdisk.img 生成 uramdisk.img;
  • ${LOAD_ADDRESS}${ENTRY_ADDRESS}:两个加载和入口地址很关键;
  • 双引号括起来的内容为文件的说明;
  • ${SRC_FILE}:源文件名,为 zImage 或者是 ramdisk.img 文件;
  • ${DST_FILE}:生成的文件名,uImage 或者 uramdisk.img;

生成 uImage 命令:

1
# mkimage -A arm -O linux -C none  -T kernel -a 0x00000000 -e 0x00000000 -n "xxx kernel uImage" -d zImage+dtb.bin uImage+dtb

生成 uramdisk.img

1
# mkimage -A arm -O linux -C none  -T ramdisk -a 0x00000000 -e 0x00000000 -n "xxx Root Filesystem" -d ./ramdisk.img ./uramdisk.img


由uramdisk.img生成ramdisk.img

舍弃 uramdisk.img 的前64个字节

1
# dd if=uramdisk.img of=ramdisk.img.gz bs=64 skip=1

接下来的几步参照上面打包生成 ramdisk.img 的方法。

1
2
3
# gunzip ramdisk.img.gz
# cd tmp/
# cpio -i -F ../ramdisk.img


参考资料

http://blog.csdn.net/yatelanda/article/details/7972329
http://blog.csdn.net/do_script/article/details/7768427
http://blog.csdn.net/hancunai0017/article/details/6873948

Title:解压打包img文件

Author:Victor Huang

Time:2019-07-13 / 12:07

Link:http://wowothink.com/37fc608c/

License: Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)