4、固件备份与校验:用dd命令备份分区,MD5/SHA256校验,备份策略
说到固件修复,我个人的第一原则永远是:先备份,再动手。这听起来像句废话,但我在项目里见过太多次「刷完变砖,才发现没留底」的惨案。说白了,恢复模式下的dd命令就是你最后的救命稻草。这一章咱们就把它聊透。
4.1 为什么必须备份?
你想想看,固件修复的本质是什么?是用一份「已知好的」数据,覆盖掉「已经坏掉」的数据。那问题来了——你手里那份「已知好的」从哪来?
官方固件包?不一定总能找到完全匹配的版本。别人的备份?硬件版本差一个字母都可能不兼容。所以最靠谱的办法,就是在设备还健康的时候,自己亲手把分区原样倒出来。
核心原则:备份操作必须在恢复模式(Recovery Mode)或自定义Recovery(如TWRP)下完成。正常系统运行时,分区可能被挂载、被写入,dd出来的数据不干净。
4.2 用dd命令备份分区
dd命令,全称data duplicator,说白了就是逐字节复制。它不管你文件系统是什么,也不管分区里有没有坏块,就是一个字一个字地读、一个字一个字地写。嗯,这里要注意:dd命令非常强大,也非常危险。我曾经有一次把if和of写反了,直接把一块硬盘变成了空盘……从那以后,我每次敲dd之前都会默念三遍「if是输入,of是输出」。
4.2.1 基本语法
dd if=/dev/block/bootdevice/by-name/boot of=/sdcard/boot_backup.img bs=4M
参数说明:
| 参数 | 含义 | 我的建议 |
|---|---|---|
if= |
输入文件(要备份的分区设备节点) | 用by-name路径,别用sda这种数字编号 |
of= |
输出文件(备份镜像保存路径) | 存到外部SD卡或OTG U盘,别存内存 |
bs= |
块大小,一次读写多少字节 | 4M最稳,太大容易内存不足 |
4.2.2 常用分区备份清单
不同设备的分区布局不一样,但以下这些是通用的「必备份」分区:
- boot:内核和ramdisk,系统启动的核心
- recovery:恢复模式本身,坏了就进不去Recovery了
- system:系统文件,最常出问题的分区
- vendor:厂商专有驱动和库
- data:用户数据,包括应用和设置
- persist:校准数据,丢了摄像头、WiFi可能失灵
我的习惯:每次刷机前,我会把boot、recovery、persist这三个分区先备份。因为它们体积小(几十MB),出问题后恢复成本最低。system和data太大,可以按需备份。
4.2.3 批量备份脚本
手动一个一个敲太累了。我写了个小脚本,在Recovery的终端里跑一次就行:
#!/system/bin/sh
BACKUP_DIR=/external_sd/backup_$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
PARTITIONS="boot recovery system vendor persist"
for PART in $PARTITIONS; do
echo "Backing up $PART..."
dd if=/dev/block/bootdevice/by-name/$PART \
of=$BACKUP_DIR/${PART}.img bs=4M
done
echo "All done! Backup saved to $BACKUP_DIR"
4.3 MD5/SHA256校验
备份完了就放心了?别急。你想想看,dd过程中如果遇到坏块、存储空间不足、突然断电,备份出来的镜像可能是不完整的。这时候就需要校验。
4.3.1 生成校验值
备份完成后,立刻生成哈希值:
# MD5校验(速度快,安全性一般)
md5sum /sdcard/boot_backup.img > /sdcard/boot_backup.img.md5
# SHA256校验(更安全,推荐)
sha256sum /sdcard/boot_backup.img > /sdcard/boot_backup.img.sha256
4.3.2 验证备份完整性
当你需要恢复备份时,先校验:
# 验证MD5
md5sum -c boot_backup.img.md5
# 验证SHA256
sha256sum -c boot_backup.img.sha256
如果输出显示「OK」,说明文件没损坏。如果显示「FAILED」,嗯……你懂的,重新备份吧。
我曾经踩过的坑:有一次备份完system分区,md5sum也生成了,但没注意SD卡空间不足,dd命令中途报错退出。结果md5sum校验的是「不完整的文件」,居然还通过了。后来我养成了习惯:备份完成后,先检查dd的退出码(echo $?),再生成校验值。
4.4 备份策略
备份不是一次性的活儿。我个人的策略是「三级备份」:
| 级别 | 频率 | 内容 | 存储位置 |
|---|---|---|---|
| L1 - 出厂备份 | 设备到手后立即做一次 | 全部分区(boot、recovery、system、vendor、persist) | 电脑硬盘 + 云盘 |
| L2 - 刷机前备份 | 每次刷机/OTA前 | boot、recovery、data(关键应用数据) | 外部SD卡 |
| L3 - 日常增量 | 每周一次 | data分区中的特定目录(如DCIM、WhatsApp) | NAS或云盘 |
命名规范很重要:我习惯用「设备型号_分区名_日期_备注.img」的格式。比如:pixel6_boot_20250315_stock.img。这样半年后翻出来,一眼就知道这是什么。
4.5 知识体系:备份与校验流程
下面这张图把整个流程串起来了。你可以把它当成操作前的checklist:
4.6 避坑指南
- 备份文件不要存在内部存储:万一系统崩了进不去,内部存储也读不了。存到外部SD卡或OTG U盘。
- dd命令的bs参数别设太大:我见过有人设bs=64M,结果Recovery内存不够直接崩溃。4M最稳妥。
- 校验值要和备份文件放一起:分开存放的话,时间久了根本不知道哪个校验值对应哪个文件。
- 定期检查备份文件的可读性:SD卡会坏,硬盘会坏。我每三个月会把备份文件读出来校验一次。
血的教训:有一次我帮朋友救砖,他提供了备份文件。结果dd写回去的时候报错,一查才发现备份文件早就损坏了——他备份完就扔在硬盘里,三年没碰过。从那以后,我所有备份都做「双副本」,一份冷存储(硬盘),一份热存储(NAS),并且每半年校验一次。
备份这件事,说白了就是「花十分钟,省十小时」。你花在备份上的每一分钟,都是在为未来的自己买保险。嗯,这一章的内容就到这儿,该去动手备份你的设备了。