@@ -5,7 +5,7 @@ categories:
55 - 内核层
66abbrlink : 257909f0
77date : 2025-12-24 17:30:00
8- updated : 2025-12-25 16:40:00
8+ updated : 2025-12-29 16:40:00
99---
1010
1111<meta name =" referrer " content =" no-referrer " />
@@ -71,7 +71,7 @@ F2FS 的核心精髓在于它能感知数据的“温度”。Log 区域指的
7171
7272## 闪存设备物理布局
7373
74- ![ image-20251224164153966] (./F2FS 文件系统.assets /image-20251224164153966.png)
74+ ![ image-20251224164153966] ( https://cdn.davidingplus.cn/images/2025/12/29 /image-20251224164153966.png)
7575
7676通过 mkfs.f2fs 格式化后,整个存储空间被划分为六大功能区。除了主数据区外,前五个区域统称为元数据区。
7777
@@ -109,7 +109,7 @@ SIT 负责监控 **Main Area** 中每个 Segment 的使用情况。它包含一
109109
110110SuperBlock 区域的结构如下:
111111
112- ![ image-20251224165214273] (./F2FS 文件系统.assets /image-20251224165214273.png)
112+ ![ image-20251224165214273] ( https://cdn.davidingplus.cn/images/2025/12/29 /image-20251224165214273.png)
113113
114114Superblock区域是由两个 ` struct f2fs_super_block ` 结构组成,互为备份。
115115
@@ -538,7 +538,7 @@ Checkpoint(检查点,简称 CP)是 F2FS 维护数据一致性的灵魂结
538538
539539CheckPoint 区域的结构如下。从图中看出分别是 checkpoint 元数据区域(f2fs_checkpoint)、orphan node 区域、active segments 区域。同时 active segments 区域在不同的情况下,会有不同的形式,目的是减少 IO 的写入。
540540
541- 
541+ 
542542
543543## f2fs_checkpoint 结构
544544
@@ -760,7 +760,7 @@ Segment Infomation Table,简称 SIT,是 F2FS 用于集中管理 segment 状
760760
761761SIT 区域的结构如下。SIT 区域由 N 个 ` struct f2fs_sit_block ` 组成,每一个 ` struct f2fs_sit_block ` 包含了 55 个 ` struct f2fs_sit_entry ` ,每一个 entry 对应了一个 segment 的管理状态。每一个 entry 包含了三个变量: vblocks(记录这个 segment 有多少个 block 已经被使用了),valid_map(记录这个 segment 里面的哪一些 block 是无效的),mtime(表示修改时间)。
762762
763- <img src =" ./F2FS 文件系统.assets /image-20251225152548700.png" alt =" image-20251225152548700 " style =" zoom :67% ;" />
763+ <img src =" https://cdn.davidingplus.cn/images/2025/12/29 /image-20251225152548700.png" alt =" image-20251225152548700 " style =" zoom :67% ;" />
764764
765765SIT 的基本存放单元是 ` struct f2fs_sit_block ` ,定义如下:
766766
@@ -1289,13 +1289,13 @@ static void init_dirty_segmap(struct f2fs_sb_info *sbi)
12891289
12901290Node Address Table,简称 NAT,是 F2FS 用于集中管理 node 的结构。** 它的主要维护了一张表(如下图),记录了每一个 node 在 flash 设备的物理地址。** F2FS 给每一个 node 分配了一个 node ID(nid),系统可以根据 nid 从 NAT 查找到该 node 在 flash 设备上的物理地址,然后从 flash 设备读取出来。表的结构如下:
12911291
1292- ![ image-20251225153846231] (./F2FS 文件系统.assets /image-20251225153846231.png)
1292+ ![ image-20251225153846231] ( https://cdn.davidingplus.cn/images/2025/12/29 /image-20251225153846231.png)
12931293
12941294## 元数据的物理结构
12951295
12961296NAT 区域由 N 个 ` struct f2fs_nat_block ` 组成,每一个 ` struct f2fs_nat_block ` 包含了 455 个 ` struct f2fs_nat_entry ` 。每一个 nid 对应了一个 entry,每一个 entry 记录了这个 node 的在 flash 设备上的物理地址 block_addr。同时 entry 也记录了一个 ino 的值,这个值用于找到这个 node 的 parent node,如果 nid == ino 则表示这个 node 是 inode,如果 nid != ino,则表示这是一个 direct_node 或者 indrect_node。version 变量用于系统恢复。
12971297
1298- <img src =" ./F2FS 文件系统.assets /image-20251225153933456.png" alt =" image-20251225153933456 " style =" zoom :65% ;" />
1298+ <img src =" https://cdn.davidingplus.cn/images/2025/12/29 /image-20251225153933456.png" alt =" image-20251225153933456 " style =" zoom :65% ;" />
12991299
13001300## 内存管理结构
13011301
@@ -1551,7 +1551,7 @@ Segment Summary Area,简称 SSA,是 F2FS 用于集中管理物理地址到
15511551
15521552` f2fs_journal ` 属于 journal 的信息,它的作用是减少频繁地对 NAT 区域以及 SIT 区域的更新。例如,当系统写压力很大的时候,segment bitmap 更新就会很频繁,就会对 ` struct f2fs_sit_entry ` 结构进行频繁地改动。如果这个时候频繁将新的映射关系写入 SIT,就会加重写压力。此时可以将数据先写入到 journal 中,因此 ** journal 的作用就是维护这些经常修改的数据,等待 CP 被触发的时候才写入磁盘,从而减少写压力** 。也许这里会有疑问,为什么将 journal 放在 SSA 区域而不是 NAT 区域以及 SIT 区域呢?这是因为这种存放方式可以减少元数据区域空间的占用。
15531553
1554- <img src =" ./F2FS 文件系统.assets /image-20251225154609242.png" alt =" image-20251225154609242 " style =" zoom :67% ;" />
1554+ <img src =" https://cdn.davidingplus.cn/images/2025/12/29 /image-20251225154609242.png" alt =" image-20251225154609242 " style =" zoom :67% ;" />
15551555
15561556SSA 的基本存放单元是 ` struct f2fs_summary_block ` ,定义如下:
15571557
@@ -1595,7 +1595,7 @@ SSA 在内存没有单独的管理结构,summary 以及 journal 在内存中
15951595
15961596文件数据的组织方式一般时被设计为 inode-data 模式,即每一个文件都具有一个 inode,这个 inode 记录 data 的组织关系,这个关系称为** 文件结构** 。例如用户需要访问 A 文件的第 1000 个字节,系统就会先根据 A 文件的路径找到的 A 的 inode,然后从 inode 找到第 1000 个字节所在的物理地址,然后从磁盘读取出来。那么 F2FS 的文件结构是怎么样的呢?
15971597
1598- <img src =" ./F2FS 文件系统.assets /image-20251225155522809.png" alt =" image-20251225155522809 " style =" zoom :80% ;" />
1598+ <img src =" https://cdn.davidingplus.cn/images/2025/12/29 /image-20251225155522809.png" alt =" image-20251225155522809 " style =" zoom :80% ;" />
15991599
16001600F2FS 中的一个 inode,包含两个主要部分: metadata 部分,和数据块寻址部分。我们重点观察数据块寻址部分,分析 inode 时如何将数据块索引出来。在图中,数据块寻址部分包含 direct pointers,single-indirect,double-indirect,以及 triple-indirect。它们的含义分别是:
16011601
0 commit comments