在开发过程中,经常使用替换法来判断某个问题。
比如说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
6Image 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 |
可以看到 system.img
已挂载到 tmp/
目录下,如下:
1 | /home/VictorHuang/share/uncompress/system.img on /home/VictorHuang/share/uncompress/tmp type ext4 (rw) |
这样就可以看到 tmp/
目录下有相关的文件了:
1 | 总用量 40 |
这样,我们就可以修改替换 /tmp
目录下的某些模块了,然后再将其打包为新的system.img
文件烧写的机器中,看bug是否还会出现。
解压ramdisk.img
将 ramdisk.img
重命名为 ramdisk.img.gz
,命令如下:
1 |
使用 gunzip
命令解压 ramdisk.img.gz
,获得 ramdisk.img
,如下:
1 |
此时通过 file
命令查看 ramdisk.img
文件变为:
1 | ramdisk.img: ASCII cpio archive (SVR4 with no CRC) |
使用 cpio
命令并解压 ramdisk.img
的内容,如下:
1 |
此时可以看到 ramdisk.img
里面的内容了
1 | drwxrwxr-x 5 VictorHuangVictorHuang 4096 3月 17 18:52 ./ |
压缩ramdisk.img文件
1 |
这之后在上层目录下就会有生成的 ramdisk.img
文件生成。
uramdisk.img介绍
uramdisk.img
是由 u-boot
引导的ramdisk
文件,ramdisk.img
和 uramdisk.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 |
生成 uramdisk.img
1 |
由uramdisk.img生成ramdisk.img
舍弃 uramdisk.img
的前64个字节
1 |
接下来的几步参照上面打包生成 ramdisk.img
的方法。
1 |
参考资料
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