本文章由 AI 生成
故障现象
不小心把 /data/adb 删了之后,通常会按这个顺序出问题:
- 进 recovery 提示无法加载 Android 系统,或问要不要擦除数据,recovery 日志里会出现:
recovery: Boot command: boot-recovery recovery: --prompt_and_wipe_data recovery: --reason=set_policy_failed:/data/adb
- 不同意擦机就会反复重启,后来直接变成无限重启进 fastboot,连 recovery 都进不去了
- 刷 TWRP 到 recovery 分区后,
fastboot reboot recovery还是会掉回 fastboot - 用
fastboot boot twrp.img临时引导会报Failed to load/authenticate boot image: Load Error
故障原理
init 的加密策略检查
Android FBE 下,init 会在 post-fs-data 阶段校验 /data/adb 的 fscrypt 加密策略。如果 ROM 用的是 encryption=Require,策略设置不对就会直接要求擦机。
关键点:init 只校验策略,不会重新给目录授权。目录状态不一样,结果也就不一样:
| 目录状态 | 检查结果 |
|---|---|
| 存在且带正确加密策略 | 正常开机 |
| 存在但无加密策略(被管理器重建过) | 失败,要求擦机 |
| 不存在 | 失败,要求擦机(init 不会自动重建) |
| 存在且为空,权限属主正确 | 成功设置策略,正常开机 |
为何删了又会复现
删掉 /data/adb 后,KernelSU、Magisk 这类 root 管理器会立刻用普通 mkdir 把目录重建出来,但不带加密策略。下次开机 init 检测到目录存在但没策略,校验就会失败。
为何会变成 fastboot 死循环
A/B 分区设备每次启动失败都会扣减 slot-retry-count。两个 slot 的重试次数都耗尽且都被标记 unbootable 时,bootloader 就会直接进 fastboot 等待救援,连 recovery 都不再试了。
修复方法
1. 确认 fastboot 状态
fastboot devices fastboot getvar all
重点看这些:
slot-unbootable:a: yes slot-unbootable:b: yes slot-retry-count:a: 0 unlocked: yes current-slot: a
2. 重置 slot 并清除 BCB
fastboot set_active a fastboot getvar slot-unbootable:a # 应显示 no
做个全零 misc 镜像刷进去,把残留的启动命令清掉:
fsutil file createnew misc_zero.img 1048576 fastboot flash misc misc_zero.img
3. 刷入 TWRP
部分机型不支持 fastboot boot,得刷进 recovery 分区:
fastboot flash recovery_a TWRP.img fastboot flash recovery_b TWRP.img fastboot reboot recovery
4. 在 TWRP 里重建空的 /data/adb
进 TWRP 后用 adb shell 操作:
adb shell # 建议先备份(如有需要) adb pull /data/adb ./adb_backup # 删掉有问题的目录并重建空目录 rm -rf /data/adb mkdir /data/adb chmod 0700 /data/adb chown 0:0 /data/adb chcon u:object_r:adb_data_file:s0 /data/adb ls -laZd /data/adb
目录必须为空。init 只能在空目录上设置加密策略,非空目录会设置失败。开机后 root 管理器会自动把需要的文件重建回来。
5. 提交 f2fs 检查点并重启
TWRP 挂载 /data 时通常带 checkpoint=disable,直接重启的话改动会回滚:
sync mount -o remount,checkpoint=enable /data sync dd if=/dev/zero of=/dev/block/by-name/misc bs=2048 count=1 sync adb reboot
验证
重启后应该能正常进系统。KernelSU 会自动重建 ksu/、ksud 这些文件夹,功能一切正常。
要是还没修好,可以看看 /sys/fs/pstore/ 里的上次内核日志,搜 set_policy_failed 找出是哪个目录出了问题,按同样的方法处理就行。
注意事项
- 别直接删
/data/adb。要卸载 root 建议走管理器自带的卸载功能 - 修改 /data 后务必提交 checkpoint。这是最容易踩的坑,直接
adb reboot很可能导致回滚 - fastboot 死循环不用线刷。先用
set_active重置 slot 通常就能脱离 - 建议备份 recovery。刷 TWRP 后原厂 recovery 会被覆盖,要还原得刷回对应版本
- 常备工具。TWRP + platform-tools 是关键时刻最省事的救砖方案
参考
- Android折腾重启报set_policy_failed:/data/adb - TLog
- AOSP 源码:
system/core/init/builtins.cpp、system/core/init/fscrypt_init_extensions.cpp - fscrypt 文档
评论区
评论加载中...