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 命令关系总览

这几个命令在恢复模式下各司其职,但经常需要配合使用。我画了一张图帮你理清它们的关系:

恢复模式命令关系图 恢复模式命令关系与分工 设备当前状态 Bootloader 模式 Recovery 模式 系统已启动 fastboot adb + shell adb(正常模式) dd(块设备操作) mount(挂载) flash_erase(MTD) 说明:fastboot 在 Bootloader 层工作;adb 在系统/Recovery 层工作;dd/mount/flash_erase 通过 adb shell 进入后使用

3.7 实战组合拳:一个完整的修复流程

光讲命令没意思,咱们来一个真实场景。假设你的设备 boot 分区损坏,卡在第一屏。你会怎么做?

  1. 进入 Bootloader:按住音量减+电源键,进入 fastboot 模式
  2. 刷入临时 recovery:fastboot boot twrp.img(不刷写,只临时启动)
  3. 进入 recovery 后:用 adb shell 进入命令行
  4. 挂载分区:mount /system 和 mount /data
  5. 备份损坏分区:dd if=/dev/block/bootdevice/by-name/boot of=/sdcard/boot_broken.img
  6. 写入修复镜像:dd if=/sdcard/boot_fixed.img of=/dev/block/bootdevice/by-name/boot
  7. 重启验证:reboot

我的建议:永远保留一份原厂 boot.img 和 recovery.img 在外部 SD 卡或 OTG U 盘里。这样即使系统完全进不去,你也能用 fastboot 或 dd 恢复。

好了,这五个命令的详解就到这里。记住它们的定位:fastboot 管底层刷写,adb 管通信和 shell,dd 管块设备复制,mount 管文件系统挂载,flash_erase 管 NAND 擦除。下次在 recovery 模式下遇到问题,先想清楚你现在在哪一层,该用哪个工具。