由F2FS引发的血案
背景
基于RK3399
开发的Android7.1.2
批测时,频繁上下电测试,发现大概率出现启动进入recovery模式,而且一旦进recovery模式以后,每次上电都会进,不会进系统,只有在recovery模式下进行双清操作后,才能正常进入系统。
从log分析是flash文件损坏或丢失,主要表现为一些配置文件读取失败或创建失败,服务启动失败。
对比data分区的文件系统类型,新的SDK默认为EXT4,现在用的老的版本还是F2FS
修改data分区的文件系统类型为EXT4后, 测试无异常。
从 F2FS 文件系统切到 EXT4 需要格式化 data 分区,会导致 data 分区数据全部清空
F2FS相对于以前使用的 EXT4 而言,随机读写的效率会优于 EXT4。但是另外一方面,EXT4 使用的范围
更广,经历的时间考验也更久,稳定性这块我们认为可能会优于 F2FS,所以对于行业客户而言,如
果更注重文件系统的稳定性,建议使用 EXT4
修改data分区的文件系统类型:
- 首先确认是否有使用强制加密功能,即 BUILD_WITH_FORCEENCRYPT 这个宏是否有使能,
SDK 默认为使能状态,这个宏会决定使用哪个 fstab 文件,详见下述代码:device/rockchip/rk3399$ vim device.mk ifeq ($(BUILD_WITH_FORCEENCRYPT),true) PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/fstab.rk30board.bootmode.forceencrypt.unknown:root/fstab.rk30board.bootmode.unkno wn \ $(LOCAL_PATH)/fstab.rk30board.bootmode.forceencrypt.emmc:root/fstab.rk30board.bootmode.emmc \ $(LOCAL_PATH)/fstab.rk30board.bootmode.forceencrypt.nvme:root/fstab.rk30board.bootmode.nvme else PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/fstab.rk30board.bootmode.unknown:root/fstab.rk30board.bootmode.unknown \ $(LOCAL_PATH)/fstab.rk30board.bootmode.emmc:root/fstab.rk30board.bootmode.emmc \ $(LOCAL_PATH)/fstab.rk30board.bootmode.nvme:root/fstab.rk30board.bootmode.nvme endif
- 需要根据存储的介质找到对应的 fstab,然后修改对应的 data 分区加载选项,下面以 emmc 为例:
device/rockchip/rk3399$ git diff diff --git a/fstab.rk30board.bootmode.forceencrypt.emmc b/fstab.rk30board.bootmode.forceencrypt.emmc index 9adbfb9..833c85e 100755 --- a/fstab.rk30board.bootmode.forceencrypt.emmc +++ b/fstab.rk30board.bootmode.forceencrypt.emmc @@ -8,11 +8,11 @@ #/dev/block/platform/fe330000.sdhci/by-name/system /system ext4 ro,noatime,nodiratime,noauto_da_alloc wait,check,verify /dev/block/platform/fe330000.sdhci/by-name/cache /cache ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard wait,check /dev/block/platform/fe330000.sdhci/by-name/metadata /metadata ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard wait,check -/dev/block/platform/fe330000.sdhci/by-name/userdata /data f2fs noatime,nodiratime,nosuid,nodev,discard,inline_xattr wait,check,notrim,forceencrypt=/metadata/key_file +#/dev/block/platform/fe330000.sdhci/by-name/userdata /data f2fs noatime,nodiratime,nosuid,nodev,discard,inline_xattr wait,check,notrim,forceencrypt=/metadata/key_file #data for f2fs nobarrier #/dev/block/platform/fe330000.sdhci/by-name/userdata /data f2fs noatime,nodiratime,nosuid,nodev,discard,inline_xattr,nobarrier wait,check,notrim,forceencrypt=/metadata/key_file #data for ext4 -#/dev/block/platform/fe330000.sdhci/by-name/userdata /data ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard,errors=panic wait,check,forceencrypt=/metadata/key_file +/dev/block/platform/fe330000.sdhci/by-name/userdata /data ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard,errors=panic wait,check,forceencrypt=/metadata/key_file /dev/block/platform/fe330000.sdhci/by-name/misc /misc emmc defaults defaults # sdcard /devices/platform/fe320000.dwmmc/mmc_host* auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
- 修改 recovery 模式时 data 分区加载选项:
device/rockchip/rk3399$ git diff diff --git a/recovery.emmc.fstab b/recovery.emmc.fstab index d232dbd..ac58660 100755 --- a/recovery.emmc.fstab +++ b/recovery.emmc.fstab @@ -5,7 +5,7 @@ /dev/block/platform/fe330000.sdhci/by-name/system /system ext4 defaults defaults /dev/block/platform/fe330000.sdhci/by-name/cache /cache ext4 defaults defaults /dev/block/platform/fe330000.sdhci/by-name/metadata /metadata ext4 defaults defaults -/dev/block/platform/fe330000.sdhci/by-name/userdata /data f2fs defaults defaults +/dev/block/platform/fe330000.sdhci/by-name/userdata /data ext4 defaults defaults /dev/block/platform/fe330000.sdhci/by-name/cust /cust ext4 defaults defaults /dev/block/platform/fe330000.sdhci/by-name/custom /custom ext4 defaults defaults /dev/block/platform/fe330000.sdhci/by-name/misc
- 确认查看挂载情况
cat /proc/mounts
扩展
测试I/O读写速度
dd bs=64k count=20k if=/dev/zero of=/data/test
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 DD'Notes!
评论