MT6739 Android 8.1 取消强制data分区加密,recovery时候挂载data分区

MT6739 Android 8.1 取消强制data分区加密,recovery时候挂载data分区

注意:不取消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下需要保留的文件,删除不需要的文件,但是牺牲了安全性!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章