搞懂文件系统:从磁盘分区到挂载,Linux 存储管理实战指南(上)
本文介绍了磁盘的物理结构和工作原理,以及文件系统的组织方式。磁盘作为计算机唯一的机械设备,具有容量大、价格便宜但速度慢的特点。其物理结构采用CHS(柱面-磁头-扇区)定位方式,操作系统则使用LBA(逻辑块地址)线性寻址。文件系统将磁盘分区并划分为块组,每个块组包含文件数据和管理数据。关键管理结构包括:inode表存储文件属性、数据块存储内容、位图管理资源分配、GDT记录块组信息、超级块保存全局参数
一、磁盘
1. 特点:
- 机械磁盘是计算机中唯一的一个机械设备
- 磁盘— 外设
- 慢
- 容量大,价格便宜

2. 物理结构



磁盘的读写的基本单位是一个扇区(512)!不同位置可能疏密不一样



3. 如何写入?
(初步理解CHS)
写入数据,就得找最小写入单元:扇区。
(1)找到哪一面,磁头编号(header)
(2)在当前面中,哪一个磁道(cylinder)
(3)磁道中第几个扇区(sector)
CHS定位。
(逻辑结构LBA)

每个磁道将其想象成一条直带,每个扇区就是上面的一个区域。


这样每一个扇区就有了一个线性地址,也就是数组下标,这种地址叫LBA(Logical Block Address)
(真实过程)
因为所有磁头的运动都是相同的,那么每个磁头在其对应盘片的运动也相同,所以我们要把所有磁头的运动整体来看;
现在我们不再关注到盘面,把角度放在每一个柱面上:

再理解CHS定位:首先找到柱面(Cylinder),再通过磁头(Head)找对应磁道,再确定扇区(Sector)。
那么也就变成了二维扇区数组;那么整个磁盘就是多个柱面,也就是有多个二维数组表(磁盘就成了个三维数组)。注意:尽管我们知道这个多维逻辑,但是实际上,终究还是一维,就像C/C++中的二维数组,本质还是一维线性一样。

所以每一个扇区都有一个下标:叫做**LBA地址,也就是线性地址。OS只要用LBA**就行了。
(LBA与CHS的转换)
(1)CHS -> LBA(三维转一维):
-
C(柱面):从0开始编号;
-
H(磁头):从0开始编号;
-
S(扇区):从1开始编号;
-
LBA地址:从0开始的下标。
给一组CHS**<4, 5, 6>**,转成LBA
已知:单个柱面总扇区数(A) = 磁头数 (M)* 单磁道扇区数(N);
CHS**<4, 5, 6>**:在第5张柱面上,在第6个磁头对应磁道上,在第6个扇区上。
直接得:LBA = 4 * A + 5 * N + 6 - 1.
(2)LBA -> CHS(一维转三维):
“//”: 表示除取整
C:LBA // A
H:(LBA % A) // N
S:(LBA % N) + 1
二、文件系统
1. 最小“块”
硬盘属于典型块设备。操作系统读取硬盘数据时,不会逐个扇区读取,效率过低,而是一次性连续读取多个扇区,也就是读取一个数据块。
硬盘分区会被划分成若干数据块,块的大小在格式化时设定,设定后无法修改,常见大小为 4KB,通常由连续8 个扇区组合构成。
块是文件存储与存取的最小单位。
注意:
知道LBA:块号 = LBA/8
知道块号:LAB=块号*8 + n. (n是块内第几个扇区)
2. 磁盘“分区”
磁盘可以划分成多个分区。在 Windows 系统里,一块磁盘常会分出 C、D、E 等盘符,这些盘符对应的就是磁盘分区,分区本质上也是对硬盘的格式化操作。(分治思想)
而 Linux 系统中所有设备均以文件形式呈现,分区同样遵循对应的分区规范来划分管理。
柱面是分区的最小单位,可通过参考柱面编号划分分区,本质就是设定每个分区的起始柱面与结束柱面编号。
3. 盘区“分组”
在分区之后,文件系统还会对其分组:

4. 块组结构
1. 文件 = 内容 + 属性。在Linux中,文件内容和文件属性分开存储;
**2. 一个组里应该包含什么内容?**文件数据 + 管理数据的数据

文件属性inode Table 与 文件内容Data Blocks

管理数据Block Bitmap

管理数据inode Bitmap

管理数据GDT
整个分区 只有一张 GDT(块组描述符表),放在 分组 0 的开头
这张 GDT 里有 所有块组的描述信息(每个分组占 32 字节)
为了防损坏,这张 同一份 GDT 会在某些块组里做备份(不是每个组都有)
GDT 到底存什么?
每个分组在 GDT 里对应一条 “描述符”,记录:
- 这个组的 块位图 在哪一块
- 这个组的 inode 位图 在哪一块
- 这个组的 inode 表 从哪块开始
- 空闲块数、空闲 inode 数、目录数……

管理数据Super Block
1. 作用:
整个文件系统的总档案、总账本
2. 存放位置:
分区开头,块组 0 里
3. 存核心全局信息
- 分区总块数、总 inode 数量
- 块大小、inode 大小
- 空闲块、空闲 inode 总数
- 块组数量、挂载状态、文件系统版本
4. 特点
- 损坏 = 整个分区大概率打不开、数据读不出
- 会在多个块组做冗余备份,防止丢失
5. 和 GDT 区别
- 超级块:管整个分区全局整体信息
- 块组描述符表 GDT:管每一个小块组的明细信息

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)