Linux 学习笔记(二十三):深入 Ext 文件系统(下)—— 原理、缓存与软硬链接

一、 Ext2 文件系统的内部构造

Ext2 文件系统将磁盘分区划分为多个块组(Block Group)。每个块组内包含:

  1. 超级块(Super Block):记录整个文件系统的结构信息(大小、空闲数量),至关重要。

  2. inode 位图 & Block 位图:用 0 和 1 标记 inode 和数据块是否被占用,极大提高了寻找空闲空间的效率。

  3. inode 表:所有 inode 的集合。

  4. 数据块(Data Blocks):真正存文件内容的地方。

二、 inode 如何找到海量数据?

inode 内部有 15 个指针(i_block):

  • 前 12 个指向直接数据块。

  • 第 13、14、15 个分别指向一级间接、二级间接、三级间接索引块。通过层层指针,即使是几个 GB 的超大文件,也能被精确定位。

三、 极速寻路:dentry 路径缓存

为什么在 Linux 里找文件那么快?因为内核在内存中维护了一棵树(struct dentry)。当你打开过一次文件后,路径的树形结构就被缓存了。下次访问直接走内存,无需再从磁盘读取,极大提升了路径解析效率。

四、 灵魂考点:软链接 vs 硬链接

(插入 ls -li 测试软硬链接的截图)

  1. 硬链接(ln 源文件 新文件):

    • 本质是给同一个 inode 起了个别名,它们共用同一份数据。

    • 创建后,inode 的链接数(Links)会 +1。

    • 删除源文件不影响硬链接(只要链接数不为0即可)。

    • 不能跨分区,不能为目录创建。

  2. 软链接(ln -s 源文件 新文件):

    • 相当于 Windows 的快捷方式。

    • 它是一个独立的文件,有自己全新的 inode,文件内容仅仅是指向源文件的路径。

    • 如果删除了源文件,软链接依然存在,但会变成"死链接"(无法访问)。

总结

Ext 文件系统的设计极其精妙,通过位图快速分配空间,通过多级索引支持大文件,通过 inode 隔离属性与数据。而在日常使用中,软链接常用于版本管理(如 python2 / python3 的快捷映射),硬链接常用于文件备份以节省空间。

自我实战操作

实战 1:硬链接测试
bash 复制代码
cd ~/linux_study/io_test
# 1. 准备一个源文件
echo "This is original content" > original.txt

# 2. 创建硬链接
ln original.txt hard.txt

# 3. 观察 inode、链接数(Links)
ls -li original.txt hard.txt

👉 现象 :两个文件的 inode 号一模一样 ,最前面的 Links 计数变成了 2。而且你修改 hard.txt,original.txt 也会跟着变(因为它们本来就是同一个文件)。

实战 2:软链接测试
bash 复制代码
# 1. 创建软链接(注意加 -s)
ln -s original.txt soft.txt

# 2. 观察
ls -li original.txt soft.txt

👉 现象 :soft.txt 的 inode 号和原文件不一样 ,而且它是一个 l 类型的文件(lrwxrwxrwx),大小很小(因为它只存了路径)。

实战 3:删除源文件,看谁怕谁?
bash 复制代码
# 1. 删掉源文件
rm original.txt

# 2. 查看硬链接和软链接的状态
cat hard.txt     # 依然能看,因为硬链接还有一个名字指向数据
cat soft.txt     # 🚨报错:No such file or directory (软链接变成了死链接!)
ls -l soft.txt   # 变成了红底白字(终端通常会有颜色)

# 3. 清理现场
rm hard.txt soft.txt

(注:文档里的 mount 挂载实验,在云服务器上直接操作有风险,咱们留在以后讲文件系统扩容时再玩。知道它是"把分区关联到指定目录"即可。)

相关推荐
星恒随风3 小时前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql
§ꦿCFོ༉4 小时前
嵌入式八股文—C语言入门学习(四)
c语言·开发语言·学习
2603_969694856 小时前
【JavaWeb学习记录】MyBatis核心知识点与实战笔记:从入门到动态SQL
笔记·sql·学习·mysql·mybatis·javaweb·学习方法
可乐ea6 小时前
智能体记忆该拆成几层:笔记、记忆表示与注入上下文
服务器·数据库·笔记·ai智能体·提示词工程·上下文工程·记忆系统
唐墨1237 小时前
linux kernel 比较数据大小的宏定义
linux·算法
程序开发阿元7 小时前
密码不进工具:一个独立开发者的服务器凭据管理办法
linux·ssh
Go Work10 小时前
两个等值条件摆着,MySQL 偏要全表扫
经验分享·笔记
Oll Correct10 小时前
Adobe illustrator 案例十四:花元素标志草图绘制
笔记·ui·adobe·illustrator
AR-26710-11 小时前
Linux Day33——定时任务+lvm
linux·运维
墨痕诉清风11 小时前
SSRF漏洞实战记录+OSS桶命令执行+MCP漏洞
linux·服务器·数据库