F2FS 基础知识一

在这里插入图片描述

整个磁盘区域被F2FS设计为6个区域,分别是Superblock,Checkpoint,Segment Info Table,Node Address Table,Segment Summary Area,以及Main Area。前5个区域总称为元数据区域,保存的是跟F2FS直接相关的元信息,而最后一个区域是保存文件数据的主要区域。
元数据区域的主要作用是维持F2FS的一致性,然而频繁地修改元数据区域的数据会带来性能下降,也会导致磁盘寿命的减少,因此F2FS给每个区域在内存中创建了一个专门的数据结构用于管理这些信息,并且在适当的时候再写入磁盘,从而提高性能,减少频繁的IO。

它们的作用分别是:

Superblock: 记录整个文件系统的分区信息,包括一共有多少个block,使用了多少block这些最基本同时也是最重要的信息。Superblock的初始化是读取经由mkfs.f2fs格式化的设备的原始信息。Superblock在内存中对应的结构是struct f2fs_sb_info。

Checkpoint: CP保存了一些当前正在使用的block,node等信息,并且在适当的时候,更新元数据区域信息。当系统突然重启等情况下,保证F2FS的一致性。Checkpoint在内存中对应的数据结构是struct curseg_info以及struct f2fs_checkpoint。

Segment Information Table(SIT): 保存了每一个segment的信息,例如这个segment使用了多少个block,然后是哪一个block被使用了,通过这些信息去管理已经被使用了的block和未使用的block,使系统可以合理分配block。SIT在内存中对应的数据结构是struct f2fs_sm_info。

Node Address Table(NAT): 建立一张表保存了每一个Node的地址信息,这些node的具体数据保存在Main Area,当需要寻找某一个Node时候,通过NAT确认Node的地址,然后将读取这个地址将Node的信息返回给调用者。NAT在内存中对应的数据结构是struct f2fs_nm_info。

Segment Summary Area(SSA): 这个区域主要保存了jounal(SIT/NAT的临时修改信息)以及summary(记录了逻辑页和物理页关系的结构)。用于提供临时存放journal以及根据物理页索引逻辑页的功能。SSA区域在内存中没有专门的数据结构。

Main Area: Main Area被4KB大小的block所填充,这些block可以分配给文件的data或者文件的node,是F2FS的主要数据保存区域。

在这里插入图片描述

Blocks->Segment->Section→Zone

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

(1)F2FS文件系统的所有块大小都是4KB,F2FS 代码隐式地将块大小链接到系统的页大小,因而F2FS不可能在更大的页的系统上运行,如 IA64 和 PowerPC。

(2) 块地址是32位的,最大文件系统是2^(32+12) Bytes,也就是16TB(完全大于当前的 NAND flash 设备的大小)。

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的额外空间用于其它目的。
2MB是最合适的Segment大小,太大不合适,太小又会造成存储summary信息的Block空间浪费;

2.1 Segment Sunmmary Area (SSA)

SSA 中包含许多 summary 项, summary 项中包含存储在 Main 区域的所有数据和节点块( node blocks)的所有者信息。

3、Sections

(1) 连续的Segments集合成Section。Section中具有的segments个数是任意的,但是要满足是2的幂;默认情况下,一个Section大小等同于一个Segment(2^0 Segments);

(2) 一个Section对应log structuring的一个区域“region”,log在使用下一个Section之前,通常要从头到尾将当前的Section填满数据;

(3) 清理器Cleaner一次处理一个Section;

(4) 在F2FS中,任意时刻都有6个“打开的”Sections用于将各种不同种类的数据(元数据、数据)分别写入到各个Sections中,实现数据分离。这样便允许文件内容(数据)与其索引信息(节点,node)分离,允许F2FS文件系统根据各种启发式方法将Sections划分成三类:即“hot”、“warm”、“cold”。例如,目录数据被当做hot来对待,使其与文件数据分离,存放到“hot”Section中。Cold数据是指那些很长时间内都不会改变的数据,因而装满Cold数据的Section就不需要执行Clean操作。对于hot节点(索引信息节点),一般更新很快,一段时间之后,装满 hot 节点的Section中的有效数据(alive data)就会很少,因而选择这样的Section进行Clean操作开销就很小(因为要转移的数据很少)。

在这里插入图片描述

4、Zone

(1) 连续的Sections集合成Zone。一个Zone可以包含任意整数个Sections。默认是一个Zone中包含一个Section;

(2) 设置Zone的唯一目的是尽可能将6个打开的Sections位于Flash设备的不同的子设备中。理论上,Flash设备通常是由一组相互完全独立的子设备构成,每个子设备都可单独地处理I/O请求,不同子设备可并行处理I/O请求;如果Zone的大小与子设备大小对齐,6个打开的Sections可并行写入,充分利用设备的特性;

(3) Zone构成了F2FS的“主要(main)”区域。

5、Meta Area

F2FS有一个“meta”区域,包含了各种不同的元数据(如之前提到的segment summary),这一部分不是采用标准的log-structured流水线方式管理,因而更多的工作留给了FTL去做。有三种方法管理对“meta”区域的写操作:

a) 第一,有少量的只读数据(超级块)从来都不是在文件系统创建的时候立即写入;

b) 第二,对Segment Summary Block 简单采取本地更新的方法。这种本地更新可能导致文件系统奔溃后数据块“修正”内容的不确定性,但对segment summary来说这都不是问题,segment summary blocks中的数据在使用前要进行有效性验证,如果有任何信息丢失的可能,它都将会在恢复进程中从其他source中恢复。

c) 第三种方法,分配需求空间两倍大小的空间,使得每个block都有两个不同的位置:一个Primary,一个Secondary,任意时刻,两个位置的block仅有一个是live状态。因而LFS的Copy-On-Write需求就可以通过向non-live位置的block写入更新后的block内容并且更新记录哪个位置的block是live状态的方式简单实现。对于元数据来说,这种技术是实现快照功能的主要实现方法。当创建一个Checkpoint的时候,F2FS执行少量的Journaling更新到最后的组(last group),这在一定程度上减轻了FTL的工作。

6、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 参数。

7、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。

Checkpoint 包含文件系统信息,有效NAT/SIT集的位图(bitmaps),Orphan inodes 的列表,以及当前有效 Segments 的 Summary 项。

8、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 操作。

9、Node Address Table (NAT):

It contains summary entries which contains the owner information of all the
data and node blocks stored in Main area.
它包含摘要条目,包含存储在主区域中的所有数据和节点块的所有者信息。

存储在 Main 区域的所有节点(inode 和 索引节点)数据块的块地址表。

所有的节点(node)块由 NAT 映射,这意味着每个 node 的位置由 NAT 表来转换。考虑 wandering tree 问题,F2FS 使用这种节点映射索引方式可以切断由于叶子节点修改操作引起的节点更新传播问题,如下图两个所示,其中图(1)是传统 LFS 文件系统 wandering tree 结构叶子节点修改所引起的所有需要修改的节点(红勾表示);图(2)是传统 F2FS 文件系统采用 NAT 数据结构后叶子节点修改所引起的所有需要修改的节点(红勾表示);

在这里插入图片描述

在这里插入图片描述

10、Main Area

It contains file and directory data including their indices.

Log区域(数据区域)——Main Area
Main Area 包含文件和目录结构以及它们的索引数据。

11、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

12、元数据更新

当需要对 NAT 或 SIT 更新的时候,F2FS 并不是立即执行更新,而是将其存储(缓存)在内存中,直到下一个 Checkpoint 写入的时候才会真正更新NAT 或 SIT。如果更新相对很少,那这些更新就不会写到它们最终的位置,而是以日志的方式记录到Segment Summary Blocks 中的一些备用空间中,通常与Segment Summary Blocks 的更新同时写入。如果Segment Summary Blocks 需要更新的总量足够少,甚至没有写请求,SIT、NAT 和 SSA都与Checkpoint 一起以日志方式记录更新。因而当 F2FS 留下一些工作给 FTL 处理的时候,F2FS 试图友好地并且仅执行它不得不做的随机块更新。当 F2FS 需要做随机块更新的时候,它同时执行多个随机块的更新,这样可以减轻 FTL 的负担。

13、地址对齐

为了避免文件系统和 flash 存储之间不对齐,F2FS 使 CP 的起始块地址与 Segment 大小对齐。同时,F2FS 使 Main Area 的起始块地址与 Zone 的大小对齐,这通过在 SSA 中预留一些 Segments 来实现对齐。

14、F2FS文件系统元数据管理

F2FS 采用 Checkpoint 机制维护文件系统的一致性。在挂载文件系统的时候,F2FS 首先尝试通过扫描 CP 区域找到最新的有效的 Checkpoint。为减少扫描时间, CP仅使用两个备份,其中一个备份中包含的是最新的有效数据。这种两个备份,且仅有一个包含最新版本有效数据的技术也称为 shadow copy 机制。除了 CP,NAT 和 SIT 也采用 shadow copy 机制保证数据一致性。

为保持文件系统一致性,每个 CP 指向有效的 NAT 和 SIT 备份,如下图所示
在这里插入图片描述

元数据区域包含以下几种元数据:

(1) NAT —— Node Address Table

(2) SSA —— Segment Summary Area

(3) SB —— Superblock

(4) CP —— Checkpoint

(5) SIT —— Segment Information Table

F2FS同时维护6个日志,每个日志的存储单位是Sections,但是默认的情况下Section大小与segment大小是相同的2MB,所以你看到的代码就是以segment为单位进行日志处理的。逻辑结构Section的想法要结合SSD或Flash设备的特性来看,以Section为单位主要是考虑到一种"对齐机制",因为SSD的不同的Die是可以并行读写的,因而只要保证6个日志要写入的数据在6个不同的Die上,那么6个log就可以并行写入了,提升了处理速度。如果不是按这种“对齐”处理的话,就会出log之间的阻塞等待,增加了处理延时。

SSD的Die是不是最小的并行写入单元,我这边不是太确定了,很早之前看过的东西,不是它就是另外一个叫做Plane的单元。
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
f2fs文件系统调用主要涉及以下几个组件和函数: 1. 文件系统类型定义:在f2fs文件系统中,通过定义一个file_system_type结构体来表示文件系统类型。其中包括了文件系统的名称、挂载函数、卸载函数等信息。在f2fs中,文件系统类型定义如下: static struct file_system_type f2fs_fs_type = { .owner = THIS_MODULE, .name = "f2fs", .mount = f2fs_mount, .kill_sb = kill_block_super, .fs_flags = FS_REQUIRES_DEV, }; 2. 挂载函数:f2fs_mount函数是用来将块设备挂载成f2fs文件系统的函数。它是通过调用mount_bdev函数来实现的。具体的挂载过程包括了填充f2fs super block信息等操作。在f2fs中,挂载函数定义如下: static struct dentry *f2fs_mount(struct file_system_type *fs_type, int flags, const char *dev_name, void *data) { return mount_bdev(fs_type, flags, dev_name, data, f2fs_fill_super); } 3. 填充super block信息:f2fs_fill_super函数用来填充f2fs文件系统的super block信息。它会读取块设备上的super block数据,并将其解析为内存中的数据结构。在f2fs中,填充super block信息的函数定义如下: static int f2fs_fill_super(struct super_block *sb, void *data, int silent) { // 填充super block信息的具体实现 } 通过以上组件和函数,f2fs文件系统可以被调用和使用。当用户在用户空间执行mount操作时,会回调到文件系统类型中定义的mount函数,即f2fs_mount函数。在f2fs_mount函数中,会调用mount_bdev函数来实现具体的挂载过程,包括填充super block信息等操作。最终,f2fs文件系统就可以被成功挂载和使用。 #### 引用[.reference_title] - *1* [f2fs学习笔记 - 4. f2fs文件系统组件说明](https://blog.csdn.net/jasonactions/article/details/122417105)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [f2fs学习四: f2fs文件系统挂载](https://blog.csdn.net/guozhidixian/article/details/115498708)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值