上一篇我们搞懂了磁盘底层和基础概念,这一篇聚焦 Linux 最常用的 Ext 系列文件系统(Ext2/Ext3/Ext4)—— 它就像一个 “管理员”,用标准化的结构和实用功能,把磁盘上的文件管得井井有条。
一、Ext2 的 “小区管理”:块组结构
如果一个分区有 100GB,直接管理所有块和 inode 会很麻烦 —— 就像管理 100 间教室的学生,没分工效率低。Ext2 的解决方案是:把整个分区分成多个 “块组(Block Group)”,每个块组结构完全相同,就像 “标准化小区”,管理一个就能复制到所有。
每个块组里有 6 个核心 “部门”,用 “小区管理” 比喻一下就懂:
| 组成部分 | 小区比喻 | 核心作用 |
|---|---|---|
| 超级块(Super Block) | 小区说明书 | 记录整个文件系统的 “全局信息”:块总数、inode 总数、块大小、最近挂载时间;为防损坏,会在多个块组备份 |
| 块组描述符表(GDT) | 每栋楼的简历 | 每个块组对应一个 “描述符”,记录:inode 表在哪、数据块在哪、空闲块 /inode 有多少 |
| 块位图(Block Bitmap) | 车位占用表 | 用 “0/1” 标记数据块是否空闲(0 = 空,1 = 用),找空闲块不用遍历,查位图就行 |
| inode 位图(Inode Bitmap) | 住户身份证表 | 用 “0/1” 标记 inode 是否空闲,快速找空闲 inode |
| inode 表(Inode Table) | 住户身份证存放处 | 存这个块组所有的 inode(每个 128 字节或 256 字节),比如块组 0 存 1~1024 号 inode |
| 数据块(Data Blocks) | 住户的房间 | 存文件内容:普通文件存数据,目录存 “文件名 - inode” 映射 |
举个实际例子:当你在 Ext2 分区新建abc文件时,系统会做四件事:
-
查 inode 位图,找一个空闲 inode(比如 263466),存在 inode 表里;
-
查块位图,找空闲数据块(比如 300、500),存文件内容;
-
在 inode 里记录 “数据块 300、500” 的指针;
-
在目录的数据块里,加一条 “abc → 263466” 的映射。
二、inode 怎么找到文件内容?映射机制
inode 里有个关键字段:i_block[EXT2_N_BLOCKS](共 15 个指针),它是 “inode 到数据块的桥梁”。为什么是 15 个?因为要兼顾 “小文件效率” 和 “大文件容量”。
1. 直接块(12 个):小文件 “直达”
前 12 个指针直接指向 “数据块”,比如i_block[0]指向块 300,i_block[1]指向块 500…… 小文件(比如几 KB)只用读 1 次 inode,就能找到所有数据块,很快。
2. 间接块:大文件 “分层找”
如果文件很大(比如几百 MB),12 个直接块不够用,就需要 “间接块”:
-
第 13 个指针(一级间接块):指向一个 “块号列表块”,这个块里存的不是内容,而是 “数据块的编号”(比如块 1000 里存 300、500、800…);
-
第 14 个指针(二级间接块):指向 “一级间接块的列表块”(比如块 2000 里存 1000、1001…);
-
第 15 个指针(三级间接块):指向 “二级间接块的列表块”—— 这样能支持超大文件,比如 4KB 块大小下,最大能存 4TB。

三、从路径到文件:解析与缓存
我们访问文件都是用路径,比如/home/xxx/test.c,系统怎么通过这个路径找到文件?核心是 “目录是文件” 和 “路径解析”。
1. 目录也是文件:存 “文件名 - inode” 映射
目录本质是特殊文件,它的数据块里存的不是内容,而是 “文件名 + inode 号” 的对应关系,就像 “小区住户名单”。比如/home目录的数据块里,会有 “xxx→ 1052661” 的记录 —— 意思是 “xxx子目录的 inode 号是 1052661”。
2. 路径解析:从根目录 “顺藤摸瓜”
路径/home/xxx/test.c的解析过程,就像 “从小区大门找到具体住户”:
-
根目录(
/)是 “小区大门”,它的 inode 号固定为 2,系统开机就知道; -
读根目录的数据块,找到 “home → 某个 inode 号”;
-
读
home目录的数据块,找到 “xxx→ 1052661”; -
读
xxx目录的数据块,找到 “test.c → 1052007”; -
通过 inode 1052007,找到
test.c的数据块。
为了加快速度,Linux 会在内存中缓存路径 —— 用struct dentry结构体构建 “树形路径缓存”,下次访问相同路径,直接从缓存里找,不用再读磁盘。
四、文件共享的技巧:软硬链接
Ext 系统支持两种 “链接”,用来共享文件,区别很大,用对了很方便。
1. 硬链接:同一个文件的 “多个名字”
硬链接是 “多个文件名对应同一个 inode”,比如用ln abc def创建def,abc和def的 inode 号相同(比如都是 263466)。
特点:
-
硬链接数记录在 inode 里,删除一个名字,硬链接数减 1,直到为 0 才释放磁盘;
-
用途:实现
.(当前目录)和..(上级目录)、文件备份(删了备份不影响原文件,直到所有硬链接都删)。
2. 软链接:文件的 “快捷方式”
软链接是 “独立文件”,用ln -s abc abc.s创建,abc.s的 inode 号和abc不同(比如abc.s是 261678,abc是 263563)。
特点:
-
软链接里存的是目标文件的路径,删了目标文件,软链接会失效;
-
用途:跨分区引用文件、简化长路径(比如用
ln -s /long/path/file ~/file把长路径文件链接到桌面)。
小结
Ext 系列文件系统的核心逻辑很清晰:用块组结构管理分区,用 inode 关联属性和数据,用路径解析找到文件,用挂载激活分区,用链接共享文件。理解这些,你就真正懂了 Linux 文件系统的 “运作方式”,以后遇到磁盘问题也能更从容。





