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) |
2.2 检查点(Checkpoint)
检查点是F2FS实现崩溃一致性的核心机制。它本质上是一个文件系统状态的“快照”,记录了当前有效的NAT(节点地址表)、SIT(段信息表)以及当前活跃段的位置。F2FS在磁盘上维护两个检查点包(CP包),交替写入,确保写入过程中发生断电时至少有一个完整的检查点可用。
- CP包结构: 包含检查点头、NAT/SIT的当前版本号、孤儿节点inode列表、当前活跃段索引。
- 写入策略: 每5秒或触发特定条件(如脏页比例过高)时,内核线程
f2fs_sync_fs会发起一次检查点写入。 - 恢复流程: 挂载时读取两个CP包,选择有效序号(version)较大的那个进行恢复。
移植经验: 在嵌入式设备上,如果发现文件系统挂载后数据丢失或回滚,通常是因为检查点写入频率过高导致闪存寿命耗尽,或写入过程中掉电导致两个CP包均不完整。建议在移植时根据设备掉电概率调整
cp_interval 参数。
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效率越高,但空间浪费也越大(碎片化更严重)。
2.5 区域(Zone)
区域是F2FS中最高级别的空间划分单位,用于实现多设备(如RAID)或不同存储介质的隔离。每个区域包含多个节,且区域之间在逻辑上是独立的。F2FS支持将不同区域映射到不同的物理设备上,从而实现数据分级存储。
| 层级 | 单位大小 | 管理对象 | 主要作用 |
|---|---|---|---|
| 区域(Zone) | 若干节(可配置) | 设备映射 | 多设备隔离、分级存储 |
| 节(Section) | 若干段(默认2段) | 擦除块对齐 | GC效率优化 |
| 段(Segment) | 2 MB | SIT表 | GC基本单位、空间回收 |
| 块(Block) | 4 KB | NAT表 | 读写基本单位 |
2.6 五层结构在移植中的协同关系
在从ext4向F2FS移植文件系统时,这五层结构决定了以下关键适配点:
- 分区对齐: 必须确保分区起始地址与区域边界对齐,否则F2FS的GC效率会大幅下降。
- GC策略重写: ext4的块分配器基于位图,而F2FS的GC基于段的有效块比例。移植时需要将原有碎片整理逻辑替换为段级别的GC触发逻辑。
- 掉电保护: ext4依赖日志(JBD2),F2FS依赖检查点。移植时需要将日志提交接口替换为检查点触发接口。
- 温度分类: F2FS支持HOT/WARM/COLD三段分类,移植时可以将频繁写入的元数据标记为HOT,大文件数据标记为COLD,以优化GC效率。
移植检查清单:
- 确认底层NAND擦除块大小,配置正确的节大小(
-s参数)。 - 检查分区工具是否支持区域对齐(建议使用
parted的align-check)。 - 在驱动层实现检查点写入的原子性保证(通常依赖FUA或Cache Flush命令)。
- 将原有文件系统的
sync/fsync实现映射到F2FS的f2fs_sync_fs路径。