治肾虚不含糖,专注内核性能优化二十年。 https://github.com/KnightKu
分类: LINUX
2016-10-12 14:39:02
元数据区域包含以下几种元数据(参见博文:F2FS文件系统架构与原理分析(二)——磁盘布局 ):
(1) NAT —— Node Address Table
(2) SSA —— Segment Summary Area
(3) SB —— Superblock
(4) CP —— Checkpoint
(5) SIT —— Segment Information Table
与其他文件系统不同,F2FS 清晰地区分出传统超级块中的只读部分(Superblock,SB)和可修改部分(Checkpoint,CP),存放在两个单独的数据结构(BP 和 CP)中。
F2FS 的 f2fs_super_block 存储在设备的第二个块中,仅包含只读数据,称为超级块 Superblock (SB) 。一旦文件系统创建,SB 的信息就不会再改变,SB 描述了文件系统有多大、Segment 有多大、Section有多大、Zone 有多大以及分配了多少空间给各个部分的“元数据”区域以及其他少量的细节信息。
SB 位于文件系统分区的开头,有两个备份以避免文件系统 crash 无法恢复的情况发生。它包含基本的分区信息和默认的 F2FS 参数。
传统文件系统超级块中的可写信息,如空闲空间总量、下一个将要写入数据的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 项。
SIT 为每个 Segment 存储74字节的信息且与 Segment Summaries 分离,因为它修改的频率更高。它主要用来跟踪哪些数据块仍然是有效的(有效块个数以及数据块有效性 bitmap),因而当 Segment 中无有效块时,就可以回收该 Segment,或者当该 Segment 中有效数据块很少的时候进行 clean 操作。
存储在 Main 区域的所有节点(inode 和 索引节点)数据块的块地址表。
所有的节点(node)块由 NAT 映射,这意味着每个 node 的位置由 NAT 表来转换。考虑 wandering tree 问题,F2FS 使用这种节点映射索引方式可以切断由于叶子节点修改操作引起的节点更新传播问题,如下图两个所示,其中图(1)是传统 LFS 文件系统 wandering tree 结构叶子节点修改所引起的所有需要修改的节点(红勾表示);图(2)是传统 F2FS 文件系统采用 NAT 数据结构后叶子节点修改所引起的所有需要修改的节点(红勾表示);
图(1) 传统 LFS 文件系统 wandering tree 滚雪球效应
图(2) F2FS 文件系统引入NAT消除 wandering tree 滚雪球效应
SSA 中包含许多 summary 项, summary 项中包含存储在 Main 区域的所有数据和节点块( node blocks)的所有者信息。
当需要对 NAT 或 SIT 更新的时候,F2FS 并不是立即执行更新,而是将其存储(缓存)在内存中,直到下一个 Checkpoint 写入的时候才会真正更新NAT 或 SIT。如果更新相对很少,那这些更新就不会写到它们最终的位置,而是以日志的方式记录到Segment Summary Blocks 中的一些备用空间中,通常与Segment Summary Blocks 的更新同时写入。如果Segment Summary Blocks 需要更新的总量足够少,甚至没有写请求,SIT、NAT 和 SSA都与Checkpoint 一起以日志方式记录更新。因而当 F2FS 留下一些工作给 FTL 处理的时候,F2FS 试图友好地并且仅执行它不得不做的随机块更新。当 F2FS 需要做随机块更新的时候,它同时执行多个随机块的更新,这样可以减轻 FTL 的负担。
Main Area 包含文件和目录结构以及它们的索引数据。
为了避免文件系统和 flash 存储之间不对齐,F2FS 使 CP 的起始块地址与 Segment 大小对齐。同时,F2FS 使 Main Area 的起始块地址与 Zone 的大小对齐,这通过在 SSA 中预留一些 Segments 来实现对齐。
F2FS 采用 Checkpoint 机制维护文件系统的一致性。在挂载文件系统的时候,F2FS 首先尝试通过扫描 CP 区域找到最新的有效的 Checkpoint。为减少扫描时间, CP仅使用两个备份,其中一个备份中包含的是最新的有效数据。这种两个备份,且仅有一个包含最新版本有效数据的技术也称为 shadow copy 机制。除了 CP,NAT 和 SIT 也采用 shadow copy 机制保证数据一致性。
为保持文件系统一致性,每个 CP 指向有效的 NAT 和 SIT 备份,如下图所示: