Linux Ext 系列文件系统原理与实战
文件在操作系统中通常分为'内存级(已打开)'和'磁盘级(未打开)'两种状态。本文重点讨论存储在磁盘上的文件对象,以经典的 Ext2 文件系统为例,梳理从硬件底层到逻辑结构的完整链路。
理解硬件基础
存储层级概览
机械磁盘(HDD)属于外部存储设备,具有速度慢、容量大、成本低的特点。它是服务器的一部分,多台服务器组成机柜,多个机柜构成机房。这种层级结构是数据中心的基础形态。
物理与存储结构
机械磁盘写入数据的本质是磁介质的'两态'变化。其物理结构包含盘片(Platter),每个盘片有上下两个面,每面对应一个磁头。
- 磁道(Track):同心圆环状的数据存储区域,从外圈向内圈编号,最内圈通常用于磁头停靠。
- 柱面(Cylinder):所有盘片相同半径的磁道组成的逻辑单元。柱面数等于单个盘面的磁道数。
- 扇区(Sector):磁盘存储数据的基本单位,通常为 512B,也是块设备的概念。
磁盘容量的计算公式为:磁头数 × 单个盘面的磁道数(柱面数)× 每道扇区数 × 每扇区字节数。
寻址方式:CHS 与 LBA
早期通过 CHS(柱面 - 磁头 - 扇区)定址来定位扇区。现代操作系统则直接使用 LBA(Logical Block Address,逻辑块地址)。
LBA 将三维的物理结构展开为一维线性数组,每个扇区都有唯一下标。转换公式如下:
LBA = C * (磁头数 * 每磁道扇区数) + H * 每磁道扇区数 + S - 1
其中 C 为柱面号,H 为磁头号,S 为扇区号。注意磁头和柱面编号从 0 开始,扇区从 1 开始。现代磁盘控制器会自动完成 LBA 到物理位置的映射,应用程序只需关注逻辑地址。
引入文件系统概念
块与分区
操作系统访问磁盘不以扇区为单位,效率太低,而是以'块'(Block)为单位,通常是连续的 8 个扇区(4KB)。知道 LBA 后,块号可通过 LBA / 8 计算得出。
由于块数量巨大,需要进行分区管理,以便独立维护不同的文件系统。
Inode 概念
在 Linux 下,文件的属性与内容是分离存储的。保存文件属性的集合称为 struct inode 对象,每个文件对应一个 inode,内含唯一的标识符 inode 号。文件名作为属性因大小不确定,不直接存入 inode,而是通过目录项关联。
Ext2 文件系统结构
Ext2 文件系统结构清晰,适合理解文件系统的基本原理。
核心组件
- MBR:磁盘总控,负责启动引导和分区管理。
- Boot Sector:分区入口,加载该分区的操作系统。
- Data Blocks:存储文件内容,基本单位是块。
- inode Table:存放 struct inode 对象,大小一般为 128 字节。一个块可存储 32 个 inode 对象。
文件的内容和数据块号对应,属性在 inode 表中。两者都跨组编号但不跨分区编号,确保同一分区内编号唯一。
位图与元数据
-
Block Bitmap:记录数据块是否被使用。
-
inode Bitmap:记录 inode 是否被使用。 删除文件时,只需将对应的位图置为 0,因此删除操作非常快。
-
GDT(组描述符表):描述组的属性,有多少个组就有多少个描述符。
-
Super Block(超级块):存放整个分区的文件系统信息,重要且会被备份在多个组中。
目录与路径解析
目录本身也是文件,其内容不是普通数据,而是'文件名 → inode 号'的映射表。
读取文件如 /home/user/file.txt 时,系统会逐级查找目录项:
- 找到根目录
/的 inode 号(通常为 2)。 - 在根目录数据块中找到
home的 inode 号。 - 继续查找
user和file.txt的 inode 号。
有了 inode 号,即可获取文件属性和内容。为了加速,Linux 会使用 struct dentry 节点形成多叉树,利用 Hash 和 LRU 机制缓存历史路径结构。
挂载分区
解析路径时,遇到挂载点(如 /mnt/data)会切换到对应的文件系统。例如访问 /mnt/data/file.txt,先解析挂载点,再在该分区文件系统中查找 inode。
总结来说,给一个 inode 号就能获得文件属性与内容,而路径解析则是获取 inode 号的过程。
软硬链接机制
软链接
软链接是一个独立的文件,拥有自己的 inode 号。其内容是指向目标文件的路径,类似于 Windows 下的快捷方式。如果源文件被删除,软链接将失效。
硬链接
硬链接不是独立文件,没有独立的 inode 号。它本质上是一组新的文件名和 inode 号的映射关系。创建硬链接速度快,常用于备份。但用户不支持对目录创建硬链接,以避免路径环问题。
当前目录中的 . 和 .. 其实也是硬链接,分别指向当前目录和上级目录。


