前言

一直在用原生系统 (LineageOS、ResurrectionRemix), 这两天突然发现系统居然未加密,尝试加密还失败了。

以为是系统的问题,然后又换了一个原生系统刷 (AospExtended), 结果发现还是没能解决问题。

Debug

那就具体问题具体分析,一顿搜索发现原来是 TWRP 的问题, 由于 /data 所在的分区 (userdata 分区) 占用了加密页脚空间导致的 (在 Device Tree 中的 BoardConfig.mk 文件中定义)。

所以只需缩小 /data 所在的分区 (userdata 分区) 为加密页脚留足空间 (16KiB) 即可。

解决

需要先找到 /data 所在的分区

  1. 电脑安装 adb 工具和手机驱动
  2. 手机开启 USB 调试模式,并连接电脑
  3. 执行 adb logcat > Get-Logcat.log 命令
  4. 在手机上执行加密操作 (通常是 “设置->安全性和位置信息->加密与凭据->加密手机”)
  5. 等待加密失败并重启
  6. 结束 adb 操作 (通常是同时按 “Ctrl 键 + C 键”)
  7. Get-Logcat.log 中查找含 “E Cryptfs” 字符的行 (示例如下),并记住这个分区名 (在我的设备上为 /dev/block/bootdevice/by-name/userdata)
02-26 10:29:27.594   459  7814 E Cryptfs : Bad magic for real block device /dev/block/bootdevice/by-name/userdata
02-26 10:29:27.594   459  7814 E Cryptfs : Orig filesystem overlaps crypto footer region.  Cannot encrypt in place.

再进入 Recovery 模式执行缩小分区操作

  1. 卸载掉 /data (在 TWRP 中通常是 “Mount -> 取消标记 Data”)
  2. 手机连接电脑并执行 adb shell 命令 (也可以用 TWRP 内建的终端,但操作起来没电脑舒服)
  3. 执行 ls -l /dev/block/bootdevice/by-name/userdata 命令
    • 此步骤用于显示出 userdata 分区所在的块,记住这个块设备名 (在我的设备上为 /dev/block/mmcblk0p49)
    • 参数 -l 解释: 以长格式显示目录下的内容列表
  4. 执行 tune2fs -l /dev/block/mmcblk0p49 | grep "Block count" 命令
    • 此步骤用于过滤出块的大小,并将这个数值减去 16384 (在我的设备上为 2588025)
    • 参数 -l 解释: 显示文件超级块内容
  5. 执行 e2fsck -y -f /dev/block/mmcblk0p49 命令
    • 此步骤用于检查文件系统的完整性
    • 参数 -y 解释: 采取非交动方式,所有的问题均自动以 yes 回答
    • 参数 -f 解释: 即使文件系统没有错误,仍强制检查正确性
  6. 执行 resize2fs /dev/block/mmcblk0p49 2588025 命令
    • 此步骤用于调整文件系统的大小

上述中的各分区名、块设备名、块大小只是示例,请根据自己设备的实际情况作相应的修改。

重启

再重新执行加密操作,不出意外应该能正常执行加密了。