MagiskBoot 完整指南:如何快速解包与重打包 Android 启动镜像 boot.img
【免费下载链接】MagiskThe Magic Mask for Android项目地址: https://gitcode.com/GitHub_Trending/ma/Magisk
MagiskBoot 是 Magisk 的命令行工具,专门用来安全地解包与重打包 Android 启动镜像 boot.img(开机时加载内核和初始文件系统的镜像)。想改内核参数、往 ramdisk 里注入脚本、或移除设备树中的校验节点,用它拆包改包即可,不用手工编辑十六进制,也不必担心把镜像改坏。
🚀 一条命令解包与重打包 boot.img
先从一个真实需求切入:你想给内核加一个调试用的 cmdline 参数(传给内核的启动命令行)。
整个过程只需要两条核心命令:
./magiskboot unpack -h boot.imgunpack会把镜像里的每个区段拆成独立文件放到当前目录,-h额外把头部信息导出成文本文件 header(重打包时它用来回写你改过的配置)。
改完文件后,再执行:
./magiskboot repack boot.img cmdline-boot.imgrepack以当初解包的那个原始镜像作参照,按它的头部结构重新装回所有组件;第二个参数是输出文件名,不指定时默认为 new-boot.img。注意第一个参数千万别填错——参照镜像必须是 boot.img 本身。
解包后的产物与对应改动:
| 产物文件 | 里面是什么 | 常见改法 |
|---|---|---|
| kernel | 解压后的内核镜像 | 基本不动 |
| ramdisk.cpio | 初始文件系统,CPIO 归档 | 注入脚本、增删文件 |
| header | 头部文本(仅-h生成) | 改内核 cmdline |
| dtb / recovery_dtbo | 设备树,并非每款设备都有 | 移除 verity/avb 校验 |
| second / extra | 少数镜像才有的附加区段 | 保持原样 |
改动只针对你要碰的那个区段,其余文件原封不动,repack 才会产出正确的结果。
✏️ 内核参数、ramdisk 脚本与设备树,三种改法
三类组件的改法各不相同,但思路一致:解包后改文件,repack 回写。
一条命令修改内核 cmdline
改内核参数不碰任何二进制,编辑 header 文本即可:
# 编辑 header,在 cmdline= 行末尾追加参数 ./magiskboot repack boot.img cmdline-boot.img比如给 cmdline 末尾加上loglevel=8。header 里的 kernel_size、ramdisk_size、page_size 这类字段不要手改,repack 会按实际组件大小自动回填。
启动镜像注入脚本:改 ramdisk.cpio
cpio子命令直接原地修改归档,支持 add、rm、mkdir、ln、mv、extract、test 等操作,每条命令用引号包成单个参数:
./magiskboot cpio ramdisk.cpio extract ./magiskboot cpio ramdisk.cpio "add 0755 init.d/00_my_script.sh my_script.sh" ./magiskboot repack boot.img myscript-boot.imgadd的第一个参数是权限(这里是可执行的 0755),第二个是镜像内路径,第三个是本机源文件。若同名条目已存在会被直接替换,改完 repack 生效。
设备树移除 avb 校验:dtb patch 原地打补丁
部分设备把完整性校验写在设备树的 fstab 节点里,dtb子命令直接在文件上操作:
./magiskboot dtb dtb print -f ./magiskboot dtb dtb patch ./magiskboot repack boot.img noavb-boot.imgprint -f只打印 fstab 节点,先确认里面有没有 verity/avb 属性;patch找到 fstab 后原地移除 verity/avb 条目,无需手工解析设备树格式。
🔍 用过之后再认识:定位、extract 与 -n
现在补上工具背景。magiskboot 是 Magisk 四个核心二进制之一(其余是 magisk、magiskinit、magiskpolicy),专职启动镜像的解包/重打包,顺带做 CPIO 与 DTB 操作,以及多格式压缩解压。
它内置支持 gzip、lz4(含只在 LG 机型上出现的 lz4_legacy 与 lz4_lg 变体)、lzma、xz、bzip2——解压缩全在工具内部完成,不依赖系统外部工具,所以同一台机器处理不同设备的镜像不会踩坑。
如果手上没有现成 boot.img,只有 OTA 升级包的 payload.bin(OTA payload 提取 boot 就走这条路),extract子命令可以直接取出分区:
./magiskboot extract payload.bin ./magiskboot extract payload.bin boot my_boot.img不指定分区时,它自动在 init_boot 和 boot 之间选一个,输出名由此决定;也可以像第二行那样显式指定分区和输出文件。
两个进阶入口:
-n:unpack 带上它则跳过解压、按原格式原样导出;repack 带上它则跳过压缩。除非你清楚自己在干什么,否则别加。cleanup:清理当前工作目录的解包残留,适合改乱了重做(./magiskboot cleanup)。
完整的命令清单(含 hexpatch、sign、verify、compress 等)见 官方工具文档。
为什么这样改不会刷坏:原位替换
原理很简单:repack不是重建镜像,而是原位替换。
重打包时,工具把原镜像头部当模板:页大小、格式、区段布局一律沿用,只更新组件大小、校验和这类必须变的字段,各组件再按原压缩格式压回去。因此刷回设备后,引导流程与原版完全一致——这也是"拆得开、装得回"的原因。设备启动方式(ramdisk 在 boot 还是 recovery)的差异,见 docs/boot.md。
⚠️ 刷坏前的自查清单
出问题大概率是下面三类原因:
| 症状 | 原因 | 怎么处理 |
|---|---|---|
| 镜像直接损坏 | repack 第一个参数填了别的镜像 | 参照镜像必须是你解包的那个原始 boot.img |
| 镜像包含多余文件 | 目录里有上次解包的残留 | repack 会把当前目录组件全打进去,先./magiskboot cleanup或换干净目录 |
| 卡在开机画面 | A/B 设备刷错槽位,或漏刷 vbmeta | 参考 docs/install.md 的 A/B 与三星设备章节 |
养成两个习惯:每次改动单独产出一个命名清晰的新镜像(cmdline-boot.img、myscript-boot.img),出问题时装回原版;刷写前务必备份原始 boot.img。
厂商格式差异一览:
| 格式 | 怎么认出来 | 你需要知道的事 |
|---|---|---|
| AOSP 标准 | 头部魔数ANDROID! | 最常见,无特殊处理 |
| MTK(联发科) | kernel/ramdisk 内多一层 MTK 头 | 工具自动识别并原样保留,重打包不用管 |
| vendor boot | 独立vendor_boot分区 | ramdisk 在这里,解包 vendor_boot 而不是 boot |
| ChromeOS | 特定签名结构 | unpack 返回 2 即表示识别为 chromeos,属正常现象 |
| 过旧的 OTA | extract解不出分区 | 换新版 magiskboot,或手动拆包 |
MagiskBoot 把"改启动镜像"从手写解析器变成了解包、改文件、重打包三步。记住它保留了什么、只改了什么,再坚持刷写前备份,你就可以放心上手了。
【免费下载链接】MagiskThe Magic Mask for Android项目地址: https://gitcode.com/GitHub_Trending/ma/Magisk
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考