f2fs解析-0-环境配置与阅读建议

环境配置

Linux

Linux 5.10被安卓系统广泛使用
1
2
3
4
5
git clone --depth 1 --single-branch --no-tags -b v5.10 https://github.com/torvalds/linux.git linux_5.10
cd linux_5.10
make menuconfig # (进入文件选项,开启F2FS)
# 使用GCC 10/GCC 11 编译不会报错
make -j$(nproc)

磁盘挂载与卸载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 使用dd创建空文件(快速方式)
dd if=/dev/zero of=f2fs_disk.img bs=1M count=131072 status=progress
# 关联到loop设备
sudo losetup -fP f2fs_disk.img

# 查看分配的loop设备
losetup -a

# 假设分配的是 /dev/loop3,创建F2FS文件系统
sudo mkfs.f2fs -l F2FS_VOLUME /dev/loop3

# 或者设置特定参数(推荐)
sudo mkfs.f2fs -f -l F2FS_DATA -O extra_attr,inode_checksum,sb_checksum,compression /dev/loop3

# 创建挂载点
sudo mkdir -p /mnt/f2fs_disk

# 挂载
sudo mount -t f2fs -o compress_algorithm=lz4,compress_extension=txt,atgc,gc_merge /dev/loop0 /mnt/f2fs_disk

# 验证挂载
df -hT /mnt/f2fs_disk
1
2
3
4
5
sudo umount /dev/loop3
# 卸载后分离 loop 设备
sudo losetup -d /dev/loop3
# 查看所有 loop 设备
losetup -a

代码阅读建议

  • 看文档、设计优于看代码;理解了设计,才能理解代码实现,反向推理很难
  • 找准入口,从关键结构体看, 从关键流程看: operation结构体; do_func ; flush_func; checkpoint/gc
  • 忽略噪音: Linux源码是工业级代码, 大量代码用于兼容、错误处理、标志位判断、封装。很多函数看名知意,没必要细看
  • 借助外挂无上智慧:多让AI解释,多和AI讨论

实操建议

  • 从f2fs-tool代码开始阅读调试(用户态+代码量小),理解元数据布局,f2fs设计理念

f2fs实现原则

  • f2fs使用各类缓存优化读写性能,减少磁盘写入; 增删改查时普遍先修改内存中的数据,等到sync/gc/unmount时写回数据到磁盘
  • 缓存的具体实现可以忽略,知道是什么就可以,真正的数据写回体现在flush/checkpoint相关函数
  • 磁盘写请求会下发给BlockLayer; BlockLayer会采用优化小IO,批量写回等多种方式优化性能;因此下发的写请求未必被立刻执行,需要主动交互并等待
    f2fs组件交互

参考资料