MagiskBoot 解包重打包 boot.img 实战指南:两条命令改好启动镜像
【免费下载链接】MagiskThe Magic Mask for Android项目地址: https://gitcode.com/GitHub_Trending/ma/Magisk
手里攥着一个 boot.img,想给内核加个参数、塞个脚本,却不知道从哪下刀——直接拿 16 进制编辑器改,又生怕把机器刷砖。MagiskBoot 就是 Magisk 自带的启动镜像拆装工具箱:一条命令解包、一条命令重打包,CPIO 归档和设备树也顺手处理。读完这篇,你能从一份原始 boot 镜像出发,产出一个改好并可直接刷入的新镜像。
MagiskBoot 能力速写
- 把 boot 镜像拆成独立组件文件:
unpack - 按原头部模板重组出新镜像:
repack - 对 CPIO 归档增删文件、建目录:
cpio - 查看并移除 DTB 里的 verity/avb 节点:
dtb - 从 OTA 的 payload.bin 提取 boot 分区:
extract
它和magisk、magiskinit、magiskpolicy并列为 Magisk 的四个核心二进制,完整命令清单见 docs/tools.md,源码位于 native/src/boot/。
MagiskBoot 解包重打包主流程
下刀前先确认一件事:这台设备的 ramdisk 到底在 boot 分区还是 recovery 分区,这决定你该解包哪个镜像(差异细节见 docs/boot.md)。Magisk 管理器首页会直接给出答案:
从 payload.bin 提取镜像
手里只有 OTA 升级包时不用手工拆,直接让工具把 boot 分区挖出来:
# 自动尝试提取 init_boot 或 boot 分区 ./magiskboot extract payload.bin落盘文件名会告诉你选中了哪个分区:是init_boot.img还是boot.img,后续解包就用它。
unpack 解包 boot.img
这一条按头部描述把镜像拆成当前目录下的组件文件,-h顺手导出头部信息,后面改 cmdline 要用:
# 解包;-h 额外导出 header 文本 ./magiskboot unpack -h boot.img目录里会多出这些文件:kernel(解压后的内核,一般不动)、ramdisk.cpio(初始文件系统,注脚本就动它)、header(头部信息文本,改参数用它)、dtb/second/extra(不是每台设备都有,出现才管它)。
组件摊开在眼前,剩下做什么完全取决于你的目标。
给 cmdline 追加一个参数
只改参数、不碰文件系统的,看这里。header是个文本文件,找到cmdline=那行,行末追加参数(比如loglevel=8),存盘即可:
# 用原始镜像作参照重打包;不指定输出时默认叫 new-boot.img ./magiskboot repack boot.img cmdline-boot.imgheader里的kernel_size、ramdisk_size、page_size这类字段别手改,重打包时工具会按实际组件自动回填。
往 ramdisk 塞开机脚本
cpio子命令直接对归档做原地修改,每条命令用引号包起来:
# 全部解出查看(先切到临时目录,别污染 repack 工作目录) ./magiskboot cpio ramdisk.cpio extract # 以 0755 权限注入脚本,已存在则覆盖 ./magiskboot cpio ramdisk.cpio "add 0755 init.d/00_my.sh my.sh" ./magiskboot repack boot.img script-boot.img路径与权限要符合设备 init 的挂载习惯;repack 只认当前目录下的组件文件,混进无关文件可能产出坏镜像,拿不准就先./magiskboot cleanup再来一遍。
从 DTB 移除 verity 校验
部分设备把完整性校验写在设备树的 fstab 节点里。先确认有没有,再原地打补丁:
# 只打印 fstab 节点,看到 verity 相关属性才需要动手 ./magiskboot dtb dtb print -f # 原地移除 verity/avb 条目 ./magiskboot dtb dtb patch ./magiskboot repack boot.img noavb-boot.img为什么不会刷坏启动
repack 的第一个参数必须是当初解包的那个原始镜像——工具把它当模板:页大小、头部格式、区段布局、压缩算法全部沿用,只重算区段大小与校验和,再把各组件按原格式压回去。
| repack 处理的内容 | 做法 |
|---|---|
| 原始头部模板(页大小/格式/布局) | 原样沿用 |
| 区段大小、校验和 | 按实际组件重算 |
| 各组件的压缩格式(gzip/lz4/xz…) | 按原格式压回 |
一句话:它不是重建镜像,而是原位替换,所以刷回设备后引导流程与原版一致。
🔍 刷入失败?排错速查
| 症状 | 原因 | 解法 |
|---|---|---|
| 刷入后卡 logo | repack 张冠李戴,参照镜像用错 | 第一个参数必须是当初解包的原始镜像 |
| 产出镜像无法刷入 | 当前目录混入残留文件 | ./magiskboot cleanup或换干净目录重做 |
| 验证失败、卡在启动页 | A/B 设备刷错槽位或漏刷 vbmeta | 参考 docs/install.md 的 A/B 章节 |
unpack返回 2 | 识别为 ChromeOS 镜像 | 属正常返回值,不是错误 |
| ramdisk 解出来是空的 | 这台设备 ramdisk 在 vendor_boot 里 | 改解包 vendor_boot 分区 |
⚠️ 动手前必做三件事:备份原始boot.img;每处改动单独产出命名清晰的新镜像(cmdline-boot.img、script-boot.img),方便随时装回原版;先在模拟器或能接受变砖的机器上验证,再动主力机。
MagiskBoot 把"拆启动镜像"这件原本要手写解析器的事,收敛成了两条命令加几次文本编辑。你不需要理解每个字节的偏移,只需要知道它保留了什么、只改了什么。刷之前,把原镜像收好就行。
【免费下载链接】MagiskThe Magic Mask for Android项目地址: https://gitcode.com/GitHub_Trending/ma/Magisk
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考