文件系统是操作系统管理存储的核心机制。本文将从磁盘硬件原理出发,剖析 Linux 中经典的 ext 文件系统如何组织数据、管理文件,并揭示 inode、块、软硬链接等关键概念的底层实现。
一、硬件理解
文件存储通常位于计算机硬盘上,属于一种'永久性'存储,硬盘有固态硬盘(SSD)和机械硬盘(HDD)。
1.1 磁盘物理结构
扇区是从磁盘读出和写入信息的最小单位,通常为 512 字节。
- 磁头(head)数:每个盘片一般对应 1 个磁头。
- 磁道(track)数:从盘片外圈往内圈编号的同心圆。
- 柱面(cylinder)数:磁道构成柱面,数量等同于磁道个数。
- 扇区(sector)数:每个磁道被切分成扇形区域。
- 磁盘容量 = 磁头数 × 磁道 (柱面) 数 × 每道扇区数 × 每扇区字节数。
CHS 寻址通过柱面、磁头、扇区定位。现代系统使用 LBA 地址。
CHS 转 LBA: LBA = 柱面号 C × (磁头数 × 每磁道扇区数) + 磁头号 H × 每磁道扇区数 + 扇区号 S - 1
LBA 转 CHS: 柱面号 C = LBA // (磁头数 × 每磁道扇区数) 磁头号 H = (LBA % (磁头数 × 每磁道扇区数)) // 每磁道扇区数 扇区号 S = (LBA % 每磁道扇区数) + 1
1.2 磁盘的逻辑结构
在 OS 看来,磁盘是一个元素为扇区的一维数组,下标为 LBA 地址。
二、Ext 文件系统
2.1 文件属性与分区
操作系统以'块'为单位进行操作,常见大小为 4KB(8x512 字节)。
- 块号 = LBA / 8
- 文件 = 属性 + 内容。元信息存储在 inode(索引节点)中。
ls -i可查看 inode 编号。- 文件名未纳入 inode 数据结构内部,inode 大小固定(通常 128 字节)。
Linux 早期文件系统为 ext2,后发展为 ext3/ext4,核心设计未变。
对磁盘的管理类似分治思想,linux 系统上柱面是最小的分区单位。
2.2 组管理字段
文件系统以分区为单位,不同分区可用不同文件系统管理。
Data Blocks:存放文件内容。inode Table:存放文件属性(inode 编号、类型、权限、大小等)。Block Bitmap:记录 Data Blocks 是否被占用。inode Bitmap:记录 inode Table 中各 inode 是否被使用。GDT:块组描述符,记录各块区域的起始地址、结束地址。Super Block:记录文件系统类型、版本、总块数、空闲块数、inode 起始地址等。
格式化操作本质是将 Super Block 初始化,将位图清 0。
2.3 inode 编号查询文件
inode 在分区内唯一。通过 Super Block 可知组中 inode 个数 w。
- 组号 = inode 编号 / w
- inode Bitmap 位置 = inode 编号 % w
目录本质也是文件,其内容是目录内部文件的文件名和 inode 编号的映射。
挂载示例:
dd if=/dev/zero of=./disk.img bs=1M count=5 # 制作一个大的磁盘块
mkfs.ext4 disk.img # 格式化写入文件系统
mkdir /mnt/mydisk # 建立空目录
mount -t ext4 ./disk.img /mnt/mydisk/
umount /mnt/mydisk


