Ext 系列文件系统怎么工作?从结构到实战全解析

上一篇我们搞懂了磁盘底层和基础概念,这一篇聚焦 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文件时,系统会做四件事:

  1. 查 inode 位图,找一个空闲 inode(比如 263466),存在 inode 表里;

  2. 查块位图,找空闲数据块(比如 300、500),存文件内容;

  3. 在 inode 里记录 “数据块 300、500” 的指针;

  4. 在目录的数据块里,加一条 “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的解析过程,就像 “从小区大门找到具体住户”:

  1. 根目录(/)是 “小区大门”,它的 inode 号固定为 2,系统开机就知道;

  2. 读根目录的数据块,找到 “home → 某个 inode 号”;

  3. home目录的数据块,找到 “xxx→ 1052661”;

  4. xxx目录的数据块,找到 “test.c → 1052007”;

  5. 通过 inode 1052007,找到test.c的数据块。

为了加快速度,Linux 会在内存中缓存路径 —— 用struct dentry结构体构建 “树形路径缓存”,下次访问相同路径,直接从缓存里找,不用再读磁盘。

四、文件共享的技巧:软硬链接

Ext 系统支持两种 “链接”,用来共享文件,区别很大,用对了很方便。

1. 硬链接:同一个文件的 “多个名字”

硬链接是 “多个文件名对应同一个 inode”,比如用ln abc def创建defabcdef的 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 文件系统的 “运作方式”,以后遇到磁盘问题也能更从容。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值