3. 恢复模式下的基础命令:fastboot、adb、dd、mount、flash_erase 详解
说实话,很多工程师在恢复模式下手忙脚乱,不是因为不懂原理,而是因为不熟悉这几个命令。我见过太多人把 fastboot flash 和 dd 搞混,结果把引导分区写成了数据分区——嗯,那场面相当尴尬。
今天咱们就把这几个命令掰开揉碎,讲清楚它们各自在恢复模式下的定位和用法。
3.1 fastboot:引导加载器层的“硬核”工具
fastboot 是 Android 系统在引导加载器(Bootloader)阶段提供的一个协议和工具。说白了,它比 recovery 模式更底层——你连系统都没起来,它就能干活。
核心定位:在设备未进入操作系统时,通过 USB 与 PC 通信,直接操作分区。
常用命令一览
| 命令 | 作用 | 典型场景 |
|---|---|---|
fastboot devices |
列出已连接的设备 | 确认设备是否被识别 |
fastboot flash <分区> <镜像> |
将镜像写入指定分区 | 刷写 boot、system、recovery |
fastboot erase <分区> |
擦除指定分区 | 清除 userdata 或 cache |
fastboot reboot |
重启设备 | 刷写完成后重启 |
fastboot oem unlock |
解锁 Bootloader | 部分设备需要先解锁才能刷写 |
我的习惯:每次刷写前,先用 fastboot getvar all 查看设备的分区表和当前状态。这能帮你避免很多低级错误。
3.2 adb:进入系统后的“瑞士军刀”
adb(Android Debug Bridge)是 Android 调试桥。它和 fastboot 最大的区别是:adb 需要系统内核和 adbd 守护进程都跑起来才能用。在 recovery 模式下,大部分第三方 recovery(如 TWRP)都内置了 adbd,所以你能用 adb 操作。
恢复模式下最常用的 adb 命令
adb devices— 检查设备是否连接,注意 recovery 模式下会显示为recovery状态adb shell— 进入设备的 shell 环境,这是最强大的功能adb push <本地文件> <设备路径>— 把文件从电脑传到设备adb pull <设备路径> <本地文件>— 从设备拉取文件到电脑adb reboot bootloader— 重启到 bootloader 模式
我曾经踩过的坑:有一次在 recovery 下用 adb push 传一个 2GB 的 system.img,结果传了一半 USB 线松了。从那以后,我每次都用 adb push 之前先 adb shell df -h 确认一下 /tmp 空间够不够。
3.3 dd:最底层的块设备复制工具
dd 是 Linux 原生的命令,在 recovery 模式下它直接操作块设备文件。你想想看,它不关心文件系统,不关心分区表,只做一件事:从输入读,往输出写。
正因为如此,dd 既强大又危险。用对了是神器,用错了是灾难。
典型用法
# 备份 boot 分区到 /sdcard
dd if=/dev/block/bootdevice/by-name/boot of=/sdcard/boot_backup.img bs=4M
# 从镜像恢复 boot 分区
dd if=/sdcard/boot_new.img of=/dev/block/bootdevice/by-name/boot bs=4M
# 擦除 userdata 分区(用 /dev/zero 填充)
dd if=/dev/zero of=/dev/block/bootdevice/by-name/userdata bs=1M
参数说明:
if=— 输入文件(Input File)of=— 输出文件(Output File)bs=— 块大小,通常设为 4M 或 1M 提高速度count=— 只复制指定数量的块,用于部分备份
切记:写错 of= 的后果是直接覆盖另一个分区。我见过有人把 of=/dev/block/mmcblk0p5 写成了 of=/dev/block/mmcblk0(整个 eMMC),结果设备直接变砖。所以每次执行 dd 前,请务必三遍确认目标路径。
3.4 mount:挂载文件系统才能读写
在 recovery 模式下,分区默认是不挂载的。你想读写 /system 或 /data,必须先 mount。这个命令本身不复杂,但很多人搞不清楚挂载点和设备节点的对应关系。
常用操作
# 查看当前挂载情况
mount
# 挂载 system 分区为只读
mount /dev/block/bootdevice/by-name/system /system
# 挂载 system 分区为可读写
mount -o rw,remount /system
# 挂载 data 分区
mount /dev/block/bootdevice/by-name/userdata /data
我的经验:在 TWRP 里,你可以在“挂载”页面勾选分区,但命令行下更灵活。比如你想挂载 system 为 rw 但保留 selinux 上下文,可以用 mount -o rw,context=u:object_r:system_file:s0 /system。
3.5 flash_erase:NAND 设备的专用擦除工具
flash_erase 是 MTD(Memory Technology Device)子系统下的工具,专门用于 NAND Flash 和 SPI NOR Flash。它和 fastboot erase 不同——后者是协议层面的擦除,而 flash_erase 是直接操作 MTD 字符设备。
适用场景
- 设备使用 NAND Flash 而非 eMMC
- 需要按擦除块(erase block)粒度操作
- 某些老旧设备或 IoT 设备
基本用法
# 擦除整个分区(mtd0)
flash_erase /dev/mtd0 0 0
# 从偏移 0x100000 开始擦除 4 个块
flash_erase /dev/mtd0 0x100000 4
# 查看 MTD 分区信息
cat /proc/mtd
和 dd 的区别:
| 工具 | 适用设备 | 操作粒度 | 是否关心坏块 |
|---|---|---|---|
dd |
eMMC、UFS、SD 卡 | 字节级 | 不关心 |
flash_erase |
NAND、NOR Flash | 擦除块级 | 会标记坏块 |
3.6 命令关系总览
这几个命令在恢复模式下各司其职,但经常需要配合使用。我画了一张图帮你理清它们的关系:
3.7 实战组合拳:一个完整的修复流程
光讲命令没意思,咱们来一个真实场景。假设你的设备 boot 分区损坏,卡在第一屏。你会怎么做?
- 进入 Bootloader:按住音量减+电源键,进入 fastboot 模式
- 刷入临时 recovery:
fastboot boot twrp.img(不刷写,只临时启动) - 进入 recovery 后:用
adb shell进入命令行 - 挂载分区:
mount /system和mount /data - 备份损坏分区:
dd if=/dev/block/bootdevice/by-name/boot of=/sdcard/boot_broken.img - 写入修复镜像:
dd if=/sdcard/boot_fixed.img of=/dev/block/bootdevice/by-name/boot - 重启验证:
reboot
我的建议:永远保留一份原厂 boot.img 和 recovery.img 在外部 SD 卡或 OTG U 盘里。这样即使系统完全进不去,你也能用 fastboot 或 dd 恢复。
好了,这五个命令的详解就到这里。记住它们的定位:fastboot 管底层刷写,adb 管通信和 shell,dd 管块设备复制,mount 管文件系统挂载,flash_erase 管 NAND 擦除。下次在 recovery 模式下遇到问题,先想清楚你现在在哪一层,该用哪个工具。