Skip to content

Commit 46e03d3

Browse files
committed
upload images
1 parent 3ccfa0b commit 46e03d3

1 file changed

Lines changed: 9 additions & 9 deletions

File tree

为了工作/Linux/内核层/F2FS 文件系统.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ categories:
55
- 内核层
66
abbrlink: 257909f0
77
date: 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

110110
SuperBlock 区域的结构如下:
111111

112-
![image-20251224165214273](./F2FS 文件系统.assets/image-20251224165214273.png)
112+
![image-20251224165214273](https://cdn.davidingplus.cn/images/2025/12/29/image-20251224165214273.png)
113113

114114
Superblock区域是由两个 `struct f2fs_super_block` 结构组成,互为备份。
115115

@@ -538,7 +538,7 @@ Checkpoint(检查点,简称 CP)是 F2FS 维护数据一致性的灵魂结
538538
539539
CheckPoint 区域的结构如下。从图中看出分别是 checkpoint 元数据区域(f2fs_checkpoint)、orphan node 区域、active segments 区域。同时 active segments 区域在不同的情况下,会有不同的形式,目的是减少 IO 的写入。
540540
541-
![image-20251224170347186](./F2FS 文件系统.assets/image-20251224170347186.png)
541+
![image-20251224170347186](https://cdn.davidingplus.cn/images/2025/12/29/image-20251224170347186.png)
542542
543543
## f2fs_checkpoint 结构
544544
@@ -760,7 +760,7 @@ Segment Infomation Table,简称 SIT,是 F2FS 用于集中管理 segment 状
760760

761761
SIT 区域的结构如下。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

765765
SIT 的基本存放单元是 `struct f2fs_sit_block`,定义如下:
766766

@@ -1289,13 +1289,13 @@ static void init_dirty_segmap(struct f2fs_sb_info *sbi)
12891289

12901290
Node 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

12961296
NAT 区域由 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

15561556
SSA 的基本存放单元是 `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

16001600
F2FS 中的一个 inode,包含两个主要部分: metadata 部分,和数据块寻址部分。我们重点观察数据块寻址部分,分析 inode 时如何将数据块索引出来。在图中,数据块寻址部分包含 direct pointers,single-indirect,double-indirect,以及 triple-indirect。它们的含义分别是:
16011601

0 commit comments

Comments
 (0)