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下需要保留的文件,刪除不需要的文件,但是犧牲了安全性!