下载工具split_bootimg.pl :
此脚本在github很多,如gist.github.com/amartinz/84c7ebc64f126bd6b3a8
用split_bootimg.pl解包boot.img
命令:split_bootimg.pl boot.img
$ ls
boot.img split_bootimg.pl
$ ./split_bootimg.pl boot.img
Page size: 2048 (0x00000800)
Kernel size: 4113352 (0x003ec3c8)
Ramdisk size: 682322 (0x000a6952)
Second size: 0 (0x00000000)
Board name: 27
Command line: product.version=PD1304BT_A_1.10.0
Writing boot.img-kernel ... complete.
Writing boot.img-ramdisk.gz ... complete.
以上数据中的page size , command line在打包时会用到(应该还有个base, padding size的,这里好像没有)
得到2个文件:
boot.img-kernel , boot.img-ramdisk.gz
$ ls
boot.img boot.img-kernel boot.img-ramdisk.gz split_bootimg.pl
解压boot.img-ramdisk.gz :
问题:gzip: boot.img-ramdisk.gz: not in gzip format
$ gzip -d boot.img-ramdisk.gz
gzip: boot.img-ramdisk.gz: not in gzip format
明明是gz文件却解压不了,此时把压缩文件格式标记1f 8b 08之前的数据去掉即可。
查看文件属性:
$ file boot.img-ramdisk.gz
boot.img-ramdisk.gz: data
gz压缩文件的起始标记是:1f 8b 08
我们可以通过以下两种方式定位此标记:
第一种:
二进制数据查找命令:
od -A x -t x1 boot.img-ramdisk.gz | grep “1f 8b 08”
od命令主要用来查看文件中不能直接显示在终端的字符
- -A x表示地址用十六进制显示
- -A d表示地址用十进制显示
- -t x1表示十六进制的输出格式
地址用16进制:
$ od -A x -t x1 boot.img-ramdisk.gz | grep "1f 8b 08"
000200 1f 8b 08 00 00 00 00 00 00 03 ec bc 79 7c 54 45
地址用10进制:
$ od -A d -t x1 boot.img-ramdisk.gz | grep "1f 8b 08"
0000512 1f 8b 08 00 00 00 00 00 00 03 ec bc 79 7c 54 45
地址为0000512说明标记出现在第513个字节处(0开始的),去掉前面512字节的数据即可
第二种:
用WinHex打开压缩文件,打开查找功能来定位
去除前面512字节的数据:
命令:dd if=./boot.img-ramdisk.gz of=ramdisk.gz bs=512 skip=1
参数说明:
- bs=512,bs即blocks,就是一次操作块的大小是512字节
- skip=1,忽略第一个块(512字节)(也可以块大小1字节,然后skip=512)
- count=xxx,读取多少个bs,不指定则是全部
$ dd if=./boot.img-ramdisk.gz of=ramdisk.gz bs=512 skip=1
1331+1 records in
1331+1 records out
681810 bytes (682 kB, 666 KiB) copied, 0.0155042 s, 44.0 MB/s
$ ls
boot.img boot.img-kernel boot.img-ramdisk.gz ramdisk.gz split_bootimg.pl
查看文件格式:
$ file ramdisk.gz
ramdisk.gz: gzip compressed data, from Unix, original size modulo 2^32 1235968
用xxd命令查看文件头:
$ xxd -l 64 newramdisk.gz
00000000: 1f8b 0808 6f6a 7e62 0003 6e65 7772 616d ....oj~b..newram
00000010: 6469 736b 00ec 3c6d 6c1c c775 4b8a b6a4 disk..<ml..uK...
00000020: b35d cbb6 5c18 707e 8cc5 36a1 6af2 f648 .]..\.p~..6.j..H
00000030: 93d4 474d 4114 8f27 b116 4596 a46c 0528 ..GMA..'..E..l.(
解压ramdisk.gz :
-d 表示解压
$ gunzip ramdisk.gz
或
$ gzip -d ramdisk.gz
解包后生成新文件ramdisk
文件格式变为ASCII cpio archive :
$ file ramdisk
ramdisk: ASCII cpio archive (SVR4 with no CRC)
还原备份的数据:
命令:cpio -i …/ramdisk
$ mkdir ram
$ cd ram
$ cpio -i ../ramdisk
2414 blocks
还原出来的文件:
$ ls
data init.modem.rc meta_init.rc
default.prop init.no_ssd.rc proc
dev init.project.rc res
enableswap.sh init.protect.rc sbchk
factory_init.project.rc init.rc sbin
factory_init.rc init.trace.rc sys
fstab init.usb.rc system
init init.vivo.rc ueventd.goldfish.rc
init.aee.customer.rc init.xlog.rc ueventd.rc
init.charging.rc meta_init.modem.rc
init.goldfish.rc meta_init.project.rc
gzip -d ramdisk.gz和cpio -i …/ramdisk两步可以用以下一步替代:
gzip -dc …/ramdisk.gz | cpio -i
c参数表示输出到标准输出
=====================================
修改后重新打包:
在ram中加一个测试文件test.txt,然后重新打包
(1)先备份:
命令:find . -depth | cpio -ov -F …/newramdisk
或find . -depth | cpio -ov > …/newramdisk
-F用来指定文件名
$ find . -depth | cpio -ov -F ../newramdisk
./data
./default.prop
./dev
./enableswap.sh
./factory_init.project.rc
./factory_init.rc
./fstab
./init
./init.aee.customer.rc
./init.charging.rc
./init.goldfish.rc
./init.modem.rc
./init.no_ssd.rc
./init.project.rc
./init.protect.rc
./init.rc
./init.trace.rc
./init.usb.rc
./init.vivo.rc
./init.xlog.rc
./meta_init.modem.rc
./meta_init.project.rc
./meta_init.rc
./proc
./res
./sbchk/sbchk
./sbchk/sec_chk.sh
./sbchk
./sbin/adbd
./sbin/e2fsck
./sbin/meta_tst
./sbin/tune2fs
./sbin/ueventd
./sbin/watchdogd
./sbin
./sys
./system
./test.txt 新加入的文件
./ueventd.goldfish.rc
./ueventd.rc
.
2408 blocks
查看备份的新文件newramdisk:
命令:cpio -vt < …/newramdisk
$ cpio -vt < ../newramdisk
drwxrwx--x 1 500 513 0 May 13 16:50 data
-rw-r--r-- 1 500 513 194 May 13 16:50 default.prop
drwxr-xr-x 1 500 513 0 May 13 16:50 dev
-rw-r--r-- 1 500 513 127 May 13 16:50 enableswap.sh
-rw-r--r-- 1 500 513 0 May 13 16:50 factory_init.project.rc
-rw-r--r-- 1 500 513 16566 May 13 16:50 factory_init.rc
-rw-r--r-- 1 500 513 594 May 13 16:50 fstab
-rwxr-x--- 1 500 513 167004 May 13 16:50 init
-rwxr-x--- 1 500 513 411 May 13 16:50 init.aee.customer.rc
-rwxr-x--- 1 500 513 23691 May 13 16:50 init.charging.rc
-rwxr-x--- 1 500 513 2583 May 13 16:50 init.goldfish.rc
-rwxr-x--- 1 500 513 3044 May 13 16:50 init.modem.rc
-rwxr-x--- 1 500 513 424 May 13 16:50 init.no_ssd.rc
-rwxr-x--- 1 500 513 2036 May 13 16:50 init.project.rc
-rwxr-x--- 1 500 513 1487 May 13 16:50 init.protect.rc
-rwxr-x--- 1 500 513 50474 May 13 16:50 init.rc
-rwxr-x--- 1 500 513 2126 May 13 16:50 init.trace.rc
-rwxr-x--- 1 500 513 21439 May 13 16:50 init.usb.rc
-rwxr-x--- 1 500 513 1131 May 13 16:50 init.vivo.rc
-rwxr-x--- 1 500 513 583 May 13 16:50 init.xlog.rc
-rw-r--r-- 1 500 513 689 May 13 16:50 meta_init.modem.rc
-rw-r--r-- 1 500 513 1527 May 13 16:50 meta_init.project.rc
-rw-r--r-- 1 500 513 10969 May 13 16:50 meta_init.rc
drwxr-xr-x 1 500 513 0 May 13 16:50 proc
lrwxrwxrwx 1 500 513 11 May 13 16:50 res -> /system/res
-rw-r--r-- 1 500 513 83300 May 13 16:50 sbchk/sbchk
-rw-r--r-- 1 500 513 497 May 13 16:50 sbchk/sec_chk.sh
drwxr-xr-x 1 500 513 0 May 13 16:50 sbchk
-rwxr-x--- 1 500 513 231408 May 13 16:50 sbin/adbd
-rwxr-x--- 1 500 513 338440 May 13 16:50 sbin/e2fsck
-rwxr-x--- 1 500 513 21856 May 13 16:50 sbin/meta_tst
-rwxr-x--- 1 500 513 242212 May 13 16:50 sbin/tune2fs
lrwxrwxrwx 1 500 513 7 May 13 16:50 sbin/ueventd -> ../init
lrwxrwxrwx 1 500 513 7 May 13 16:50 sbin/watchdogd -> ../init
drwxr-x--- 1 500 513 0 May 13 16:50 sbin
drwxr-xr-x 1 500 513 0 May 13 16:50 sys
drwxr-xr-x 1 500 513 0 May 13 16:50 system
-rwxr-xrwx 1 Administ 513 16 May 13 22:15 test.txt 新加入的文件
-rw-r--r-- 1 500 513 272 May 13 16:50 ueventd.goldfish.rc
-rw-r--r-- 1 500 513 5809 May 13 16:50 ueventd.rc
drwxr-xr-x 1 500 513 0 May 13 22:14 .
2408 blocks其中
问题一:
检查刚备份好的文件时出现的
cpio: premature end of file
$ cpio -cvt -F new/newramdisk
cpio: premature end of file
解决:去掉c参数,即cpio -vt -F new/newramdisk
问题二:
解包刚刚做好的备份时出现的
其实是不会自动建立子目录引起
$ cpio -i < newramdisk
cpio: sbchk/sec_chk.sh: Cannot open: No such file or directory
cpio: sbchk/sbchk: Cannot open: No such file or directory
cpio: sbin/tune2fs: Cannot open: No such file or directory
cpio: sbin/meta_tst: Cannot open: No such file or directory
cpio: ../init: Cannot symlink to ‘sbin/watchdogd’: No such file or directory
cpio: ../init: Cannot symlink to ‘sbin/ueventd’: No such file or directory
cpio: sbin/e2fsck: Cannot open: No such file or directory
cpio: sbin/adbd: Cannot open: No such file or directory
2408 blocks
解决:加上d参数自动建立子目录即可,cpio -idmv < newramdisk
或在备份时加上d参数
(2)再压缩:
命令:gzip newramdisk
以上的“先备份”、再“压缩”可用以下mkbootfs工具一步完成:
命令:./mkbootfs ./ram | gzip > newramdisk.gz
mkbootfs下载:在search.gitee.com/中查找
最后将kernel、ramdisk组合成新的boot-new.img文件:
命令:mkbootimg --kernel boot.img-kernel --ramdisk newramdisk.gz -o boot-new.img
biren@ubuntu:~/downloads$ ls
boot.img-kernel mkbootfs mkbootimg new newramdisk.gz old ramdisk
biren@ubuntu:~/downloads$ ./mkbootimg --kernel boot.img-kernel --ramdisk newramdisk.gz -o boot-new.img
biren@ubuntu:~/downloads$ ls
boot.img-kernel mkbootfs new old
boot-new.img mkbootimg newramdisk.gz ramdisk
当然有必要时还要指定组合时的参数:
biren@ubuntu:~/downloads$ ./mkbootimg --help
usage: mkbootimg
--kernel <filename>
--ramdisk <filename>
[ --second <2ndbootloader-filename> ]
[ --cmdline <kernel-commandline> ]
[ --board <boardname> ]
[ --base <address> ]
[ --pagesize <pagesize> ]
[ --ramdisk_offset <address> ]
[ --dt <filename> ]
-o|--output <filename>
如:
./mkbootimg --kernel boot.img-kernel --ramdisk newramdisk.gz --cmdline "product.version=PD1304BT_A_1.10.0" --base 0x10000000 --pagesize 2048 -o boot-new.img
另外说明 :
在这个例子中有4个不如意的地方:
1、不能直观地提供base地址
2、会造成512字节的丢失
3、步骤较多
4、解压boot.img-ramdisk.gz后少了一个总文件夹initrd
相比较用bootimg.exe则信息全、步骤简单。