2 条命令玩转 MagiskBoot:boot.img 解包、重打包与任务清单
【免费下载链接】MagiskThe Magic Mask for Android项目地址: https://gitcode.com/GitHub_Trending/ma/Magisk
boot.img 其实是一只格式固定的行李箱:头部记录页大小与各区段的偏移、长度,箱内装着 kernel、ramdisk 等"行李"。Magisk 项目四个核心二进制之一的 MagiskBoot(boot 镜像解包与重打包的命令行工具),就是开这只箱子的专用工具:按头部信息把件件取出,改完再原位装回,CPIO 归档操作与设备树打补丁也归它管。全文按任务清单推进,每章对应一个能落地的小目标。
🧩 先拆看:boot.img 里到底装着什么
头部(header)就是行李箱的尺寸标签:页大小、格式版本、每个区段从哪里开始、有多长,全写在里面。解包做的事,就是照着这张标签把每个区段按文件名导出。
先记住各区段和后面任务的对应关系:
- kernel(内核镜像):绝大多数任务用不上它。
- ramdisk.cpio:CPIO(一种老式文件归档格式)打包的归档,注入脚本、增删文件都发生在这里。
- dtb(设备树二进制):不是每款设备都有,部分机型把完整性校验节点写在里面。
- second、extra:少见区段,按需出现,基本不动。
- header:加 -h 参数才会导出的头部文本,改内核 cmdline 只动它。
动手前还要确认一件事:部分新设备采用 vendor boot 方案,ramdisk 放在独立的 init_boot 或 vendor_boot 分区,解包对象要选对。启动方式的差异见:
docs/boot.md
Magisk 管理器首页也能直观看到当前设备的 ramdisk 状态:
🔁 最小闭环:unpack 解包与 repack 重打包
先跑通这两条命令,后面所有任务都是它们的变体:
./magiskboot unpack -h boot.img ./magiskboot repack boot.img第一条把 boot.img 拆成当前目录下的组件文件,-h 额外导出可编辑的 header 文本;第二条把目录里的组件按原镜像的格式装回去,不指定输出名时默认生成 new-boot.img。
解包后目录里会出现这些组件:
| 组件文件 | 里面装的是什么 | 常见改动场景 |
|---|---|---|
| kernel | 已解压的内核镜像 | 一般不动 |
| ramdisk.cpio | 开机初期内存文件系统的 CPIO 归档 | 注入脚本、增删文件 |
| header | 头部信息的文本形式 | 改内核 cmdline |
| dtb、recovery_dtbo | 设备树,设备相关 | 移除 verity 校验节点 |
| second、extra | 少见区段 | 基本不动 |
这里有一条铁律:repack 的第一个参数必须是当初解包的那个原始镜像。工具要读它的头部当模板,拿错参照物,产出的镜像大概率点不亮。
两个补充参数:-n 在 unpack 时跳过解压、在 repack 时跳过压缩,按原始字节进出。除非你清楚自己在干什么,否则别加。完整命令与参数说明:
docs/tools.md
📋 任务菜单:四个高频改动一次做完
每个任务都按"目标 → 命令 → 验证 → 刷回"四步走,命令块里只放最小必要操作。
任务 1:给内核 cmdline 追加参数
目标:调整内核启动参数(比如改 loglevel、加调试项),全程不碰任何二进制。
命令:
./magiskboot repack boot.img cmdline-boot.img先用任意文本编辑器打开 header 文件,在 cmdline= 行的行尾追加参数,再执行上面的重打包,第二个参数是新镜像的自定义文件名。header 里的 kernel_size、ramdisk_size、page_size、header_version 不要手填,重打包时工具会按实际组件大小自动回填。
验证:对新镜像重新执行 unpack -h,打开 header 确认 cmdline 行已包含你的参数。
刷回:用 fastboot 将新镜像刷入对应分区。
任务 2:向 ramdisk 注入一个开机脚本
目标:让设备开机时执行你自己的脚本,注入对象是 ramdisk.cpio。
命令:
./magiskboot cpio ramdisk.cpio extract ./magiskboot cpio ramdisk.cpio "add 0755 init.d/00_myboot.sh myboot.sh" ./magiskboot repack boot.img myboot-boot.imgextract 先把归档摊开看看现状;add 的格式是"权限 归档内路径 本地文件",这里给脚本 0755 权限并放进 init.d 目录;最后装回镜像。cpio 的每条子命令都要用引号包成单个参数,修改是原地进行的。
验证:执行./magiskboot cpio ramdisk.cpio "exists init.d/00_myboot.sh",返回 0 表示文件已在归档内。
刷回:刷 boot 分区。脚本路径与权限要贴合设备 init 的挂载习惯,目录结构保持干净。
任务 3:从 DTB 移除 verity/AVB 校验节点
目标:部分设备把完整性校验写在设备树的 fstab 节点里,用 patch 动作把它们从 dtb 文件中原地删掉。
命令:
./magiskboot dtb dtb print -f ./magiskboot dtb dtb patch ./magiskboot repack boot.img noavb-boot.imgprint -f 只打印 fstab 节点,先确认确实存在 verity/avb 相关属性;patch 直接在文件上改,改完再重打包。
验证:再次 print -f,对比 patch 前后的输出,校验条目应当消失。
刷回:刷 boot 分区;设备若依赖 AVB 校验,vbmeta 要一并处理,见下节排障表。
任务 4:一条命令从 OTA payload 里取出 boot 分区
目标:手里只有 payload.bin(Google 官方 OTA 更新包的载荷文件),想拿到里面的 boot.img。
命令:
./magiskboot extract payload.bin ./magiskboot extract payload.bin boot my_boot.img不指定分区时,工具会尝试提取 init_boot 或 boot,产物文件名即对应分区的 .img;第二条显式指定分区与输出文件。版本过旧的 payload 可能不支持 extract,届时换新版工具。
验证:对提取出的镜像执行 unpack,返回 0 表示结构正常。这一步只是取件,无需刷回。
🛡️ 安全性答疑:沿用模板重打包,凭什么不会弄坏启动
问:往一个精心对齐的镜像里塞东西,凭什么安全?答:MagiskBoot 不是重建镜像,而是沿用模板。repack 读取原始镜像的头部作参照,区段布局与压缩格式全部照搬,只更新必须变的字段。
问:具体哪些字段会变?答:各区段的大小与校验和。组件无论增删多少,工具都重新计算并回填这两类字段,其余保持原值,所以刷回后引导流程与原版一致。
问:MTK(联发科)设备的额外头部为什么要不了我操心?答:工具按魔数自动识别。MTK 镜像的 kernel 与 ramdisk 前各带一段私有头,解包时识别并剥离,重打包时原样写回,全程无需手动干预。
问:-n 到底在干什么?答:跳过压缩或解压,按原始字节导出或打包。它省掉编解码,但也跳过了格式还原,只有明确知道镜像内部状态时才该使用。
🩺 排障速查:症状、原因与处置一表看懂
| 遇到什么 | 判断依据 | 怎么办 |
|---|---|---|
| 刷入后卡在 logo | repack 参照了错误的原始镜像 | 第一个参数换回当初解包的镜像,重做一遍 |
| 刷入后无法启动 | 当前目录混入无关残留文件 | 先执行 ./magiskboot cleanup 清理,或换干净目录重做 |
| A/B 设备验证失败 | 刷错槽位或漏处理 vbmeta | 核对槽位与校验流程,见下方官方文档 |
| 普通 AOSP 镜像 | 头部魔数为 ANDROID! | 标准流程,无特殊处理 |
| MTK 设备镜像 | 解包时识别出 MTK 私有头 | 无需处理,工具自动识别并原样保留 |
| ramdisk 不在 boot 分区 | 解包 boot 后目录里没有 ramdisk.cpio | 设备使用 vendor_boot/init_boot,改解包对应分区;解包返回 3 即表示 vendor_boot 结构 |
| ChromeOS 镜像 | unpack 返回值为 2 | 属正常识别,此类镜像需外部签名流程 |
| 旧版 OTA 提取失败 | extract 报错 | 换新版 magiskboot,或手动拆包 |
A/B 槽位与三星设备的刷写细节:
docs/install.md
动手前把原始 boot.img 备份一份,每次改动单独产出一个命名清晰的新镜像(cmdline-boot.img、myboot-boot.img),出问题随时能装回原版。
完整命令参考:
docs/tools.md
【免费下载链接】MagiskThe Magic Mask for Android项目地址: https://gitcode.com/GitHub_Trending/ma/Magisk
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考