注意:不取消data分区加密的话,recovery时候无法挂载data分区!
取消data分区默认加密,修改如下:
vendor/mediatek/proprietary/hardware/fstab/mt6739/fstab.in
......
/* Can overwrite FDE setting by defining __MTK_FDE_NO_FORCE and __MTK_FDE_TYPE_FILE in this file */
/* For example, you can un-comment the following line to disable FDE for all projects in this platform. */
#define __MTK_FDE_NO_FORCE //将这个宏定义打开,将使用“encryptable”
#ifdef __MTK_FDE_NO_FORCE
#define FLAG_FDE_AUTO encryptable
#else
#define FLAG_FDE_AUTO forceencrypt
#endif
#ifdef __MTK_FDE_TYPE_FILE
#define FLAG_FDE_TYPE fileencryption
#else
#define FLAG_FDE_TYPE
#endif
#ifdef __MTK_FDE_TO_FBE
#define FLAG_FDE_TYPE forcefdeorfbe
#endif
......
#ifdef __MTK_FDE_TYPE_FILE
DEVPATH(userdata) /data ext4 FS_FLAG_DATA FSMGR_FLAG_CHK,resize,FLAG_FDE_TYPE
#else
DEVPATH(userdata) /data ext4 FS_FLAG_DATA FSMGR_FLAG_CHK,resize,FLAG_FDE_AUTO=DEVPATH(metadata)
#endif
......
上面的修改,会改变out目录输出的,init脚本需要用到的分区mount文件:
out/target/product/k39tv1_bsp/vendor/etc/fstab.mt6739
正常带加密的,data分区挂载参数如下:
/dev/block/platform/bootdevice/by-name/userdata /data ext4 noatime,nosuid,nodev,noauto_da_alloc,errors=panic wait,check,quota,formattable,resize,forceencrypt=/dev/block/platform/bootdevice/by-name/metadata,
修改之后默认不加密的,data分区挂载参数如下:
/dev/block/platform/bootdevice/by-name/userdata /data ext4 noatime,nosuid,nodev,noauto_da_alloc,errors=panic wait,check,quota,formattable,resize,encryptable=/dev/block/platform/bootdevice/by-name/metadata,
可以看到最后的加密参数“forceencrypt”变成了“encryptable”!
正常recovery恢复出厂设置的时候(这里只讨论“恢复出厂设置”模式,不涉及其他模式,比如“OTA升级”),data分区是不会挂载,直接会被格式化,然后重新建立文件系统,代码如下:
bootable/recovery/recovery.cpp
// Return true on success.
static bool wipe_data(Device* device) {
modified_flash = true;
ui->Print("\n-- Wiping data...\n");
bool success =
device->PreWipeData() &&
erase_volume("/data") && //这里格式化data分区
(has_cache ? erase_volume("/cache") : true) &&
(has_nvdata ? erase_volume(NVDATA_ROOT) : true) &&
mt_wipe_data() &&
device->PostWipeData();
ui->Print("Data wipe %s.\n", success ? "complete" : "failed");
return success;
}
可以看到,除了格式化data分区,也去格式化了cache分区,但是实际cache分区在格式化之前是mount的,因为需要拷贝cache分区下recovery相关的文件到内存,格式化完之后,再重新写入cache分区,具体逻辑在上面代码使用的函数“erase_volume()”里,这个函数在文件:bootable/recovery/recovery.cpp里。
查看erase_volume()这个函数源码,重点关注“ensure_path_mounted(volume);”这个函数的使用,这个就是挂载分区的函数,对应的是“ensure_path_unmounted(volume);”卸载分区的函数。
挂载分区函数的实现,这里就不具体分析了,大致就是通过传进去的“挂载目录”参数,比如“/cache”,在分区挂载表里查找到物理分区,文件系统类型等参数,最后执行系统调用“mount”函数!
我们使用“ensure_path_mounted("/data");”来挂载data分区(需要先取消data分区默认加密),它在分区挂载表里的记录大概是这个样子“/data ext4 /dev/block/platform/bootdevice/by-name/userdata”,但是要注意,需要注释掉原先格式化data分区的代码,修改如下:
bootable/recovery/recovery.cpp
// Return true on success.
static bool wipe_data(Device* device) {
modified_flash = true;
ui->Print("\n-- mount /data...\n");
ensure_path_mounted("/data"); //这里挂载data分区
ui->Print("-- mkdir /data/test ...\n");
mkdir("/data/test", 0755); //这里在data目录下创建test目录,用来验证挂载成功
ui->Print("\n-- Wiping data...\n");
bool success =
device->PreWipeData() &&
/*erase_volume("/data") &&*/ //这里把原先格式化data分区的代码注释掉
(has_cache ? erase_volume("/cache") : true) &&
(has_nvdata ? erase_volume(NVDATA_ROOT) : true) &&
mt_wipe_data() &&
device->PostWipeData();
ui->Print("Data wipe %s.\n", success ? "complete" : "failed");
return success;
}
以上所有修改完,编译测试,data分区的旧文件依然存在,新目录test被创建!
这种方式,可以在恢复出厂设置的时候,保留/data下需要保留的文件,删除不需要的文件,但是牺牲了安全性!