f2fs 是什么

F2FS是一种闪存文件系统,由金载极在三星集团研发,提供给Linux内核使用。 此文件系统起初是为了NAND闪存而设计的,例如这一类的存储设备,甚至可以自移动设备广泛应用至服务器。 三星应用了日志结构文件系统的概念,使它更适合用于存储设备。

如何切换到f2fs分区格式

  • 编译内核添加f2fs驱动
  • 修改boot.img,开机挂载分区的时候以f2fs方式挂载
  • 格式化分区为f2fs

给内核编译f2fs模块

Linux kernel3.8之后添加了 f2fs 驱动,如果你现在在用的 Android 内核版本在 3.8 或者 3.8 之后是默认支持 f2fs 的,当然不排除没有编译进去,修改内核配置文件,修改下面的选项:

CONFIG_F2FS_FS=y
CONFIG_F2FS_STAT_FS=y
CONFIG_F2FS_FS_XATTR=y
CONFIG_F2FS_FS_SECURITY=y
CONFIG_F2FS_CHECK_FS=y
CONFIG_F2FS_FS_ENCRYPTION=y

版本在3.8之前的,只能去寻找第三方内核,CM系统的内核也可以用,一般是有添加这个驱动的,重新编译内核,打包刷进手机确认内核能用(内核和手机在用内核不一样的话,需要替换驱动)。

修改boot.img

这里需要用到的工具mkbootimg/unpackbootimg(下载链接在文章后面),将编译出来的zImage-dtb替换boot.img-dtb,能开机就算OK,查看/proc/filesystems有f2fs支持后面的就简单了,创建一个f2fs分区或者文件,测试能正常挂载读写,没问题的话接下来就可以怎被格式化分区为f2fs。

  # 解包boot.img
  unpackbootimg -i boot.img -o out
  cd out
  mkdir ramdisk
  cd ramdisk
  # 解包ramdisk
  gunzip -c ../boot.img-ramdisk.gz | cpio -idm
  # 打包ramdisk
  find . | cpio -o -H newc | gzip > ../newramdisk.cpio.gz
  #打吧boot.img使用mkbootimg,在解包时候获取的参数要全部填进去,这点很重要。

修改分区表fstab.qcom,这个文件告诉系统开机后怎么挂载分区,不用手机可能有点差异,但基本在ramdisk里面都能找到类似文件,datacache分区挂载方式改为f2fs,挂载参数也需要修改,可能有些不支持,比如这个barrier=1或者ext4特有的参数都删掉,先测试,确定参数能用之后在修改,可以免去不少麻烦,从新打包内核刷入。

格式化分区为 f2fs

TWRP在2.8之后支持格式化分区为f2fs,具体操作:Wipe >> Advanced Wipe >> 勾选 cache 和 data >> Repair or Change File System >> Change File System >> F2FS >> 确定。在此之前先备份好数据,这个操作会格式化掉内置储存卡数据。

其他

  • 先修改cache分区,不行刷回去即可,数据还在。
  • 编译完内核之后,先别急着修改,打包回去调试完,确认一切都OK后在修改ramdisk
  • ROOT+ADB是个好东西能省下不少操作
  • 分区能不能被正常挂载,在开机出现动画的时候,通过adb即可查看。
  • 修改内核之后顺带把USB debug开启,不然格式化data分区之后,adb没开。
  • 格式化data分区之后,第一次开机可能很久,耐心等待,也可能没有被正常挂载,无法开机。

下载

mkbootimg

unpackbootimg

htc m8 GPE 6.0内核添加f2fs驱动版本,这个找了很久。

开启之后效果有多明显呢?看这图就知道了

Screenshot-2017-10-31.png