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

一、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):

It is located at the beginning of the partition, and there exist two copies
   to avoid file system crash. It contains basic partition information and some
   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):

It contains file system information, bitmaps for valid NAT/SIT sets, orphan
   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):

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

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

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

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

6、Node Address Table (NAT)

It contains summary entries which contains the owner information of all the
   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:

- Hot node	contains direct node blocks of directories.
- Warm node	contains direct node blocks except hot node blocks.
- Cold node	contains indirect node blocks
- Hot data	contains dentry blocks
- Warm data	contains data blocks except hot and cold data blocks
- Cold data	contains multimedia data or migrated data blocks

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

发布了59 篇原创文章 · 获赞 80 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/frank_zyp/article/details/96426334