1. 了解磁盘硬件结构
1.1 初识磁盘
在之前的系统 IO 学习中,我们了解了内存级别的文件操作、文件描述符、重定向及缓冲区等概念。接下来本文将视角从内存转向磁盘,研究文件在磁盘中的存储方式。将从磁盘的硬件结构开始,引入文件系统的概念,详细解析用户打开文件时的路径解析过程,并介绍软链接和硬链接的概念。
一般的磁盘结构如下所示:

1.2 磁盘内部结构
磁盘内部通常由多个盘片堆叠而成,每个盘片都有对应的磁头来实现读写,这些磁头位于同一个磁头臂上,因此磁盘中的磁头是共进退的。
注:不要随意打开磁盘,正常磁盘内部封装为无尘环境,打开后盘片运转时会接触灰尘导致数据丢失。
现代计算机中机械硬盘已逐渐被固态硬盘取代,后者读取速度更快且体积更小。但机械硬盘在特定场景下仍有显著价值,例如服务器冷数据存储,同容量下机械硬盘成本远低于固态硬盘。
1.3 磁盘寻址方式
磁盘中每个盘片有许多磁道,每 512 字节划分为 1 个扇区,扇区是 C 磁盘存储的基本单位。不同盘片中同一半径上的磁道称为柱面。
CHS 寻址
CHS 寻址通过三步定位扇区:
- 定位磁头(Header)
- 确定磁道(Cylinder)
- 定位扇区(Sector)
该过程中磁头定位准确性直接影响磁盘读写速度。
LBA 寻址
LBA(Logical Block Address)将磁盘抽象为一维数组,效率更高。操作系统直接使用 LBA 值访问磁盘扇区,磁盘内部负责 LBA 与 CHS 的转换。
CHS 转成 LBA
公式:LBA = 柱面号 C * (磁头数 * 每磁道扇区数) + 磁头号 H * 每磁道扇区数 + 扇区号 S - 1
注:扇区号通常从 1 开始,LBA 地址从 0 开始。
LBA 转成 CHS
柱面号 C = LBA // (磁头数 * 每磁道扇区数)磁头号 H = (LBA % (磁头数 * 每磁道扇区数)) // 每磁道扇区数扇区号 S = (LBA % 每磁道扇区数) + 1
从此往后,磁盘使用者直接使用 LBA 地址,磁盘视为元素为扇区的一维数组。
2. 引入文件系统
2.1 引入'块'概念
OS 访问文件系统时以'块'为单位,而非单个扇区。通常将连续 8 个扇区(512 字节 * 8 = 4KB)定义为磁盘块。
2.2 引入'分区'概念
大磁盘通常会被划分成多个分区(如 Windows 的 C、D 盘)。在 Linux 中,设备即文件,分区本质上是设置起始和结束柱面号,将大空间转为小块分区管理。
3. 文件系统
本文主要介绍 Linux 中的 ext2 文件系统,ext3 和 ext4 是其增强版,核心设计未变。
3.1 文件系统管理方式
分区后空间仍较大,需进一步分组管理。
文件存储
磁盘分区开头有 MBR(主引导记录),存储分区信息。分区内有 Boot Sector(启动块),存储分区信息和启动信息。
在分组中,文件属性存储在 inode Table 中,文件内容存储在 Data Block 中。inode 结构体大小固定为 128 字节,一个 4KB 块可存 32 个 inode 信息。
使用 block bitmap 和 inode bitmap 记录数据块和 inode 的使用情况,实现线性时间查找。
删除文件时并非真正删除数据,而是将位图对应位置置为 0,新数据写入时可覆盖,这也是文件恢复的原理。


