小米 13 从国行 HyperOS 解锁 BL、刷入 LineageOS 与 KernelSU
本文记录一台国行小米 13 的实际操作:进入高通 9008 模式,借助紫罗兰工具箱备份和刷写分区,解锁 Bootloader,恢复官方系统,再安装 LineageOS、Google 套件和 KernelSU。
本次设备和结果
| 项目 | 本次情况 |
|---|---|
| 设备 | 小米 13 国行,型号 2211133C,代号 fuxi |
| 原系统 | HyperOS 3.0.309.0.WMCCNXM |
| 原安全补丁 | 2026-08-01 |
| 存储 | UFS |
| Bootloader 初始状态 | 未解锁 |
| 目标系统 | LineageOS 24.0,Android 17,20261026 nightly |
| Root | KernelSU 3.3.1,LKM 模式 |
准备文件
| 文件或工具 | 用途 | 来源 |
|---|---|---|
| Android SDK Platform-Tools | adb、fastboot | Android 官方下载 |
| 紫罗兰工具箱 V3.7 | 9008 分区表读取、备份、回读和刷写 | V3.7.0 发布包,SHA-256 3fa017c4f79568766a83b6ca79ea89a1c3ef66bae4d2a4f21a632a64205403b6,与本地文件一致 |
google_fastboot_driver_2016.cab | Google Android USB 驱动;INF 版本 11.0.0000.00000,日期 2016-08-28 | Microsoft Update Catalog 下载,SHA-1 58efff824f4c9455498f94b08e96b26d0a632963 |
qualcomm_qdloader_9008.cab | Qualcomm QDLoader 9008 驱动;INF 版本 2.1.1.0,日期 2014-01-25 | Microsoft Update Catalog 下载,SHA-1 dae427ffe0a2d6268aa209d782d05ea874aad0dc;目录记录 |
8gen2/xiaomi_8550_firehose_noauth.melf | 本机 9008 Firehose programmer | |
Mi8g2-unlock-v114514.rar | 小米 13 解锁 GPT 和 8550-Ennea.img | Mi8G2-Unlocker v114514 发布包,SHA-256 e2ac1d1f6c9b33bc74fc8761d96a4591e4f96dec72abadc6d9ba2278e9953b4f,与本地压缩包一致 |
Mi13_ENG_FIX_research.7z | 工程系统镜像和工程 ABL | xiaomi_eng_rom 发布包,SHA-256 f5c9bffc5fda21d55a400c2794391b19e3db576d08e2b6927c2c31dad45a67a5,与本地压缩包一致 |
Mi13-reference.elf | 工程 ABL 的独立比对样本,未刷写 | xiaomi_ubl 仓库,SHA-256 c3056927bc0502b02aa6dac86576a6a438968f3175fd53a04063367977c54e76 |
fuxi_images_OS3.0.309.0.WMCCNXM_20260826.0000.00_16.0_cn_669d2b2234.tgz | 小米 13 国行官方 Fastboot 包 | 小米 CDN,索引 MD5 669d2b22347cc981355e495c98a9d81f,本地 MD5 校验通过 |
OS3.0.307.0.WMCCNXM OTA 固件 | LineageOS 24.0 所需底层固件 | LineageOS fuxi 固件指南;小米 OTA 文件 |
| Payload Dumper Go 2.1.0 | 从 LineageOS payload 提取固件镜像 | GitHub Release |
lineage-24.0-20261026-nightly-fuxi-signed.zip 和对应镜像 | LineageOS 与 Recovery | fuxi 官方下载页 |
MindTheGapps-17.0.0-arm64-20261022_132445.zip | Google 套件 | GitHub Release,SHA-256 a6844eeb2613541558237e467b20feb01f8b45b2ebab0109834140ea59b6ca4d |
KernelSU_v3.3.1_32680-release.apk | KernelSU 管理器 | GitHub Release,SHA-256 b4a059ace71de2fa65cc7f12b1c58d55fc23ab25e057ee4230ce779742abe450 |
还需要一台 Windows 电脑、正常的数据线和能使设备进入 9008 的工程线。工程线的作用是触发进入 EDL。本次 noauth programmer 能在这台手机上完成 Sahara/Firehose 通信。
刷机原理:启动链、9008 与解锁状态
本次解锁经过 EDL 和 Fastboot 两套环境。前者用于读取、修改 UFS 分区,后者用于执行后续解锁流程。以下结合实际日志说明各阶段的作用,以及它们与 Android 启动机制的关系。
启动链与权限边界
高通平台的正常启动流程可以简化为 PBL(Primary Boot Loader / Boot ROM)→ XBL(eXtensible Boot Loader)及相关安全固件 → ABL(Android Bootloader)→ Linux 内核和 Android 用户空间。实际启动过程还会加载 TrustZone 和其他处理器子系统的固件,各组件有各自的初始化与校验步骤。
PBL 位于 SoC 内部,负责早期引导以及验证、加载下一阶段代码。Qualcomm Secure Boot 利用硬件信任根和签名验证约束早期固件;ABL 则负责启动 Android,并在其实现的 Fastboot 接口上落实刷写权限。这里有三种经常混淆的状态:
| 层次 | 主要约束 | 本次操作涉及的变化 |
|---|---|---|
| Qualcomm Secure Boot | 早期固件能否被信任并执行 | 本机成功运行工程 ABL,早期固件仍受芯片启动链约束 |
| Android Bootloader 锁与 AVB | 能否刷入、启动非原厂认可的 Android 镜像 | 解锁后允许刷入 LineageOS;解锁状态与 AVB 验证策略有关 |
| Android / Linux Root | Android 启动后进程能否取得特权 | 通过 KernelSU 在系统启动后提供受控的超级用户权限 |
AVB(Android Verified Boot)使用 vbmeta 中的验证元数据、签名和哈希链检查相应 Android 分区。按照 AOSP 的设备状态说明,解锁设备可以启动未由原厂信任根认可的系统;Boot flow 文档将这类设备的 Verified Boot 状态标记为 orange。早期固件的签名验证仍属于 Qualcomm Secure Boot,Android 应用的 Root 权限则由系统启动后的权限管理机制控制。
EDL 与 Fastboot 的分工
Fastboot 通常由 ABL 提供,其允许的写入和启动操作受 Bootloader 当前策略限制。EDL(Emergency Download Mode,常称 9008)则是 Qualcomm 的底层紧急下载路径,可以在 Android 和正常 ABL 尚未运行时与设备通信。工程线用于触发这一模式;Windows 将该下载接口识别为 Qualcomm HS-USB QDLoader 9008,由对应驱动建立通信。
本次 EDL 通信分为两个阶段。电脑先通过 Sahara 与设备握手,并传输设备接受的 Programmer;随后由运行在手机端的 Firehose Programmer 处理 UFS 查询及分区读写请求。紫罗兰工具箱负责电脑端的 COM 口选择、引导发送、命令组织与文件保存。源码中可以看到 EDL/Firehose 相关组件及 QSaharaServer.exe、fh_loader.exe 的处理逻辑。
本次使用的 Programmer 是 xiaomi_8550_firehose_noauth.melf。加载 Programmer 时的签名校验,与运行后执行分区操作所需的厂商授权,属于两个环节。该文件在本机成功完成 Sahara/Firehose 通信,并提供了 GPT 和相关分区的读写能力。文件名中 noauth 对应的具体授权机制仍待研究。
UFS LUN、GPT 与原机备份
UFS 可以向主机提供多个逻辑单元(LUN),一个物理存储芯片因而可能表现为多个逻辑块设备。本次工具解析了 LUN0~LUN5 的 GPT,共显示 129 个分区;LUN6、LUN7 在本次读取中被跳过。
GPT 保存分区条目的名称、起止 LBA、GUID 和属性等布局信息;分区实际内容存放在对应的存储扇区。修改 GPT 可能改变后续程序访问的扇区范围。GPT 通常有主表和备用表,恢复时需要按照原机布局处理两份数据并回读核对。
本次备份了工具箱生成的 GPT、基带相关分区,以及 xbl_a/b、xbl_config_a/b、abl_a/b。在写入工程 ABL 后又检查了物理 LUN,并准备 LUN4 的主、备 GPT 恢复文件。恢复时使用本机生成的 rawprogram4.xml 和相应的 20 KB 数据文件,随后回读并逐字节比较。恢复文件的扇区位置取自本机存储布局。
本次通过 fastboot flash partition:4 unlockgpt_both4.bin 写入 LUN4 的解锁 GPT。这是当前 Fastboot 环境提供的特殊操作;后续恢复原 GPT 时,则使用 Firehose 按 rawprogram4.xml 指定的扇区位置写回数据。两个步骤分别由 Fastboot 和 EDL 执行。
工程 ABL、解锁 GPT 和 Ennea 分别做了什么
原厂 ABL 在锁定状态下会限制部分 Fastboot 操作;这次先通过 EDL 把小米 13 对应的工程 abl.elf 写入 abl_a、abl_b,并回读确认两槽内容与所选镜像一致。重启后,工程 ABL 提供了执行后续解锁命令所需的 Fastboot 环境。正式解锁状态在运行 Ennea 后检查。
进入新的 Fastboot 环境后,流程再写入 unlockgpt_both4.bin,并通过 fastboot boot 8550-Ennea.img 将解锁镜像临时加载到内存中启动。随后运行 fastboot oem device-info 和 fastboot getvar unlocked 检查状态,本次得到了 Device unlocked: true、Device critical unlocked: true 和 unlocked: yes。
待研究: 对比 unlockgpt_both4.bin 与原机 GPT 的条目、GUID 和属性,确定哪些改动参与解锁;分析 8550-Ennea.img 的启动内容及其修改解锁状态的过程。
恢复原机 LUN4 主、备 GPT,刷回官方固件并正常启动以后,设备仍保持解锁。这次流程中,解锁 GPT 只用于临时解锁阶段。AOSP Bootloader 解锁规范要求解锁模式跨重启保留;具体的持久化机制由设备实现。
待研究: 小米 13 将解锁状态保存在何处,ABL 如何读取这一状态;工程 ABL 和 Ennea 的签名要求、版本兼容条件。
恢复官方系统与安装 LineageOS
恢复原机 GPT 之后再刷回官方 Fastboot 包,是为了退出临时的工程环境,回到可确认的分区布局和固件组合。此时需要避免任何会重新上锁的脚本;在安装自定义系统后贸然回锁,还可能使启动校验失败。
Android 的 A/B 槽位允许更新程序在当前系统运行时更新另一个槽位。像 abl_a/abl_b、init_boot_a/init_boot_b 这样的成对分区,各自与对应的启动槽位关联。给两个 ABL 槽位写入工程镜像,是为了防止切换槽位后又运行原厂 ABL;恢复和升级时也要核对两个槽位及固件版本。
LineageOS 安装包与 Qualcomm 底层固件各有版本要求。xbl、abl、tz、modem、dsp 等镜像分别服务于启动、安全、通信和其他子系统,因此在刷入 Android 系统前,需要满足该机型维护者指定的固件版本。本次从 LineageOS 包的 payload 中提取 20 个镜像,并与小米官方 OS3.0.307.0.WMCCNXM OTA manifest 的长度和 SHA-256 逐项核对。固件版本按 LineageOS 维护者的要求选择,镜像内容通过哈希确认一致。
安装时分别刷入 boot、init_boot、dtbo、vbmeta、vendor_boot 和 recovery,因为内核、早期启动资源、设备树 Overlay、AVB 元数据和恢复环境承担不同工作。随后在 Recovery 中通过 ADB sideload 安装系统与 GApps。本次电脑侧 sideload 进度停留在约 47%,Recovery 显示安装完成,因而以设备端结果为准。
KernelSU 为什么修补 init_boot
Android 13 出厂设备把通用 ramdisk 从 boot 拆分到 init_boot,参见 AOSP 的 Generic boot 说明。KernelSU 的 LKM 安装方式通过修改 ramdisk,在后续启动时安排内核模块加载,并保留当前设备的内核。本机因此修补了当前 LineageOS 构建的 init_boot.img。具体差异见 KernelSU 安装文档。
KMI(Kernel Module Interface)约束内核与模块的兼容性。选择 KMI 时应查看实际内核版本。本机运行 Android 17,内核为 5.15.220-gf9ca2b71f672,因此选择 android13-5.15。当前槽位为 b,所以将补丁写入 init_boot_b。经 KernelSU 授权后,adb shell su -c id 返回 uid=0(root),确认 ADB Shell 成功获得 Root 权限。
这也解释了后续 OTA 的注意事项:A/B 更新可能切换槽位并替换 init_boot,KernelSU LKM 的修补需要随新镜像处理。日常使用内置更新程序后,要重新确认新槽位的 Root 状态。
1. 打开开发者选项和 USB 调试
在 HyperOS 的「设置 → 我的设备 → 全部参数与信息」里连续点击系统版本,打开开发者选项。然后进入「设置 → 更多设置 → 开发者选项」,打开「USB 调试」和「OEM 解锁」。手机连接电脑后,在手机上允许 USB 调试授权。
在 Platform-Tools 目录打开终端,检查连接和原始安全补丁:
adb devices
adb shell getprop ro.build.version.security_patch
adb reboot bootloader
fastboot devicesadb devices 应显示 device;若显示 unauthorized,检查手机上的授权弹窗。最后两行用于进入并确认 Fastboot,返回系统可以使用 fastboot reboot。
2. 安装 Windows 驱动
本次分别准备了两类驱动:
- ADB/Fastboot 驱动:在设备管理器中对手机设备选择「更新驱动程序」,浏览到解压后的 Android USB 驱动目录;进入 Fastboot 后确认电脑能够识别 Android Bootloader Interface,并运行
fastboot devices。 - Qualcomm 9008 驱动:手机进入 9008 后,在设备管理器中为相应设备选择解压后的 QDLoader 驱动目录。本次识别为
Qualcomm HS-USB QDLoader 9008 (COM口)。COM 号会随电脑和连接情况变化。
本机 Google 驱动的 android_winusb.inf 标注 Provider 为 Google,包含 Android Bootloader Interface,版本日期为 2016-08-28。
QDLoader 包的 qcser.inf 标注 Qualcomm Incorporated,版本 2.1.1.0,日期 2014-01-25,硬件 ID 为 USB\VID_05C6&PID_9008。
3. 工程线进入 9008,读取分区表
手机关机,使用工程线触发 9008,具体按工程线的接法和操作说明连接。设备管理器出现 QDLoader 9008 后,打开紫罗兰工具箱的 EDL 刷写页面:
- 选择对应 COM 口。
- 选择本次使用的
xiaomi_8550_firehose_noauth.melf作为引导文件。 - 发送引导并读取分区表。
日志显示 Sahara 版本 3、引导发送完成,随后识别出 UFS;LUN0~LUN5 的 GPT 解析成功,共识别 129 个分区,LUN6、LUN7 被跳过。
Firehose programmer 是在设备端运行的二进制引导程序。选择时需要核对机型和授权状态。
4. 备份 GPT、基带和引导链
在紫罗兰工具箱保持 Firehose 会话,依次执行:
- 「备份 GPT」,保存各个已识别 LUN 的 GPT 和生成的 XML。
- 「备份基带指纹」,本次回读了
persist、modemst1、modemst2、fsg、fsc五个分区。 - 在分区列表中勾选并回读
xbl_a、xbl_b、xbl_config_a、xbl_config_b、abl_a、abl_b。
备份位于电脑的 Xiaomi13_9008_Backup 目录。检查日志和输出文件的大小,确认每个分区都已读出。原始引导链备份是在写入工程 ABL 之前取得的。
工具箱的「备份 GPT」主要生成主 GPT 文件。为恢复 LUN4,还需要保存并核对原机的备用 GPT 和相关扇区。写入工程 ABL 后,又回读了物理 LUN1~LUN5,并为 LUN4 准备主、备 GPT 恢复文件;原厂 ABL 使用此前单独回读的备份。
5. 写入工程 ABL 并解锁 BL
本机安全补丁晚于 Mi8G2-Unlocker 原脚本说明的 2026-02-01 范围,因此没有直接使用它基于旧系统漏洞写 ABL 的自动流程;本次是在 9008 下用紫罗兰工具箱写入对应机型的工程 ABL,再使用其后续解锁资源。
- 选择 Xiaomi 13 对应的
abl.elf。工程 ABL 按机型区分。 - 在紫罗兰工具箱分别将它写入
abl_a、abl_b。 - 分别回读两个分区,和所选工程
abl.elf比较。两份回读均与 216888 字节的镜像逐字节一致后才继续。 - 将设备重启到 Fastboot,确认
fastboot devices能识别。 - 按解锁包中 Xiaomi 13 对应资源,写入 LUN4 解锁 GPT,并临时启动解锁镜像:
fastboot flash partition:4 "<Xiaomi13解锁资源目录>\unlockgpt_both4.bin"
fastboot boot "<解锁资源目录>\8550-Ennea.img"这里使用的是小米 13 的 partition:4 和解锁 GPT。解锁后按屏幕提示重新进入 Fastboot,检查 BL 状态:
fastboot oem device-info
fastboot getvar unlocked本次确认 Device unlocked: true、Device critical unlocked: true,以及 unlocked: yes。
6. 恢复原机 LUN4 GPT 和官方系统
解锁包提供的 GPT 与本机原 GPT 存在 GUID 和属性差异。重新进入 9008 后,用紫罗兰工具箱和为本机生成的 rawprogram4.xml,分别恢复先前保存的 LUN4 主 GPT 和备用 GPT,再回读并与恢复文件逐字节比较,确认一致。
恢复文件保存在 Xiaomi13_9008_Backup/LUN4_recovery/。每份 GPT 文件为 20 KB,XML 中的 LUN、扇区大小和起始扇区取自这台手机的实际布局。恢复 GPT 需要使用原机备份,并按设备布局确定扇区位置。
之后本次先刷入小米 13 工程包对应镜像,再刷回国行官方 Fastboot ROM OS3.0.309.0.WMCCNXM,启动到欢迎界面。官方包使用保持 BL 解锁的刷写方式;不要选择带回锁的脚本。实际官方恢复过程保存在 Xiaomi13_9008_Backup/stock_restore_log.txt。
恢复官方系统后的初始设置曾在设置屏幕密码时提示登录原 Google 账号,可以跳过密码设置。刷机前妥善处理原账号可以减少 FRP 相关问题;本次没有执行清除 FRP 的操作。
7. 准备 LineageOS 所需固件
本次 fuxi 安装指南要求 LineageOS 24.0 使用固件 OS3.0.307.0.WMCCNXM。此前恢复的是 3.0.309.0,所以还需要调整固件版本。指南会更新,操作前应重新检查要求。
从 LineageOS 安装包的 payload 中提取了 20 个固件镜像,逐个比较官方 3.0.307.0 OTA manifest 中的长度和 SHA-256,确认一致后按官方固件步骤刷入,省去了完整 OTA 包的下载。复现时也可以直接使用指南指定的官方固件包。
实际刷入了 abl、aop、aop_config、bluetooth、cpucp、devcfg、dsp、featenabler、hyp、imagefv、keymaster、modem、qupfw、shrm、tz、uefi、uefisecapp、xbl、xbl_config、xbl_ramdump 的 _ab 目标。逐条确认 OKAY,中途失败就停止;日志为 lineageos/firmware_install_log.txt。
8. 刷入 Lineage Recovery 和系统
下载同一构建对应的 boot.img、dtbo.img、init_boot.img、vbmeta.img、vendor_boot.img 和 recovery.img。在镜像所在目录进入 Fastboot,按官方指南逐条执行:
fastboot flash boot boot.img
fastboot flash dtbo dtbo.img
fastboot flash init_boot init_boot.img
fastboot flash vbmeta vbmeta.img
fastboot flash vendor_boot vendor_boot.img
fastboot reboot bootloader
fastboot flash recovery recovery.img每一步都确认成功。刷入 Recovery 后直接进入 LineageOS Recovery:关机状态按住音量上和电源键;如果无法关机,可从 Fastboot 长按按键组合,屏幕变黑并出现小米标志时松开电源键,继续按音量上。不要先启动旧系统,以免 Recovery 被覆盖。
在 Recovery 中:
- 选择「Factory reset → Format data / factory reset」,完成后返回主菜单。
- 选择「Apply update → Apply from ADB」,电脑执行:
adb sideload lineage-24.0-20261026-nightly-fuxi-signed.zip- 手机提示是否重启到 Recovery 以安装附加包时,选择 Yes。电脑端进度停在约 47% 时,查看手机 Recovery 上的安装结果。
- 回到 Recovery 后再次选择「Apply update → Apply from ADB」,安装 Google 套件:
adb sideload MindTheGapps-17.0.0-arm64-20261022_132445.zipGoogle 套件使用独立签名,本次提示 Signature verification failed 后选择 Install anyway,安装完成回到 Recovery 主菜单。LineageOS 系统包自身若签名验证失败,则应重新检查文件。
Google 套件必须在 LineageOS 第一次启动之前安装。全部完成后选择「Reboot system now」,本次成功进入 LineageOS 桌面。
9. 安装 KernelSU
在 LineageOS「设置 → 关于手机」连续点击版本号开启开发者选项,打开 USB 调试并允许电脑授权。安装 KernelSU Manager:
adb install KernelSU_v3.3.1_32680-release.apk
adb push init_boot.img /sdcard/Download/这里使用当前 LineageOS 构建对应的原始 init_boot.img。本机内核为 5.15.220-gf9ca2b71f672,在 Manager 里选择 LKM 模式,手动选择 android13-5.15 KMI,再选择刚才传入的镜像修补。KMI 应结合设备内核判断,名称中的 Android 版本与当前系统版本可能不同。
将 Manager 生成的补丁镜像从手机 Download 目录取回电脑,确认文件名后进入 Fastboot,先检查当前槽位:
adb reboot bootloader
fastboot getvar current-slot本次当前槽位为 b,因此只写入 init_boot_b:
fastboot flash init_boot_b "<KernelSU修补后的init_boot镜像路径>"
fastboot reboot每次刷入时按实际活动槽位和当前系统构建选择镜像。重启后,KernelSU Manager 显示 工作中 LKM 32680-5。
验证时先在 KernelSU Manager 的超级用户列表中允许 ADB Shell,再执行:
adb shell su -c id本次返回 uid=0(root),确认 root 可用。完成调试后可以撤销 Shell 的 root 授权,需要时再开启。
后续更新与留存
同一 LineageOS 版本的 nightly 可以在「设置 → 系统 → 更新程序」下载和安装。使用内置更新程序有助于保留 Google 套件。由于本机 KernelSU 修补了 init_boot,OTA 后 root 可能需要重新安装;可在更新安装完成、重启前参考 KernelSU 官方说明使用「安装到非活动槽位」,重启后检查 Manager 状态。跨 LineageOS 大版本时重新阅读 fuxi 的升级指南和固件要求。
保留原始 GPT、基带、引导链备份,保留当前构建的原始 init_boot.img 和刷机日志,并将备份复制到另一块存储设备。设备已解锁且运行第三方系统,不应直接使用回锁脚本。