F2FS
此条目需要扩充关于产品应用的内容。 (2018年12月12日) |
此条目需要精通或熟悉相关主题的编者参与及协助编辑。 |
开发者 | 三星电子、摩托罗拉移动和华为 |
---|---|
全称 | Flash-Friendly File System |
发布 | 2012-12-20[1] (Linux内核 3.8[2]) |
结构 | |
目录内容 | 多级哈希表 |
文件分配 | 位图(可用空间)、表 |
限制 | |
最大文件尺寸 | 3.94TB |
最大文件数量 | 取决于卷大小 |
最长文件名 | 255字节 |
最大卷容量 | 16TB |
功能 | |
日期记录 | 修改 (mtime), 属性修改 (ctime), 访问 (atime) |
日期分辨率 | 1 ns |
属性 | POSIX、扩展属性 |
文件系统权限 | POSIX、ACL |
透明压缩 | 否 |
透明加密 | 是 |
操作系统支持 | Linux |
F2FS(英语:Flash-Friendly File System)是一种闪存文件系统,主要由金载极(韩语:김재극)在三星集团研发,适合Linux内核使用[3]。
此文件系统起初是为了NAND闪存的存储装置设计(诸如固态硬盘、eMMC和SD卡),这些装置广泛存在于自移动设备至服务器领域。
三星应用了日志结构文件系统的概念,使它更适合用于存储装置。
特性
- 多头日志(Multi-head logging)
- 对目录项的多层哈希表
- 静态/动态冷热数据分离
- 自适应记录方案
- 可配置操作单元
- 双检查点
- 回滚和前滚恢复
- Heap-style块分配
- TRIM/FITRIM支持[4]
- 联机的文件系统/文件碎片整理[5]
- 内联xattrs[6]/数据[7]/目录[8]
- 脱机文件系统检查(检查和修复不一致)[9])
- 线性一致性[10]
- 文件系统级加密[11]
- 脱机调整大小[12]
- 内部定期数据刷新[13]
- 范围缓存[14]
设计
磁碟上布局
F2FS将整个卷分成多个段(segment),每个段固定为2 MB。一个节(section)由连续的段组成,一个区(zone)由一组节组成。默认情况下,节与区被设置为相同的大小,但用户可以用mkfs
轻松修改大小。
F2FS将整个卷划分为六个区域,除了超级块(superblock)以外的所有区都由多个段组成,如下所述。
- 超级块(Superblock,SB)
- 超级块位于分区起始处,共有两个副本以避免文件系统损坏。它包含基本的分区资讯和一些默认的F2FS参数。
- 检查点(Checkpoint,CP)
- 检查点包含文件系统资讯,有效NAT/SIT集的位图,孤立inode列表,以及当前活动段的摘要条目。
- 段资讯表(SIT)
- 段资讯表包含主区域块的有效块数量和有效位图。
- 节点地址表(NAT)
- 节点资讯表主区域节点块的地址表。
- 段摘要区(SSA)
- 段摘要区包含的条目包含主区域数据和节点块的所有者资讯。
- 主区域(Main Area)
- 主区域包含文件和目录数据及其索引(indices)。
为了避免文件系统与闪存之间的对齐错误,F2FS将CP的起始块地址与段大小对齐。它还通过在SSA区域中预留一些段来将“主区”起始块地址与区的大小对齐。
元数据结构
F2FS使用检查点方案来维护文件系统的完整性。在挂载时,F2FS首先尝试扫描CP区域来查找最后的有效检查点数据。为了缩短扫描时间,F2FS只使用CP的两个副本。其中一个总是指示最后的有效数据,这被称为影子副本机制。除了CP之外,NAT和SIT也使用影子副本机制。为了保证文件系统的一致性,每个CP指向的NAT和SIT副本都是有效的。
索引结构
关键的数据结构是“节点”。与传统的文件结构类似,F2FS有三种类型的节点:inode,直接节点,间接节点。F2FS将4 KB分配给一个inode块,其中包含923个数据块索引(data block indices),两个直接节点指针,两个间接节点指针,以及一个double间接节点指针,如下所述。一个直接节点块包含1018个数据块索引,而间接节点块包含1018个节点块索引。因此,一个inode块(即一个文件)涵盖:
4 KB × (923 + 2×1018 + 2×10182 + 10183) = 3.94 TB
注意,所有节点块都经NAT映射,因此每个节点的位置都经NAT转换。为了缓解漫游树问题,F2FS能够切断叶数据写入引起的节点更新传播。
目录结构
一个目录条目(dentry)占用11个字节,由以下属性组成。
hash | 文件名的散列值 |
---|---|
ino | Inode号码 |
len | 文件名长度 |
type | 文件类型,如目录、符号链接等。 |
一个目录条目块由214个目录条目槽[查证请求]及文件名组成。有一个位图用于记录每个目录条目是否有效。一个目录条目块占用4 KB,结构如下:
目录条目块 (4 K) = 位图 (27 字节) + 保留 (3 字节) + 目录项 (11 * 214 字节) + 文件名 (8 * 214 字节)
F2FS为目录结构实现了多级散列表,每一级有一个包含专用散列桶数的散列表,如下所示。“A(2B)”表示桶包含2个数据块。
- 项
- A表示桶(bucket)
- B表示块(block)
- N表示目录散列最大深度(MAX_DIR_HASH_DEPTH)
level #0 A(2B) level #1 A(2B) - A(2B) level #2 A(2B) - A(2B) - A(2B) - A(2B) ... level #N/2 A(2B) - A(2B) - A(2B) - A(2B) - A(2B) - ... - A(2B) ... level #N A(4B) - A(4B) - A(4B) - A(4B) - A(4B) - ... - A(4B)
当F2FS在一个目录中找一个文件名时,首先计算出该文件名的散列值,然后F2FS扫描级别#0的散列表一查找由文件名及其inode编号组成的目录条目。如果未找到,F2FS继续查找级别#1的散列表。F2FS通过此方法逐级扫描由1至N的每层散列表。在每一层中,F2FS只需扫描由以下等式确定的一个桶(bucket),因此展现出 O(log(# of files)) 的复杂度。
级别#n中要扫描的桶(bucket)数 = (散列值) % (级别#n中的桶数)
在创建文件时,F2FS找到一个能涵盖文件名的空的连续槽。F2FS以同样的方式由1至N查找各级散列表中的空槽。
默认的块分配
在运行时,F2FS在“主要区域:”内管理六个活动日志:热/暖/冷节点和热/暖/冷数据。
热节点 | 包含直接的目录节点块。 |
---|---|
暖节点 | 包含除热节点块以外的直接节点块。 |
冷节点 | 包含间接节点块。 |
热数据 | 包含目录条目块。 |
暖数据 | 包含除冷热数据块以外的数据块。 |
冷数据 | 包含多媒体数据或迁移的数据块。 |
基于日志的文件系统(LFS)有两种空闲空间管理方案:穿插记录(threaded log)与复制并压缩(copy-and-compaction)。后者也称为清理(cleaning),很适合有良好顺序写入性能的装置,因为空闲空间总用于写入新数据。但它会在发生高利用率时遭遇“清理”的开销。穿插记录则受到随机写入性能的影响,但没有“清理”过程。F2FS采用混合方案,默认采用“复制并压缩”,但根据文件系统的状态将策略动态变更为“穿插记录”方案。
为使F2FS与基于闪存的存储保持一致,F2FS以一个节(section)为单位分配一个段(segment)。F2FS预期节的大小与FTL中的垃圾收集单元大小相同。为考虑FTL中的映射粒度,F2FS将活动日志的每个节分配给尽可能多的不同区域。 FTL可以根据其映射粒度将活动日志数据写入一个分配单元。
清理流程
F2FS在需要时和后台闲置时进行清理。按需清理在没有足够的空闲分段(segments)服务VFS调用时触发。后台清理器由一个内核线程执行,在系统空闲时触发清理作业。
F2FS支持两种受者选择策略:贪婪、成本效益算法。在贪心算法中,F2FS选择有最小有效块数的受者段。在成本效益算法中,F2FS根据段的年龄和有效块数量选择受者段,以解决贪心算法中存在的日志块抖动问题。F2FS使用贪心算法进行按需清理,后台清理器则使用成本效益算法。
为识别受者段中的数据是否有效,F2FS管理了一个位图,其中用一个位元表示一个块的有效性,覆盖主区域所有块的位元流组成了该位图。
相关条目
参考资料
- ^ Michael Larabel. F2FS File-System Merged Into Linux 3.8 Kernel. Phoronix. 2012-12-22 [2016-05-25]. (原始内容存档于2016-06-30).
- ^ Pull new F2FS filesystem from Jaegeuk Kim (页面存档备份,存于互联网档案馆) merged by Linus Torvalds
- ^ f2fs: introduce flash-friendly file system (页面存档备份,存于互联网档案馆) by Kim Jaegeuk
- ^ Jaegeuk Kim. f2fs: introduce FITRIM in f2fs_ioctl. 2014-09-22 [2018-06-02]. (原始内容存档于2016-03-15).[需要较佳来源]
- ^ Chao Yu. f2fs: support file defragment. 2015-10-26 [2018-06-02]. (原始内容存档于2018-01-26).
- ^ Jaegeuk Kim. f2fs: add flags for inline xattrs. 2013-08-26 [2018-06-02]. (原始内容存档于2018-01-26).
- ^ Huajun Li. f2fs: Enable f2fs support inline data. 2013-11-10 [2018-06-02]. (原始内容存档于2018-01-26).
- ^ Chao Yu. f2fs: support inline dir. 2014-09-24 [2018-06-02]. (原始内容存档于2018-01-25).
- ^ Jaegeuk Kim. f2fs-tools: release 1.4.0. 2014-09-20 [2018-06-02]. (原始内容存档于2018-01-26).
- ^ Jaegeuk Kim. f2fs: support atomic_write feature for database. 2014-09-25 [2018-06-02]. (原始内容存档于2020-06-02).
- ^ Jaegeuk Kim. f2fs updates for v4.2. 2015-06-24 [2018-06-02]. (原始内容存档于2016-01-17).
- ^ Jaegeuk Kim. resize.f2fs: support to expand partition size. 2016-04-25 [2018-06-02]. (原始内容存档于2018-01-26).
- ^ Chao Yu. f2fs: support data flush in background. 2015-12-17 [2018-06-02]. (原始内容存档于2018-01-25).
- ^ Chao Yu. f2fs: enable rb-tree extent cache. 2015-01-25 [2018-06-02]. (原始内容存档于2018-01-25).
外部链接
- F2FS文档于kernel.org(页面存档备份,存于互联网档案馆)(英文)