1. 刷机卡Fastboot这件事,到底卡在了哪里
小米和红米手机的用户群体里,玩机刷机的比例一直不低。不管是想降级回老版本系统、刷第三方ROM,还是手机变砖之后自救,线刷几乎是绕不开的一步。但很多人第一次遇到的情况是:照着教程一步步操作,手机进入了Fastboot界面,插上数据线,电脑上脚本也跑了,结果屏幕上的小米兔子一动不动,命令行窗口里刷机进度条卡在某个位置再也不动,或者干脆报错退出。反复重试、换线、换USB口、换电脑,折腾几个小时甚至一整天,手机还是那个Fastboot界面。
这个问题不是个例。在各大数码社区和玩机群里,关于“小米刷机卡Fastboot”的求助帖几乎每天都有。而其中相当一部分案例,根源并不在数据线、驱动或者手机硬件,而在于官方线刷脚本本身没有适配你手上这台机器的分区结构。
具体来说,近几年发布的小米和红米机型,大量采用了VAB(Virtual A/B)分区和AB分区方案。传统的线刷脚本是按照老式A-only分区、单一super分区的逻辑写的,刷到新机型上就会出现分区找不到、镜像写入地址错位、刷写顺序不对等问题。表现就是卡在Fastboot界面,或者刷到某个分区时直接报错。
这篇文章就是围绕这个核心问题展开的。我会从分区结构的基础讲起,把VAB和AB分区的差异说清楚,然后手把手带你修改官方线刷脚本,让它在你的机器上能正常跑完。同时也会覆盖GPT分区表相关的注意事项、fastboot传文件到手机的正确姿势、驱动安装的坑,以及一些常见报错的排查思路。不管你是第一次刷机的新手,还是刷过几台机器但被VAB搞懵的老玩家,应该都能从里面找到能直接用的东西。
注意:刷机有风险,操作前务必备份好个人数据。本文讨论的是基于官方线刷包的脚本修改,不涉及任何非官方渠道或违规内容。
2. 先搞懂分区:A-only、AB分区和VAB到底差在哪
2.1 从A-only到AB分区:安卓分区方案的演进逻辑
早期的安卓手机,系统分区就是一套:boot、system、vendor、recovery等等,各有一份。系统更新的时候,手机需要重启进入recovery模式,把新系统写入这些分区,写入过程中手机是不能正常使用的。这种方案叫A-only,结构简单,但更新体验差,而且一旦写入过程中断电或者出错,手机就可能变砖。
为了解决这个问题,谷歌在安卓7.0时代引入了AB分区方案(也叫A/B seamless update)。核心思路是:手机里有两套完整的系统分区,一套叫slot A,一套叫slot B。当前运行的是A,系统更新的时候把新系统写入B,写完之后重启切换到B,A就变成了备用。这样更新过程完全在后台进行,用户该干嘛干嘛,重启一下就用上新系统了。而且如果B启动失败,还能自动回滚到A,安全性大大提高。
AB分区的代价是存储空间翻倍。系统分区本来就不小,再复制一份,对存储空间是很大的浪费。所以后来谷歌又推出了**VAB(Virtual A/B)**方案,也就是虚拟AB分区。它的思路是:不再物理上保留两套完整分区,而是只保留一套super分区(里面装着system、vendor、product等逻辑分区),更新的时候通过snapshot技术做一份虚拟的快照,写入新数据,重启后切换。这样既保留了AB分区的无缝更新和回滚能力,又节省了存储空间。
2.2 VAB和AB分区在刷机场景下的关键差异
对于日常使用来说,AB和VAB的差异用户基本感知不到。但在刷机场景下,这两者的差异就非常关键了。
AB分区的机器,fastboot刷写的时候需要指定slot。比如fastboot flash boot_a boot.img和fastboot flash boot_b boot.img是分开的。而VAB分区的机器,虽然底层也有slot概念,但很多分区是通过super分区动态管理的,fastboot刷写逻辑和传统AB不完全一样。
更关键的是,小米的官方线刷包(就是那种.tgz格式的完整包)里面包含了一个flash_all.bat(Windows)或flash_all.sh(Linux/Mac)脚本。这个脚本里写死了一系列fastboot命令,指定了要刷哪些分区、刷到哪个slot、按什么顺序刷。如果这个脚本是按照A-only或者早期AB的逻辑写的,刷到VAB机型上就会出问题。
我实测过几台机器,比如Redmi Note系列的一些VAB机型,用官方脚本刷的时候,脚本会尝试刷system分区,但VAB机型上根本没有独立的system分区,system是包含在super分区里的逻辑分区。结果就是fastboot报错“partition not found”,或者脚本跳过某些步骤导致刷完之后无法启动,卡在Fastboot。
2.3 怎么判断自己的手机是哪种分区方案
判断方法其实不复杂,有几种途径:
第一种,看手机型号和发布时间。一般来说,2020年之后发布的中高端小米/红米机型,很多都是VAB。但这不是绝对的,最准确的方法还是实际查看。
第二种,手机能进系统的话,用ADB命令查看。连接手机,开启USB调试,在电脑上执行:
adb shell getprop ro.boot.slot_suffix如果返回_a或_b,说明有slot概念。再执行:
adb shell getprop ro.virtual_ab.enabled如果返回true,那就是VAB。返回false或者空,可能是传统AB或A-only。
第三种,手机已经卡在Fastboot了,可以在Fastboot模式下执行:
fastboot getvar current-slot如果返回current-slot: a之类的,说明有slot。再执行:
fastboot getvar is-userspace以及查看分区列表:
fastboot getvar all在输出里找partition-type:super之类的信息。如果有super分区,基本可以确定是VAB或动态分区方案。
第四种,直接看线刷包里的脚本内容。打开flash_all.bat,看看里面有没有--slot参数,有没有刷super分区的命令,有没有system分区的独立刷写命令。这些都能帮你判断脚本是按哪种分区方案写的。
实操心得:我一般会先用
fastboot getvar all把手机的分区信息全部导出来,存成一个文本文件。这样后面改脚本的时候,对着实际分区列表来改,比凭记忆靠谱得多。这个命令的输出很长,建议重定向到文件里慢慢看。
3. 官方线刷脚本拆解:它到底在干什么
3.1 flash_all脚本的整体结构
小米官方线刷包解压之后,根目录下会有几个关键文件:flash_all.bat、flash_all.sh、flash_all_except_storage.bat、flash_all_lock.bat等等。其中flash_all.bat是最常用的,它会刷写所有分区并清除数据。
打开这个bat文件,你会看到它大致分为几个部分:
第一部分是环境检查和变量定义。它会检查fastboot工具是否存在,定义一些路径变量。
第二部分是刷写前的准备操作。比如fastboot erase一些分区,fastboot set_active切换slot,fastboot reboot-bootloader重启到bootloader等等。
第三部分是核心的刷写命令序列。一条一条的fastboot flash命令,把各个img文件写入对应的分区。
第四部分是刷写后的收尾操作。比如fastboot reboot重启手机,或者fastboot oem执行一些厂商特定的命令。
3.2 脚本里和分区相关的关键命令
脚本里最核心的就是那些fastboot flash命令。我拿一个典型的官方脚本片段举例:
fastboot flash boot boot.img fastboot flash system system.img fastboot flash vendor vendor.img fastboot flash recovery recovery.img这是A-only机型的写法。到了AB分区机型,会变成:
fastboot flash boot_a boot.img fastboot flash boot_b boot.img fastboot flash system_a system.img fastboot flash system_b system.img而VAB机型的脚本,通常会看到:
fastboot flash super super.img fastboot flash boot boot.img fastboot flash vbmeta vbmeta.img注意,VAB机型上,system、vendor、product这些都在super.img里面,不需要单独刷。脚本只需要刷super分区,然后刷boot、vbmeta等独立分区就行了。
如果你拿到的官方脚本是A-only版本的,但你的手机是VAB,脚本就会尝试刷system分区,而你的手机上没有这个分区,fastboot就会报错。有些脚本在报错后不会停止,继续往下执行,结果就是刷了一半,手机状态不完整,重启后卡在Fastboot。
3.3 脚本执行顺序的重要性
刷机脚本里命令的顺序不是随便排的。一般来说,要先刷底层分区,再刷上层分区。比如先刷super,再刷boot,再刷vbmeta。如果顺序反了,可能会出现依赖问题。
另外,fastboot set_active这个命令的位置也很关键。它用来切换当前活动的slot。如果在刷写之前就切换了slot,但刷写过程中出错,可能会导致两个slot都不完整,手机无法启动。通常的做法是:先刷当前slot,刷完之后如果需要,再切换slot刷另一个,最后设置回正确的活动slot。
还有一个容易忽略的点:fastboot reboot-bootloader。有些脚本在刷完一部分分区后会重启bootloader,让新的分区表生效。如果你手动改脚本的时候把这个命令删了或者放错位置,可能会导致后续刷写找不到分区。
注意:改脚本之前,一定要把原始脚本备份一份。我见过有人改完脚本刷机失败,想恢复原脚本结果发现原始文件被覆盖了,只能重新下载整个线刷包,浪费时间和流量。
4. 动手改脚本:VAB和AB机型的适配方案
4.1 准备工作:确认分区列表和镜像文件
改脚本之前,先把两样东西准备好:手机的实际分区列表,和线刷包里的镜像文件列表。
分区列表用fastboot getvar all导出,重点看这几个:
- 有没有
super分区 - 有没有
system、vendor、product这些独立分区 - slot相关的变量,比如
current-slot、slot-count partition-type信息
镜像文件列表就是线刷包解压后根目录下的所有.img文件。用ls或者文件管理器看一下,记下有哪些img。
然后做一个对照:哪些img对应哪些分区,哪些img在VAB机型上不需要单独刷。
4.2 VAB机型的脚本修改要点
假设你拿到的官方脚本是A-only版本的,手机是VAB机型。修改的核心思路是:把刷写独立system/vendor/product分区的命令删掉,改成刷super分区。
具体操作:
第一步,找到脚本里所有fastboot flash system、fastboot flash vendor、fastboot flash product之类的命令,全部删除或者注释掉。
第二步,确认线刷包里有super.img文件。如果有,在合适的位置加上:
fastboot flash super super.img如果没有super.img,而是有多个分散的img(比如system.img、vendor.img、product.img),那说明这个线刷包可能不是给VAB机型用的,需要找对应机型的线刷包。
第三步,检查boot、vbmeta、dtbo这些独立分区的刷写命令。VAB机型上这些分区通常还是独立的,但要注意slot后缀。有些VAB机型刷boot的时候不需要指定slot,有些需要。以fastboot getvar all的输出为准。
第四步,处理fastboot set_active命令。VAB机型通常不需要手动切换slot来刷写,因为super分区是共享的。如果脚本里有切换slot的命令,确认一下是否必要。不必要的可以删掉,避免刷写出错。
第五步,检查fastboot erase命令。VAB机型上,erase super分区可能会导致分区表损坏,需要重新刷完整包才能恢复。所以脚本里如果有fastboot erase super,建议删掉,改成直接flash覆盖。
4.3 AB分区机型的脚本修改要点
AB分区机型的修改相对简单一些,因为分区结构更接近传统方案。核心是确保每个分区都刷到正确的slot。
第一步,确认当前活动slot。用fastboot getvar current-slot查看。
第二步,脚本里所有fastboot flash命令,都要加上slot后缀。比如:
fastboot flash boot_a boot.img fastboot flash boot_b boot.img fastboot flash system_a system.img fastboot flash system_b system.img如果脚本里只刷了一个slot,另一个slot没刷,手机切换slot后可能无法启动。所以两个slot都要刷。
第三步,注意fastboot set_active的位置。通常的做法是:先设置活动slot为a,刷a的所有分区;然后设置活动slot为b,刷b的所有分区;最后设置回你想要的slot。
第四步,vbmeta分区的处理。AB机型上vbmeta也有两个slot,需要分别刷写。有些机型还需要刷vbmeta_system,看具体分区列表。
4.4 一个实际修改案例
我拿一台Redmi的VAB机型举例。原始官方脚本(简化版)是这样的:
fastboot flash boot boot.img fastboot flash system system.img fastboot flash vendor vendor.img fastboot flash product product.img fastboot flash vbmeta vbmeta.img fastboot reboot这台手机实际是VAB,有super分区,没有独立的system/vendor/product。修改后的脚本:
fastboot flash super super.img fastboot flash boot boot.img fastboot flash vbmeta vbmeta.img fastboot flash dtbo dtbo.img fastboot reboot改完之后跑一遍,刷机顺利完成,手机正常启动。关键就是把不存在的分区刷写命令删掉,换成super分区刷写。
实操心得:改脚本的时候,建议一行一行地改,改完一行在旁边加个注释说明为什么改。这样如果刷机出问题,回头排查的时候能快速定位是哪一步改错了。我一般会把改过的脚本另存为
flash_all_custom.bat,保留原始脚本不动。
5. 刷机实操全流程:从驱动安装到刷完重启
5.1 驱动安装:fastboot驱动不装好后面全是坑
很多人刷机卡住,第一步就错了:驱动没装对。Windows上,手机进入Fastboot模式后,设备管理器里可能会显示为一个未知设备,或者显示为“Android”但带黄色感叹号。这时候fastboot命令是识别不到设备的。
正确的做法是:下载小米官方的MiFlash工具,它里面自带了fastboot驱动。或者下载通用的Google USB Driver,手动安装。安装的时候,在设备管理器里右键那个未知设备,选择“更新驱动程序”,然后手动指向驱动目录。
安装成功后,设备管理器里应该能看到“Android Bootloader Interface”或者类似的名称,没有黄色感叹号。这时候在命令行执行:
fastboot devices应该能返回设备序列号。如果返回空,说明驱动还是有问题。
Linux和Mac用户通常不需要额外装驱动,但可能需要配置udev规则(Linux)或者信任设备(Mac)。Linux下如果fastboot devices没输出,可以试试用sudo运行,或者添加udev规则。
5.2 进入Fastboot模式的正确姿势
小米/红米手机进入Fastboot模式的方法:关机状态下,同时按住音量减键和电源键,直到屏幕上出现小米兔子修安卓机器人的画面。这就是Fastboot模式。
有些机型可能需要先进入Recovery,再从Recovery选择进入Fastboot。具体看机型。
进入Fastboot后,用数据线连接电脑。建议用原装线或者质量好的线,劣质线可能会导致传输不稳定,刷机中途断开。
注意:刷机过程中不要拔线、不要按电源键、不要让电脑休眠。我见过有人刷机刷到一半电脑自动休眠,结果手机变砖的案例。刷机前把电源计划改成“高性能”,关闭休眠。
5.3 执行修改后的脚本
把修改好的脚本和线刷包放在同一个目录下。在Windows上,双击bat文件运行。或者在命令行里cd到该目录,执行:
flash_all_custom.bat脚本会开始逐条执行fastboot命令。屏幕上会显示每条命令的执行结果。正常情况下,你会看到一系列OKAY或者Finished的提示。
如果某条命令报错,脚本可能会停止,也可能继续。注意看报错信息。常见的报错有:
Partition not found:分区不存在,说明脚本里的分区名和手机实际分区不匹配。Failed to write:写入失败,可能是镜像文件损坏或者存储空间不足。Device not found:设备未连接,检查数据线和驱动。
5.4 刷完之后的检查和首次启动
脚本跑完之后,通常会执行fastboot reboot重启手机。首次启动会比较慢,因为系统需要初始化。耐心等几分钟,不要急着断电。
如果重启后还是进入Fastboot,说明刷机没有完全成功。可能的原因:某个关键分区没刷上,或者slot设置不对。这时候需要重新进Fastboot,检查分区状态,重新刷写。
如果重启后进入Recovery或者卡在开机logo,可能是数据分区需要清除。在Recovery里执行双清(清除数据和缓存),然后重启。
实操心得:刷完机第一次启动,我一般会等至少5分钟。有些机型首次启动要优化应用,时间更长。如果超过10分钟还没进系统,再考虑是不是有问题。不要一看到logo不动就以为变砖了,耐心很重要。
6. 常见问题排查:卡Fastboot、报错、驱动异常
6.1 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| fastboot devices无输出 | 驱动未安装或异常 | 检查设备管理器 | 重装fastboot驱动 |
| 刷机卡在某个分区 | 分区名不匹配 | 对比getvar all输出 | 修改脚本分区名 |
| 报错partition not found | 脚本按A-only写,手机是VAB | 检查是否有super分区 | 改用super.img刷写 |
| 刷完卡Fastboot | slot设置错误 | fastboot getvar current-slot | 重新设置活动slot |
| 刷完卡开机logo | 数据分区未清除 | 进Recovery双清 | 清除data和cache |
| 刷机中途断开 | 数据线或USB口问题 | 换线换口 | 用原装线,直连主板USB |
| 脚本执行到一半停止 | 某条命令报错 | 看命令行输出 | 定位报错命令,手动执行 |
6.2 fastboot连接不到设备的排查思路
这是最常见的问题之一。手机明明在Fastboot界面,线也插着,但fastboot devices就是没输出。
排查顺序:
先换USB口。台式机的话,插到主板后面的USB口,不要插机箱前面的。机箱前置USB口供电和信号质量可能不稳定。
再换数据线。有些线只能充电不能传数据,或者传输质量差。用原装线最稳。
然后检查驱动。Windows设备管理器里看有没有未知设备。有的话装驱动。
如果还不行,试试在Linux下操作。Linux对fastboot设备的识别通常比Windows省心,不需要装驱动。找个Ubuntu的Live USB启动,在Linux下执行fastboot命令,往往能直接识别。
最后,检查手机Fastboot模式是否正常。有些时候手机虽然显示Fastboot界面,但fastboot服务没起来。可以试试fastboot reboot-bootloader重新进入。
6.3 刷机报错后的恢复方法
如果刷机刷到一半报错,手机处于不完整状态,不要慌。只要Fastboot还能进,就还有救。
第一步,不要拔线,不要重启手机。保持Fastboot模式。
第二步,根据报错信息,手动执行剩下的刷写命令。比如脚本在刷super的时候报错停了,你可以手动执行:
fastboot flash super super.img然后再继续刷后面的分区。
第三步,如果手动执行也报错,检查镜像文件是否完整。可以对比线刷包里img文件的MD5或SHA256校验值,看是否和官方提供的一致。下载过程中文件损坏是常见问题。
第四步,如果所有方法都试过还是不行,重新下载线刷包,重新解压,重新改脚本,从头再来。有时候问题就出在包本身。
注意:如果手机连Fastboot都进不去了,那可能需要更高级的救砖方法,比如高通的9008模式或者联发科的SP Flash Tool。这些方法涉及更底层的操作,风险更高,建议找有经验的人帮忙。
6.4 关于GPT分区表的补充说明
有些用户在改脚本或者手动分区的时候会接触到GPT分区表的概念。GPT是GUID Partition Table的缩写,是现代硬盘和手机存储常用的分区表格式,取代了老式的MBR。
在手机刷机场景下,GPT分区表通常不需要手动修改。线刷包里的分区表信息是包含在刷机流程里的,fastboot刷写的时候会自动处理。但如果分区表损坏了,可能需要通过特定工具重新写入。
Linux下用gdisk或者parted可以查看和修改GPT分区表,但手机存储不像电脑硬盘那样可以直接挂载操作。手机的分区表操作通常需要通过fastboot或者厂商特定的工具来完成。
对于普通刷机用户来说,GPT分区表这个概念了解一下就行,实际刷机过程中不太需要直接操作。重点还是放在脚本修改和fastboot命令上。
7. 几个容易被忽略的细节和我的实操体会
7.1 fastboot传文件到手机的正确理解
有人问“fastboot传文件到手机”是什么意思。其实fastboot刷机的过程,本质上就是把电脑上的img文件传输到手机的对应分区里。fastboot flash命令做的就是这件事:读取本地img文件,通过USB传输到手机,写入指定分区。
所以fastboot传文件不是像MTP那样复制文件到存储卡,而是直接写入分区。这也是为什么刷机会清除数据、为什么刷错了会变砖——因为它直接改的是系统分区。
理解这一点,就能明白为什么分区名必须匹配、为什么镜像文件必须对应正确。传错分区,轻则功能异常,重则无法开机。
7.2 脚本里的等待和延时
有些官方脚本里会有timeout或者sleep命令,用来在两条fastboot命令之间等待几秒。这不是多余的。有些操作,比如fastboot reboot-bootloader之后,手机需要时间重新进入bootloader,如果紧接着执行下一条命令,可能会因为设备还没准备好而失败。
改脚本的时候,不要把这些等待命令删掉。如果觉得等待时间不够,可以适当加长。比如把timeout /t 5改成timeout /t 10。
7.3 关于slot切换的时机
AB和VAB机型上,slot切换的时机很重要。我的一般原则是:刷写当前活动slot的时候,不要切换。等当前slot刷完了,再切换到另一个slot刷。最后设置回你想要的活动slot。
如果脚本里的slot切换逻辑和这个原则不符,可以手动调整。比如把fastboot set_active b移到所有刷写命令之后。
7.4 刷机前的数据备份
这个必须单独强调。刷机,尤其是线刷,会清除手机上的所有数据。照片、聊天记录、文档,全部没了。刷机前一定要备份。
备份方法:手机能进系统的话,用小米云服务或者本地备份功能。手机已经进不去系统的话,如果之前开了USB调试,可以用ADB拉取数据。如果什么都没开,那数据可能就保不住了。
我个人的习惯是,重要数据永远保持至少两份备份:一份在手机本地,一份在电脑或者云端。这样不管手机出什么问题,数据都不会丢。
7.5 关于“mate60可以用fastboot刷机么”这类问题的回应
经常看到有人问某款特定机型能不能用fastboot刷机。这里统一说一下:fastboot是安卓系统的通用刷机协议,理论上所有安卓手机都支持。但具体到某个机型,能不能刷、怎么刷,取决于厂商有没有提供线刷包、有没有锁定bootloader。
小米和红米手机对fastboot刷机的支持是比较友好的,官方提供线刷包,bootloader解锁之后就可以刷。其他品牌的情况各不相同,有的需要特定工具,有的限制更多。具体机型具体分析,不能一概而论。
7.6 最后分享一个排查小技巧
如果你改完脚本刷机还是失败,但又找不到原因,可以试试这个办法:把脚本里的每一条fastboot命令单独拿出来,在命令行里一条一条手动执行。这样能精确看到是哪条命令报错、报什么错。比脚本一口气跑完然后看日志要直观得多。
手动执行的时候,注意命令的顺序要和脚本里一致。每执行一条,观察手机屏幕和命令行输出。找到报错的那条,针对性地解决。
这个办法虽然慢,但排查问题非常有效。我遇到疑难杂症的时候,基本都是靠这个方法定位到根因的。