手机启动镜像boot.img的解包(压)(用split_bootimg.pl)和问题gzip: boot.img-ramdisk.gz: not in gzip format解决

2023-05-16

下载工具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则信息全、步骤简单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手机启动镜像boot.img的解包(压)(用split_bootimg.pl)和问题gzip: boot.img-ramdisk.gz: not in gzip format解决 的相关文章

  • 在 Python 中标记一个保留分隔符的字符串

    有没有相当于str split在Python中也返回分隔符 在处理一些标记后 我需要保留输出的空白布局 Example gt gt gt s tthis is an example gt gt gt print s split this i
  • 正则表达式解析类似 Javascript 函数调用的语法

    我有以下数据可能性 fnname fnname value fnname value valueN 我需要一种方法用 javascript 正则表达式解析它以获得数组 fnname fnname value fnname value val
  • 在 R 中 split() 之后保持数据的原始顺序[重复]

    这个问题在这里已经有答案了 在下面的 R 代码中 我split a data frame通过一列 一个名为的字符串变量study name But split 按字母顺序重新订购原来的data frame In BASE R 分割后数据可以
  • 在 Linux 上使用 Apache Commons Compression 压缩文件时出现编码错误

    我正在使用 Apache Commons API Compression 来压缩文件 Windows 7 工作正常 但在 Linux ubuntu 10 10 UTF8 中 文件名和文件夹名称中的字符 例如 会被 替换 压缩时或解压缩 ta
  • Tomcat8 Gzip 压缩 CSS、JS

    我正在使用 tomcat8 并尝试模拟 CSS 和 JS 的 GZIP 压缩 我已在 server xml 中添加了条目 如下所示
  • 从文件读取时在 clojure 中分割行

    我正在学校学习 clojure 马上就要考试了 我只是在做一些事情以确保我掌握了窍门 我试图从文件中逐行读取 正如我所做的那样 只要有 我就想分割该行 到目前为止 这是我的代码 defn readFile map fn line cloju
  • regexp_split_to_table 和 row_number

    我有一个包含字符串数据的表 如下所示 id string data 1 red green blue 2 orange 3 purple cyan 我需要将字符串数据拆分为具有行号的项目 id num item 1 1 red 1 2 gr
  • gzip.open().read() 的大小参数

    当与gzipPython 中的库 我经常遇到使用 read 函数的模式如下所示 with gzip open filename as bytestream bytestream read 16 buf bytestream read IMA
  • 仅在第一个实例上分割字符串 - java

    我想用 字符分割字符串 但我希望它仅在第一次时分裂 我怎样才能做到这一点 这是 字符的 JavaScript 示例 但它对我不起作用仅在指定字符的第一个实例上分割字符串 https stackoverflow com questions 4
  • 正则表达式拆分 key=value

    我有一个像这样的字符串 KEY1 Value1 KE Y2 V LUE2A Value2B Key3 KEY4 V AL UE4 KEY5 Value5 我需要将其拆分以获得带有键值对的 Map 值在 应作为单个值传递 KE Y2是一个关键
  • 用于 HTTP 压缩的 GZip 或 Deflate

    哪种压缩方法更好 我听说过很多关于 GZip 被更广泛使用的说法 但 Deflate 更快 在某些情况下 是否有公认的标准来使用哪个标准以及为什么 UPDATE 根据链接问题的最新更新 应该使用 GZip 看http www vervest
  • 如何使用 Python GZip 模块压缩文件夹?

    我正在创建压缩文件 文件夹的 Python 软件 我将如何创建一段代码 要求用户输入文件夹位置 然后对其进行压缩 我目前拥有单个文件的代码 但没有包含完整文件的文件夹 请详细解释如何执行此操作 将文件夹压缩为 tar 文件的代码是 impo
  • 如何有效地将许多文件移动到新服务器?

    我正在更换托管提供商 需要将数百万个上传的文件传输到新服务器 所有文件都位于同一目录中 是的 你读对了 过去我这样做过 压缩源服务器中的所有文件 scp到新服务器的 zip Unzip Move directory to appropria
  • 普通的 x86 或 AMD PC 是直接从 ROM 运行启动/BIOS 代码,还是先将其复制到 RAM? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我知道现代计算机已经修改了哈佛架构 它们可以从保存数据的地方以外的地方读取指令 这一事实是否允许它们直接从 ROM 芯片获取指令 他们是先
  • 在 Postgres 中以周为单位分割间隔

    这是另一个关于日期的 SQL 问题 我正在使用 PHP 和 Postgres 构建一个日历应用程序 它将显示几天 几周甚至几个月的事件 每个事件都有开始日期和结束日期 按范围选择它们不是问题 然而 如果 Postgres 可以在每周的第一天
  • http压缩和url压缩有什么区别?

    查看 Web config 中的节点 我发现它允许 httpCompression 和 urlCompression 元素 两者有什么区别 我只想执行标准 gzip 我应该使用哪一个 url压缩指定what压缩和http压缩表示how进行压
  • java:无法访问org.springframework.boot.SpringApplication错误的类文件

    java cannot access org springframework boot SpringApplication bad class file C Users xyz m2 repository org springframewo
  • 如何在powershell中将一个大文本文件拆分为多个文件

    你好 我有一个像这样的大文本文件 BIGFILE TXT COLUMN1 COLUMN2 COLUMN3 COLUMN4 COLUMN5 COLUMN6 COLUMN7 COLUMN8 11 24 2013 50 67 51 22 50 6
  • 每第 n 个字符分割一个字符串

    在 JavaScript 中 这就是我们如何在每 3 个字符处分割一个字符串 foobarspam match 1 3 g 我正在尝试弄清楚如何在 Java 中做到这一点 有什么指点吗 你可以这样做 String s 1234567890
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际

随机推荐

  • SVN删除某版本解决办法

    手残将一些垃圾文件传到SVN服务器上去了 xff0c 如何在服务器上删除这几个版本呢 xff1f 其实很简单只需删除两个地方的版本记录文件然后在修改对呀版本就ok了 具体操作如下 xff1a 1 删除在服务器端对应SVN项目下的 db re
  • svn数据、用户迁移

    一 在VisualSVN Server bin 目录下进入cmd输入 xff1a svnadmin dump f Repositories test gt C Users Administrator Desktop test dump 二
  • easyui 获取不到combobox中已选取的value值

    39 form 39 form 39 load 39 question title basicData questionTitle question content basicData questionContent question ty
  • easyui datagrid无横向滚动条

    两个设置一模一样的datagrid xff0c 一个可以出现横向滚动条 xff0c 一个不可以 function 39 dg id 39 datagrid title 39 test 1 39 iconCls 39 icon edit 39
  • Git使用

    安装完成后 xff0c 打开Git Bash 配置用户信息 xff0c 因为git为分布式 xff0c 需要知道你是谁 git config global user name 34 nnnn 34 gir config global use
  • easyui 报错

    Uncaught SyntaxError Unexpected token lt 可能的原因是js路径引入错误 xff0c 之前遇到过这种情况 xff0c 这次文件换了路径后 xff0c 忘记更改 xff0c 导致再次 出现这个问题 xff
  • list清空

    list clear 其它引用该list的值也会被清空list 61 null 我是在for里用的 xff0c 第二次循环时 xff0c 会引起空指针异常 xff0c 具体原因不清楚每次重新 new ArrayList 来清空
  • easyui sidemenu侧边栏点击事件

    lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt title gt My Layout lt tit
  • VR发展前景展望

    VR发展前景展望 引子 随着计算机技术的飞速发展 xff0c 虚拟现实也在短时间内经历了萌芽探索到飞速发展完善的转变 由于其独特的沉浸式体验 xff0c VR的前景被大多数人看好 xff0c 更多的VR相关技术也在为让人能更完美的融合到这个
  • map与jsonObject

    想要的数据格式为 xff1a 34 第一章 34 34 1 第一节 34 34 sectionId 34 1 34 1 第二节 34 sectionId 34 2 34 第二章 34 34 2 第一节 34 34 sectionId 34
  • net.sf.json.JSONException: Object is null

    出现这个错误的原因是net sf json JSONArray或JSONObject转换时 xff0c 对象内包含另一个对象 xff0c 而该被包含的对象为NULL xff0c 所以抛出异常 一种解决办法是将json字符串里的null去掉
  • fastjson根据key去除某一项元素

    数据如下所示 xff1a 34 chapterId 34 1 34 sectionsName 34 34 数据结构简介 34 34 id 34 1 34 contents 34 34 ssssss 34 这里为一个sections对象 34
  • HTML引用外部json文件

    我是在hubuilder里试的 xff0c 先是新建data json文件 里面写上内容 其中var dataFromJSON是为了方便引用 var dataFromJSON 61 34 text 34 34 外部json 34 34 ic
  • idea使用json数据格式化

    Reformat Code 可以将json数据格式化 xff0c 看起来更整洁 xff0c 快捷键是CTRL 43 ALT 43 L但是用起来没反应 xff0c 应该是快捷键冲突 xff0c 然后修改快捷键 关于修改快捷键教程网上有很多
  • easyui layout布局内容显示不全

    设置fit属性为false即可
  • 使用ObjectMapper将map写出到json文件

    64 Test public void ttt String filePath 61 34 src main webapp courseData factorNameAndId json 34 Map lt String Object gt
  • 两次点击会出现undefine

    原因是将拿到的html元素直接插入到了一个新地方 xff0c 导致原有的元素消失 xff0c 所以第二次时获取不到 可以用这种方法 xff0c 获得复制的节点 var clonedNode 61 sourceNode cloneNode t
  • layui里 同级兄弟layer里的iframe方法调用

    比如我们有一个页面A xff0c 然后页面B和C是其子页面 xff0c 在页面A中打开B页面 xff0c 然后咋B中用parent layer open xff0c 打开C页面 xff0c 这样B和C就是A页面下的同级 xff08 兄弟 x
  • xshell远程连接虚拟机缓慢最后失败,(ssh,回环适配)

    https www cnblogs com areyouready p 10134771 html
  • 手机启动镜像boot.img的解包(压)(用split_bootimg.pl)和问题gzip: boot.img-ramdisk.gz: not in gzip format解决

    下载工具split bootimg pl 此脚本在github很多 如gist github com amartinz 84c7ebc64f126bd6b3a8 用split bootimg pl解包boot img 命令 xff1a sp