由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分区的文件系统类型:

  1. 首先确认是否有使用强制加密功能,即 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
  2. 需要根据存储的介质找到对应的 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
  3. 修改 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
  4. 确认查看挂载情况
    cat /proc/mounts

    扩展

测试I/O读写速度

dd bs=64k count=20k if=/dev/zero of=/data/test

文章作者: shell
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 shell !
评论
  目录