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
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文无所谓版权,欢迎转载。

  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
f2fs文件系统的inode结构包含以下字段: - i_mode:表示文件类型和权限信息的位掩码。 - i_uid:表示文件所属用户的用户ID。 - i_gid:表示文件所属组的组ID。 - i_links:表示链接数,即有多少个目录项引用这个inode。 - i_atime:表示最后一次访问该文件的时间。 - i_mtime:表示最后一次修改该文件内容的时间。 - i_ctime:表示最后一次修改该文件元数据的时间。 - i_size:表示文件的大小。 - i_blocks:表示文件占用的物理块数。 - i_advise:表示为该文件进行的优化建议。 - i_inline:表示是否使用内联扩展属性。 - i_xattr:表示扩展属性的头部信息,包括扩展属性数量等信息。 - i_projid:表示项目ID,用于POSIX ACL(Access Control List)的访问控制。 其中,i_mode、i_uid、i_gid、i_size等字段与其他文件系统的inode结构类似,不再赘述。其余字段的含义如下: - i_links:在f2fs中,当一个文件被删除时,其目录项并不会立即从目录中移除,而是等到该文件的链接数减为0时才会被彻底删除。 - i_atime、i_mtime、i_ctime:与传统UNIX文件系统中的意义相同。 - i_blocks:在f2fs中,文件的大小不需要按照块的倍数对齐,因此i_size和i_blocks可能会不一致。 - i_advise:f2fs使用一些特有的优化策略,例如区域性文件访问预测(FSRB,File System Redundant Block)和节点合并(Node Merge),因此i_advise字段记录了针对该文件的建议。例如,一个频繁被访问的文件,i_advise可能会设置为FSRB。 - i_inline、i_xattr:f2fs支持将一些较小的文件内容和扩展属性直接存储在inode中,从而避免了寻找对应的物理块的开销。 - i_projid:用于实现命名空间隔离和ACL的访问控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值