我目前正在尝试为小米Redmi Note 3(MTK)编译CM-12.1(Android 5.1),但我遇到设备加密问题(即加密/数据分区)。
具体来说,当告诉Android加密设备时(即在设置中选择“加密手机”,它会启动该过程,但不到一分钟后会显示一个屏幕显示加密失败,并且手机需要恢复出厂设置。
logcat显示以下输出:
05-15 19:47:49.694 I/Cryptfs ( 254): Using scrypt for cryptfs KDF
05-15 19:47:50.680 I/Cryptfs ( 254): Enabling support for allow_discards in dmcrypt.
05-15 19:47:50.680 I/Cryptfs ( 254): load_crypto_mapping_table: target_type = crypt
05-15 19:47:50.680 I/Cryptfs ( 254): load_crypto_mapping_table: real_blk_name = /dev/block/platform/mtk-msdc.0/by-name/userdata, extra_params = 1 allow_discards
05-15 19:47:55.706 E/Cryptfs ( 254): Cannot load dm-crypt mapping table.
05-15 19:47:55.707 I/Cryptfs ( 254): Encrypting ext4 filesystem in place...
05-15 19:47:55.707 I/Cryptfs ( 254): Encrypting group 0
05-15 19:47:55.710 E/Cryptfs ( 254): Error writing crypto_blkdev /dev/block/dm-0 for inplace encrypt
05-15 19:47:55.710 I/Cryptfs ( 254): Encrypted to sector 0
05-15 19:47:55.710 E/Cryptfs ( 254): Error encrypting groups
05-15 19:47:55.710 D/Cryptfs ( 254): cryptfs_enable_inplace_ext4()=-1
05-15 19:47:55.710 E/Cryptfs ( 254): Failed to encrypt f2fs filesystem on /dev/block/platform/mtk-msdc.0/by-name/userdata
05-15 19:47:55.710 I/Cryptfs ( 254): Encrypted to block -1
05-15 19:47:55.710 D/Cryptfs ( 254): cryptfs_enable_inplace_f2fs()=-1
05-15 19:47:55.710 E/Cryptfs ( 254): Encrypting filesystem in place...
05-15 19:47:55.710 E/Cryptfs ( 254): Cannot seek to previously encrypted point on /dev/block/dm-0
05-15 19:47:55.710 D/Cryptfs ( 254): cryptfs_enable_inplace_full()=-1
与最相关的一行可能是这一行:
05-15 19:47:55.706 E/Cryptfs ( 254): Cannot load dm-crypt mapping table.
同时,内核日志打印以下内容:
<3>[ 1196.971648] (3)[324:vold]device-mapper: table: 253:0: crypt: Device lookup failed
<4>[ 1196.971659] (3)[324:vold]device-mapper: ioctl: error adding target to table
我已经通过源代码跟踪了这个问题,我怀疑它在Linux内核的dm-crypt.c中的某个地方,在crypt_ctr()函数中:
if (dm_get_device(ti, argv[3], dm_table_get_mode(ti->table), &cc->dev)) {
ti->error = "Device lookup failed";
goto bad;
}
据推测,dm_get_device()由于某种原因失败(当然,我可能会弄错,问题出在其他地方,但是在源代码中跟踪函数调用似乎表明这是错误的来源)。 / p>
不幸的是,有问题的设备的内核源代码不可用,因此我无法对内核执行任何更详细的测试。
另一个难题是,同一设备有一个AOSP 5.0 ROM,它使用完全相同的内核(如同一个二进制文件),并且电话加密有效。不幸的是,我不熟悉dm-crypt,设备映射器和其他相关的东西,以找出差异是什么,以及为什么它在CM-12.1上失败(例如,是否有任何设备映射器配置在某处这可能是不同的等等。)。
更奇怪的是,如果我加密AOSP ROM上的用户分区,然后使用TWRP恢复来刷新我的CM-12.1 ROM,擦除数据分区(不会删除加密,因为TWRP可以正确解密和挂载数据分区),然后我的CM-12.1 ROM正常启动并解密数据分区(可能是不设备映射器出现问题)。
我一直在用这个问题敲打太长时间,所以如果有人有任何想法或者知道问题可能是什么以及如何解决它,那将非常感激。