1. 前言

本文主要从总体的角度来了解f2fs,尝试回答下面的几个问题来靠近它,这几个问题包括:

  • f2fs是什么?
  • 为何引入f2fs?
  • f2fs如何工作?

2. f2fs是什么?

F2FS (Flash Friendly File System) 是专门针对SSD、eMMC、UFS等闪存设备设计的文件系统。基于LFS,同时解决了LFS的一些问题。由三星工程师Jaegeuk Kim于2012年10月发布到Linux社区,并于2012年12月进入Linux 3.8 内核主线,初始 版本包含22个patch。初始版本kernel 3.8(2012年)的代码量为1万多行,22个提交,截止到kernel 5.8-rc2(2020年)的代码量为4万多行,2899个提交。

3. LFS特点


LFS最大的特点是以日志的形式将对文件的修改顺序写入磁盘,化随机写入为顺序写入,如上创建文件file1,file2,创建目录dir1,dir2,对于FFS会有10次的随机写入,而对于LFS将以日志的方式一次从内存中写入, 同时也要写入inode map,inode map记录了每个inode所在的block地址,索引为inode号,inode map所在的block地址被记录在F2FS的CP区域。

Flash memory的特点
(1)Out-place 更新 (非in-place更新)
(2)随机写入会增加GC垃圾回收开销
(3)顺序写入速率高于随机写入速率
LFS的特点
(1)Out-place更新
(2)大量的采用顺序写入
因此LFS对Flash memory是友好的文件系统 ,而f2fs基于LFS,因此也是对flash友好的文件系统

LFS的不足:
(1)针对HDD进行优化的文件系统布局
(2)仍然存在Wandering Tree(雪崩)问题
(3)没有进行冷热数据分离
(4)磁盘高利用率的情况下垃圾回收成本高

4. f2fs解决了哪些问题?

采用falsh友好的文件系统布局



解决了Wandering Tree(雪崩)问题


传统的LFS索引结构,由于异地更新在修改文件数据时会引发直接或间接node以及inode和inode map的一系列修改,称为wandering tree问题

F2FS索引结构,通过引入NAT,保存所有node的信息,间接node不再指向直接node,而是指向NAT区,解决了wandering tree问题

使用Multi-head log,同时将冷热数据分离


main area分为node block和data block
将node block和data block进行冷热分离
有效减少GC cost

node block与data block分离, 冷热数据分离,将不同数据存放到不同的zone中,有利于FTL进行GC垃圾回收,如上图,假设zone对应flash中的一个block,则zone-aware allocation可以做到冷热数据分配到不同的zone,也就分配到不同的flash block中

采用自适应的log方式

  • Normal logging
    追加式logging,只会向clean segment写入
    如果没有空闲空间,需要执行GC操作
    GC操作会带来随机读和顺序写开销
  • Thread logging
    向dirty的segment写入
    不需要GC操作
    会引起随机写入
  • Normal logging与thread logging的切换
    当空闲空间低于阀值(e.g.k=5% )将采用thread logging,否则采用normal logging

5. f2fs是如何工作的?

f2fs文件读取(/File)

  • Setp 1首先通过superblock获取root inode号(==nid,假设为3),通过NAT获取root inode所在的node block地址
  • Setp 2 通过root inode找到root目录的data block地址
  • Setp 3 通过文件名File遍历每一个entry,找到File对应的inode号,通过inode号(==nid)查NAT
  • Setp 4 通过NAT找到File的inode所在的node block地址,它存储了File的direct node的nid(假设为7)

  • Setp 5 通过file的inode找到direct node的nid(假设为7),通过查找NAT,找到direct node的node block地址
  • Setp 6 File的direct node中保存着File的data block的地址,根据这些data block地址就可以读取到File的数据

F2FS GC垃圾回收

  • GC回收分为foreground gc和background gc
    当没有足够空闲的segment(一般是小于reserved segments)时将启动foreground gc
    当系统没有进行IO操作时,将启动background gc thread,回收的时间间隔会根据invalid blocks的多少进行调整
    foreground gc采用greedy算法,只考虑dirty invalid blocks数目; background gc采用cost-benefit算法,还考虑了segment的修改时间

  • Cost-benefit算法
    cost_benefit = (1 - u) / 2u * age
    u: 表示valid block在该section中的比例
    1-u: 表示对这个section进行gc后的收益
    2u: 表示对这个section的GC的开销,读取Valid block(1个u)然后写入到到新的segment(再1个u)
    age: 表示上一次修改距离现在的时间差
    NOTE:cost_benefit值越大表示越值得回收

F2FS checkpoint

Checkpoint执行的操作:

  1. 将page cache中的dirty node和dentry block flush到磁盘;
  2. Suspend冻结文件系统操作,如create,unlink,mkdir等
  3. 文件系统元数据NAT, SIT, SSA写入磁盘各自区域;
  4. 写checkpont pack部分,主要包括:
    Header和footer checkpoint page;
    NAT bitmap和SIT bitmap
    NAT journal和SIT journal
    Active segments的summary blocks
    Orphan blocks

F2FS recovery


step 1 创建dir1, file1, file2

step 2 触发checkpoint,此时数据与元数据保持一致性状态

step 3 更新file2, 并将记录file2更新数据块号的new file2 node作fsync mark标记


step 4 此时更新的new file2后并没有执行checkpoint,发生了断电,数据和元数据不一致

step 5 执行修复,首先通过roll-back,找到最新的稳定的checkpoint pack版本


step 6 比较file2 node和new file2 node中所记录的data block块号是否相等,如果不相等将执行roll-forward恢复

step 6 执行新的checkpoint

参考文档

Lee et. al, F2FS: A New File System for Flash Storage, FAST ’15
Linux/Document/filesystems/f2fs.txt
F2FS技术拆解
F2FS源码分析-1.3 [F2FS 元数据布局部分] Checkpoint结构
f2fs系列文章——sit/nat_version_bitmap
http://www.ssdfans.com/?p=5135 greedy和cost-and-benefit
https://github.com/jasonactions/f2fs-initial f2fs初始版本注释

f2fs学习笔记 - 1. f2fs概述相关推荐

  1. f2fs学习笔记 - 2. f2fs基础实验环境搭建

    1.前言 本文主要记录如何搭建f2fs的环境,用于f2fs文件系统的学习.我们选用了f2fs第一个补丁提交前的内核版本:linux3.7.0.然后通过提取出f2fs的最小补丁来学习f2fs文件系统,这 ...

  2. f2fs学习笔记 -11. f2fs gc

    1.前言 GC分为前台GC和后台GC 2.总体流程 f2fs_fill_superstart_gc_thread(sbi)init_waitqueue_head(&sbi->gc_thr ...

  3. f2fs学习笔记 - 7. f2fs文件打开

    1. 前言 本文主要总结f2fs文件的打开过程,以touch test为例 2.打开文件总体流程 在打开文件时,获取了file描述符,创建了file, 而file->op_s来源于file所对应 ...

  4. f2fs学习笔记 - 6. f2fs初始化流程

    1.前言 初始流程主要包含f2fs文件系统初始化,以及f2fs文件系统mount 2. init_f2fs_fs init_inodecache 创建f2fs_inode_cache slab描述符 ...

  5. f2fs学习笔记 - 5. f2fs基本类图

    f2fs_nat_entry f2fs node address table entry, 可以认为是main area区域的node block的描述符.version? ino为node所对应的i ...

  6. f2fs学习笔记 -10. f2fs fsync

    kernel:linux3.17 fs: f2fs初始版本 1.前言 本文主要记录f2fs fsync的流程. 2.总体流程 do_fsyncfget(fd)vfs_fsync(file, file- ...

  7. RN学习笔记01:概述、特点与环境搭建

    RN学习笔记01:概述.特点与环境搭建 一.RN概述 React Native(简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是Facebook早先开源的JS框架 Reac ...

  8. IOS学习笔记03---C语言概述

    IOS学习笔记03---C语言概述 0 3.C语言1-C语言概述         qq交流群:创梦技术交流群:251572072                        创梦网络赚钱群:2483 ...

  9. 知识图谱·概念与技术--第1章学习笔记--知识图谱概述--知识图谱的概念,与传统语义网络的区别

    知识图谱·概念与技术--第1章学习笔记--知识图谱概述--知识图谱的概念,与传统语义网络的区别 知识图谱的概念,与传统语义网络的区别 狭义概念 作为语义网络的内涵 与传统语义网络的区别 优点 缺点 与 ...

  10. oracle学习笔记 Oracle体系结构概述

    oracle学习笔记 Oracle体系结构概述 从这节开始,开始讲oracle数据库体系结构. 首先从总体上,从概述上把oracle整体的体系结构讲一下, 然后接下来的时间我们会一块一块的将oracl ...

最新文章

  1. 解析得了数学,写得了诗书,这是个有趣的灵魂
  2. CentOS 安装JDK跟TOMCAT
  3. 【数据结构笔记10】二叉树的先序、中序、后序遍历,中序遍历的堆栈/非递归遍历算法,层序遍历,确定一个二叉树,树的同构
  4. 32.go defer
  5. sem_timedwait的用法
  6. 当下最实用计算机编程语言,目前最流行的计算机编程语言是什么?
  7. 浙江省计算机二级办公软件高级应用技术,浙江省计算机二级办公软件高级应用技术考试大纲.doc...
  8. Maven环境变量配置不成功
  9. Hello Python(十七)——Python扩展模块开发
  10. notepad++设置背景颜色为豆沙绿
  11. 什么是vr直播?新上线APP 3分钟开启vr直播大秀
  12. 处理器仿存带宽_存储系统性能 - 带宽计算
  13. C语言经典面试题 - 字母的大小写转化
  14. 《阅读的方法》读书笔记2-2:遥远的地方
  15. 苹果输入法怎么换行_最全的输入法皮肤,你想要的百度输入法都有
  16. Canny边缘检测算法(python 实现)
  17. 非对称密码体制(公钥密码体制)中最基础的思路——MOD的运算
  18. 国外大神数据,全球主板厂商信息汇总,A B X系在主板汇总
  19. 华硕品牌笔记本电脑一键u盘启动详细图文教程
  20. 将c#窗体从一个项目1移动到另外一个项目2中

热门文章

  1. js根据本地文件路径上传文件(流上传)
  2. EndNoteX7中conference proceeding和conference paper的区别
  3. js实现json转excel的npm包
  4. Linux快捷键笔记
  5. endnotex8使用教程_EndNote X8初级教程(原创)
  6. 熵权法计算权重原理python实现
  7. AIML自己的学习笔记
  8. windows安装tomcat8
  9. C# ZipArchive 文件末端错误 的解决方案
  10. 解决 Win 10 输入法(仅桌面)的问题