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(超级块):存放整个分区的文件系统信息,重要且会被备份在多个组中。


