Linux 文件系统:架构、原理与实战
核心概念: 文件系统是 Linux 系统的'骨架',决定了文件如何存储、读取,直接影响系统稳定性与性能。无论是 EXT4、XFS 等常见文件系统,还是'挂载''分区'等核心操作,背后都有一套严谨的工作机制。
基础操作逻辑:
- 新建文件: 分配 inode,形成该文件的所有属性并保存在磁盘,同时和文件名关联。
- 删除文件: 查看引用计数,符合要求后将数据块和对应的 inode 取消关联,改变文件状态,允许覆盖。
- 查找/修改文件: 根据 inode 找到对应的数据块,取/修改里面的对应数据。
【一】硬件认识 - 磁盘
计算机中的存储外设——磁盘容量通常达到上百 G。我们主要关注物理和存储结构。
工作原理: 整个磁盘由若干个小磁盘(圆滑面)组成,每个正反面是单独的存储面,每个存储面都有一个磁头。当磁盘工作时高速旋转,磁头左右摆动锁定目标位置,实现管理效果。
存储结构: 每个盘面以中间的主轴为中心,向外分为一个个同心磁道,而每个磁道又会被划分为各个扇区。文件的存储无非就是占据扇区的问题。
【二】线性结构转化
每个磁道抽象理解为一种线性结构,例如数组。每个扇区都有一个线性地址也就是下标,这个地址称为 LBA。
文件存储在扇区上,通过确定磁面->磁道->扇区(CHS)来锁定扇区。完成 CHS 与 LBA 的相互转化计算如下:
假设每个盘面有 2W 个扇区,每个盘面有 50 个磁道,每个磁道有 400 个扇区,假设 LBA 是 28888:
LBA -> CHS: 确定磁面:C = LBA / 单个磁面的总扇区数 确定磁道:H = C / 单个磁道扇区数 确定扇区:S = (LBA % 每磁道扇区数) + 1
CHS -> LBA: LBA = 柱面号 C * (单个磁面扇区总数) + 磁头号 H * 每磁道扇区数 + 扇区号 S - 1
(扇区号通常从 1 开始,在 LBA 中地址是从 0 开始的,柱面和磁道都是从 0 开始编号的)
得到 LBA 后,即可经过计算得到准确扇区的位置。
【三】文件系统
(1)'块'的概念
操作系统从磁盘读取数据时,通常不会一个一个扇区读取,而是一次性读取多个扇区,即'块'。硬盘的每个分区被划分为一个个的'块'。一个'块'的大小是由格式化时确定的,且不可更改。最常见的是 4KB,即连续八个扇区组成一个'块'。'块'是文件存取的最小单位。
(2)文件系统组成
一个文件系统可细分为以下部分:
- Data Blocks: 存储文件的内容,以块的形式呈现,通常是 4KB。
- Inode Table: 单个文件的所有属性,比如 inode 编号,可以通过
ls -li查看 inode 编号。 - Inode Bitmap、Block Bitmap: 用二进制表示已经存储的该文件的使用情况,比如 1 表示已占用,0 表示空缺。
- Group Descriptor Table: 快速定位到目标文件的核心细节。
- Super Block: 超级块,用来存储该区整个文件系统的信息,为了防止数据丢失解决恢复问题,一般在改块的其它扇区也存在记录。
【四】软硬链接
(1)软链接
理解: 软链接就是建立一个指向该文件的路径(类似 Windows 的快捷方式)。
特点:
- 本质是一个'特殊文件',只存了原文件的路径,而非原文件的数据。
- 像一个'指路牌',访问软链接时,系统先根据路径找到原文件,再读取数据。
- 软链接有自己独立的 inode,与原文件的 inode 完全不同。


