2. F2FS核心数据结构

F2FS(Flash-Friendly File System)是专为NAND闪存设计的日志结构文件系统。其核心数据结构围绕“日志结构化”与“闪存友好”两大原则设计,与传统的ext4在磁盘布局上存在本质差异。理解超级块、检查点、段、节、区域这五层结构,是进行文件系统移植工作的基础。

核心认知: F2FS将整个存储空间划分为多个区域(Zone),每个区域包含若干节(Section),节由段(Segment)组成。段是F2FS进行垃圾回收和空间管理的最小单元,而检查点(Checkpoint)则是保证文件系统一致性的关键快照机制。

2.1 超级块(Superblock)

F2FS的超级块位于分区的起始位置,用于描述整个文件系统的元数据。与ext4不同,F2FS在磁盘上维护两份超级块副本(主超级块和备份超级块),以增强对意外断电的容错能力。

字段 说明 移植关注点
magic 文件系统魔数(0xF2F52010) 用于识别F2FS格式
segment_count 总段数 决定文件系统最大容量
segment_count_main 主区域段数(不含前部元数据) 影响数据区起始偏移
section_blkaddr 每节包含的块数 与SSD块擦除大小对齐
log_blocksize 块大小(以2为底的对数) 通常为12(4KB)
F2FS 超级块布局(磁盘起始位置) 主超级块 (SB0) 备份超级块 (SB1) 检查点区域 (CP) 主区域 (数据 + NAT + SIT) 说明:F2FS 在磁盘起始保留约 1MB 空间用于超级块和检查点,之后才是主区域。 两份超级块副本确保在单块损坏时仍可恢复文件系统。

2.2 检查点(Checkpoint)

检查点是F2FS实现崩溃一致性的核心机制。它本质上是一个文件系统状态的“快照”,记录了当前有效的NAT(节点地址表)、SIT(段信息表)以及当前活跃段的位置。F2FS在磁盘上维护两个检查点包(CP包),交替写入,确保写入过程中发生断电时至少有一个完整的检查点可用。

  • CP包结构: 包含检查点头、NAT/SIT的当前版本号、孤儿节点inode列表、当前活跃段索引。
  • 写入策略: 每5秒或触发特定条件(如脏页比例过高)时,内核线程f2fs_sync_fs会发起一次检查点写入。
  • 恢复流程: 挂载时读取两个CP包,选择有效序号(version)较大的那个进行恢复。
移植经验: 在嵌入式设备上,如果发现文件系统挂载后数据丢失或回滚,通常是因为检查点写入频率过高导致闪存寿命耗尽,或写入过程中掉电导致两个CP包均不完整。建议在移植时根据设备掉电概率调整 cp_interval 参数。
检查点(Checkpoint)双缓冲机制 CP包 0 版本号: 100 NAT/SIT指针 CP包 1 版本号: 101 NAT/SIT指针 当前有效CP 版本号较大者 (CP包1) 写入流程: 1. 写入CP包0 → 2. 写入CP包1 → 3. 更新有效版本号 若写入CP包1时掉电,挂载时自动回退到CP包0,保证一致性

2.3 段(Segment)

段是F2FS进行空间管理和垃圾回收的基本单位。每个段的大小固定为2MB(512个4KB块)。F2FS通过SIT(Segment Information Table)来跟踪每个段的使用情况,包括有效块数量、有效块位图等。

属性 值 说明
段大小 2 MB 固定值,不可配置
每段块数 512 块大小4KB时
段类型 WARM / COLD / HOT 根据数据温度分类
管理结构 SIT(段信息表) 记录有效块数、位图
移植陷阱: 在从ext4移植到F2FS时,原有文件系统碎片整理策略需要重新设计。ext4的碎片整理基于块组,而F2FS的垃圾回收基于段。如果直接沿用ext4的碎片整理逻辑,可能导致F2FS的段利用率下降,触发频繁的GC,反而降低性能。

2.4 节(Section)

节是F2FS中用于与闪存擦除块(Block Erase Unit)对齐的逻辑概念。一个节包含若干个连续的段,其大小通常与底层NAND闪存的擦除块大小一致。例如,对于擦除块大小为4MB的闪存,一个节可以配置为包含2个段(2MB × 2 = 4MB)。

  • 对齐目的: 确保垃圾回收时,回收的段集合正好对应一个物理擦除块,避免跨擦除块操作。
  • 配置方式: 通过mkfs.f2fs -s参数指定每节的段数,默认值为2。
  • 性能影响: 节越大,GC效率越高,但空间浪费也越大(碎片化更严重)。
节(Section)与段(Segment)的关系 节(Section)= 2 × 段 = 4MB 段 0(2MB) 段 1(2MB) 说明:节的大小应与NAND擦除块大小对齐,本例中擦除块为4MB

2.5 区域(Zone)

区域是F2FS中最高级别的空间划分单位,用于实现多设备(如RAID)或不同存储介质的隔离。每个区域包含多个节,且区域之间在逻辑上是独立的。F2FS支持将不同区域映射到不同的物理设备上,从而实现数据分级存储。

层级 单位大小 管理对象 主要作用
区域(Zone) 若干节(可配置) 设备映射 多设备隔离、分级存储
节(Section) 若干段(默认2段) 擦除块对齐 GC效率优化
段(Segment) 2 MB SIT表 GC基本单位、空间回收
块(Block) 4 KB NAT表 读写基本单位
F2FS 五层空间结构总览 区域(Zone)— 设备映射层 节(Section)— 擦除块对齐层 段(Segment)— GC基本单位层 块(Block)— 读写基本单位层

2.6 五层结构在移植中的协同关系

在从ext4向F2FS移植文件系统时,这五层结构决定了以下关键适配点:

  1. 分区对齐: 必须确保分区起始地址与区域边界对齐,否则F2FS的GC效率会大幅下降。
  2. GC策略重写: ext4的块分配器基于位图,而F2FS的GC基于段的有效块比例。移植时需要将原有碎片整理逻辑替换为段级别的GC触发逻辑。
  3. 掉电保护: ext4依赖日志(JBD2),F2FS依赖检查点。移植时需要将日志提交接口替换为检查点触发接口。
  4. 温度分类: F2FS支持HOT/WARM/COLD三段分类,移植时可以将频繁写入的元数据标记为HOT,大文件数据标记为COLD,以优化GC效率。
移植检查清单:
  • 确认底层NAND擦除块大小,配置正确的节大小(-s参数)。
  • 检查分区工具是否支持区域对齐(建议使用parted的align-check)。
  • 在驱动层实现检查点写入的原子性保证(通常依赖FUA或Cache Flush命令)。
  • 将原有文件系统的sync/fsync实现映射到F2FS的f2fs_sync_fs路径。