F2FS文件系统一 设计背景及框架结构【转】

转自:https://blog.csdn.net/frank_zyp/article/details/96426334

一、F2FS文件系统简介

1、背景:

  F2FS (Flash Friendly File System) 是专门为基于 NAND 的存储设备设计的新型开源 flash 文件系统。

特别针对NAND 闪存存储介质做了友好设计。F2FS 于2012年12月进入Linux 3.8 内核。目前,F2FS仅支

持Linux操作系统。

2、解决的问题:

(1)LFS(Log-strctured File System)

  为管理磁盘上的大的连续的空间以便快速写入数据,将 log 切分成 Segments,使用 Segment Cleaner 

从重度碎片化的 Segment 中转移出有效的信息,然后将该 Segment 清理干净用于后续写入数据。

(2)wandering tree 的滚雪球效应

  在 LFS 中,当文件的数据块被更新的时候是写到 log 的末尾,该数据块的直接指针也因为数据位置的改

变而更改,然后间接指针块也因为直接指针块的更新而更新。按照这种方式,上层的索引结构,如inode、inode

map 以及 checkpoint block 也会递归地更新。这就是所谓的 wandering tree 问题。为了提高性能,数据块更新

的时候应该尽可能地消除或减少wandering tree 的更新节点传播。

二、F2FS layout:

  F2FS 将整个卷切分成大量的 Segments,每个 Segment 的大小是固定的2 MB。连续的若干个Segments 

构成 Section,连续的若干个 Sections 构成 Zone。默认情况下一个 Zone 大的大小是一个 Section,而一个 

Section 的大小是一个 Segment。F2FS 将整个卷切分成6个区域,除了超级块(Superblock,SB)外,其余每个

区域都包含多个Segments。其结构如下图所示:

三、各个结构介绍(Block/Segments......):

可以参考kernel-4.9\Documentation\filesystems\f2fs.txt

1、Blocks:F2FS文件系统的所有块大小都是4KB;

2、Segments:

  连续的Blocks集合成Segments,一个Segment的大小是512个Blocks(2MB),每个Segment都有一个

Segment Summary Block元数据结构,描述了Segment 中的每个Block的所有者(该块所属的文件及块

在文件内的偏移)。Segment Summary主要用于在执行Cleaning操作时识别哪些Blocks中的数据需要转

移到新的位置,以及在转移之后如何更新Blocks的索引信息。一个Block就可以完全存储512个Blocks的

summary信息,每个blocks都有一个1 bit的额外空间用于其它目的。

3、Superblock (SB):

  1.  
    It is located at the beginning of the partition, and there exist two copies
  2.  
    to avoid file system crash. It contains basic partition information and some
  3.  
    default parameters of f2fs

  与其他文件系统不同,F2FS 清晰地区分出传统超级块中的只读部分(Superblock,SB)和可修改部分

(Checkpoint,CP),存放在两个单独的数据结构(BP 和 CP)中。

  F2FS 的 f2fs_super_block 存储在设备的第二个块中,仅包含只读数据,称为超级块 Superblock (SB) 。

一旦文件系统创建,SB 的信息就不会再改变,SB 描述了文件系统有多大、Segment 有多大、Section有多大、

Zone 有多大以及分配了多少空间给各个部分的“元数据”区域以及其他少量的细节信息。

  SB 位于文件系统分区的开头,有两个备份以避免文件系统 crash 无法恢复的情况发生。它包含基本的分区

信息和默认的 F2FS 参数。

 

4、Checkpoint (CP):

  1.  
    It contains file system information, bitmaps for valid NAT/SIT sets, orphan
  2.  
    inode lists, and summary entries of current active segments.

  文件系统超级块中的可写信息,如空闲空间总量、下一个将要写入数据的Segment的地址以及其他可更改

信息存储在 f2fs_checkpoint 中,称为 Checkpoint (CP)。“Checkpoint”是一种元数据类型,允许使用两个位置

(two-location)方法实现 copy-on-write——有两个相邻的 Segments,每个都存储一个 Checkpoint,但仅有一个

是当前有效使用的。Checkpoint 包含一个版本号,因而当文件系统挂载的时候,两个Checkpoint 都被读取,但

是使用的是仅有较高的版本号的Checkpoint 作为有效使用的Checkpoint。

 

5、Segment Information Table (SIT):

  1.  
    It contains segment information such as valid block count and bitmap for the
  2.  
    validity of all the blocks.

  SIT 为每个 Segment 存储74字节的信息且与 Segment Summaries 分离,因为它修改的频率更高。它主要

用来跟踪哪些数据块仍然是有效的(有效块个数以及数据块有效性 bitmap),因而当 Segment 中无有效块时,就

可以回收该 Segment,或者当该 Segment 中有效数据块很少的时候进行 clean 操作。

 

6、Node Address Table (NAT)

  1.  
    It contains summary entries which contains the owner information of all the
  2.  
    data and node blocks stored in Main area.

 

7、Main Area

It contains file and directory data including their indices.

8、At runtime, F2FS manages six active logs inside "Main" area: Hot/Warm/Cold node
and Hot/Warm/Cold data:

  1.  
    - Hot node contains direct node blocks of directories.
  2.  
    - Warm node contains direct node blocks except hot node blocks.
  3.  
    - Cold node contains indirect node blocks
  4.  
    - Hot data contains dentry blocks
  5.  
    - Warm data contains data blocks except hot and cold data blocks
  6.  
    - Cold data contains multimedia data or migrated data blocks

 

作者:frank_zyp
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文无所谓版权,欢迎转载。

posted @   Sky&Zhang  阅读(1383)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
历史上的今天:
2018-11-23 Linux下clock计时函数学习【转】
2018-11-23 linux 用户空间获得纳秒级时间ns【转】
2018-11-23 linux下获取微秒级精度的时间【转】
2018-11-23 Linux 应用层的时间编程【转】
2018-11-23 Linux内存分配小结--malloc、brk、mmap【转】
2018-11-23 很清晰的解读i2c协议【转】
2016-11-23 数据终端设备与无线通信模块之间串行通信链路复用协议(TS27.010)在嵌入式系统上的开发【转】
点击右上角即可分享
微信分享提示