
大家好,欢迎来到 huangjin007_ 的博客
⭐ 个人主页:huangjin007_
🔥 文章收录专栏:Linux 内功修炼手册(系统篇)
总会有一些坚持
能从冰封的土地里
培育出十万朵怒放的蔷薇
Linux 系统篇(二十六) ------ Ext 系列文件系统(上)
文章目录
- [Linux 系统篇(二十六) ------ Ext 系列文件系统(上)](#Linux 系统篇(二十六) —— Ext 系列文件系统(上))
-
- [一、 硬件底层认知:磁盘、服务器、机房核心概念](#一、 硬件底层认知:磁盘、服务器、机房核心概念)
-
- [1.1 机械磁盘的核心特性](#1.1 机械磁盘的核心特性)
- [1.2 拓展科普:机房、服务器、磁盘磁铁原理](#1.2 拓展科普:机房、服务器、磁盘磁铁原理)
- [二、 磁盘完整物理结构](#二、 磁盘完整物理结构)
-
- [2.1 核心物理组件](#2.1 核心物理组件)
- [三、 磁盘存储逻辑结构:磁道、扇区、柱面](#三、 磁盘存储逻辑结构:磁道、扇区、柱面)
-
- [3.1 磁道(Track)](#3.1 磁道(Track))
- [3.2 扇区(Sector)](#3.2 扇区(Sector))
- [3.3 柱面(Cylinder)](#3.3 柱面(Cylinder))
- [3.4 参数汇总](#3.4 参数汇总)
- [3.5 磁盘容量计算公式](#3.5 磁盘容量计算公式)
- [3.6 数据存储本质](#3.6 数据存储本质)
- [四、 传统 CHS 三维寻址原理与致命缺陷](#四、 传统 CHS 三维寻址原理与致命缺陷)
-
- [4.1 CHS 寻址逻辑](#4.1 CHS 寻址逻辑)
- [4.2 CHS 寻址的硬件位数限制](#4.2 CHS 寻址的硬件位数限制)
- [五、 磁盘逻辑重构:从三维 CHS 到一维 LBA 寻址](#五、 磁盘逻辑重构:从三维 CHS 到一维 LBA 寻址)
-
- [5.1 生活化类比:磁带模型](#5.1 生活化类比:磁带模型)
- [5.2 磁盘三维数组本质(底层核心模型)](#5.2 磁盘三维数组本质(底层核心模型))
- [5.3 关键核心:地址转换执行者](#5.3 关键核心:地址转换执行者)
- [六、 CHS 与 LBA 精准换算公式](#六、 CHS 与 LBA 精准换算公式)
-
- [6.1 编号规则](#6.1 编号规则)
- [6.2 前置变量](#6.2 前置变量)
- [6.3 CHS 转 LBA](#6.3 CHS 转 LBA)
- [6.4 LBA 转 CHS](#6.4 LBA 转 CHS)
- [6.5 最终操作系统视角](#6.5 最终操作系统视角)
- [七、 文件系统第一层抽象:块(Block)机制](#七、 文件系统第一层抽象:块(Block)机制)
-
- [7.1 为什么需要块?](#7.1 为什么需要块?)
- [7.2 块的核心规则](#7.2 块的核心规则)
- [7.3 块号与 LBA 扇区换算](#7.3 块号与 LBA 扇区换算)
- [八、 文件系统第二层抽象:分区(Partition)](#八、 文件系统第二层抽象:分区(Partition))
-
- [8.1 分区的本质](#8.1 分区的本质)
- [8.2 Linux 分区特性](#8.2 Linux 分区特性)
- [8.3 分区最小单位:柱面](#8.3 分区最小单位:柱面)
- [九、inode 索引节点](#九、inode 索引节点)
-
- [9.1 Linux 文件核心设计思想](#9.1 Linux 文件核心设计思想)
- [9.2 ls -l 与 stat 指令实操解析](#9.2 ls -l 与 stat 指令实操解析)
- [9.3 inode 核心定义](#9.3 inode 核心定义)
- [9.4 超级关键坑点](#9.4 超级关键坑点)
- [9.5 原生 ext2_inode 磁盘结构体(内核源码级详解)](#9.5 原生 ext2_inode 磁盘结构体(内核源码级详解))
- [9.6 15 级块指针模型(Ext 文件系统核心)](#9.6 15 级块指针模型(Ext 文件系统核心))
- 结语:
一、 硬件底层认知:磁盘、服务器、机房核心概念
1.1 机械磁盘的核心特性

在整个计算机硬件体系中,机械硬盘(HDD)是唯一的纯机械设备 。
CPU、内存、显卡、网卡均为纯电子元器件,依靠电信号光速传输数据;唯独机械硬盘依靠马达旋转、磁臂摆动、磁头悬浮等物理机械运动完成读写。
基于硬件属性,机械磁盘具备四大核心特征:
- 属于外设设备:磁盘不属于计算机核心内存设备,是典型外部存储外设。CPU 无法直接读取磁盘数据,必须先加载到内存,再由 CPU 处理。
- 速度极慢:机械运动速度远低于电子信号,寻道、旋转、等待扇区对齐,是磁盘 IO 延迟的根本来源。
- 容量巨大、性价比极高:相比固态硬盘,机械硬盘单位 TB 价格极低,是服务器冷数据、长期备份数据的核心存储介质。
- 结构精密、怕震动、怕磁场、怕灰尘。
1.2 拓展科普:机房、服务器、磁盘磁铁原理
1.2.1 机房与服务器科普
我们日常使用的云服务器、云主机,物理载体全部托管在专业 IDC 机房:
-
服务器 :企业级专用主机,支持硬盘热插拔、7×24 小时不间断运行,硬盘负载、转速、精度远高于家用硬盘;

-
机柜 :标准化机架,一台机柜可堆叠数十台服务器,集中供电、集中散热;

-
机房 :恒温、恒湿、防静电、双路供电、消防隔离的专业场地,保障存储设备全年无停机。

家用电脑硬盘仅适合间歇性使用,无法承受服务器级别的不间断读写压力。
1.2.2 磁盘与磁铁的核心原理
机械硬盘的存储本质是磁记录原理 :盘片表面涂覆磁性介质,磁头通过改变介质磁极的南北方向,区分二进制的 0 和 1,从而永久存储数据。
由此得出两个关键结论:
- 磁盘惧怕强磁铁:强磁场会直接打乱盘片磁性排布,导致数据永久性损坏。
- 磁盘绝对不能私自开盖:硬盘内部为高度无尘(高端盘为充氦)环境,普通空气的微小灰尘,落在高速旋转的盘片上,会直接刮伤盘面,造成物理坏道、磁盘报废,普通环境无法维修。
二、 磁盘完整物理结构
机械硬盘所有的数据存储、寻址、读写逻辑,全部依赖以下物理组件,所有文件系统底层原理均源于此。

2.1 核心物理组件
-
盘片(Platter):磁盘的数据真正存储载体,一般为铝合金/玻璃基底,表面镀磁性涂层。一块硬盘可包含多张盘片,每张盘片分为正反两个盘面,均可独立存储数据。
-
主轴 & 主轴马达:所有盘片固定在同一根主轴上,马达驱动所有盘片同步高速旋转(7200/10000 转/分钟)。所有盘片转速完全一致,无法单独旋转某一张盘片。
-
磁头(Head):磁盘的读写"笔尖",悬浮在盘面上方纳米级高度,不接触盘面。规则:一个盘面对应一个独立磁头,一张盘片对应两个磁头。
-
磁头传动臂(核心重点) :所有磁头全部固定在同一根传动臂上,共进退、共移动!磁臂摆动时,所有盘面的磁头同时向圆心/外圈移动,无法单独移动单个磁头。
-
驱动电机 & 控制电路板(含伺服系统):负责驱动磁臂摆动(音圈马达)、磁头信号解析、磁盘固件运算、以及后面要讲的 LBA 与 CHS 地址转换工作。
三、 磁盘存储逻辑结构:磁道、扇区、柱面

磁盘高速旋转、磁头静止,就会在盘面划出完整的同心圆,由此诞生磁盘三大核心硬件单位。
3.1 磁道(Track)

盘面上同心圆环轨道即为磁道。编号规则:从最外圈从 0 开始编号,向内圈依次递增。
特殊细节:磁盘最内侧靠近主轴的磁道,不存储任何数据,仅作为磁头断电停泊区,保护数据盘面不被划伤。
3.2 扇区(Sector)

一条环形磁道,被均等切分为无数个扇形小块,每一个小块就是扇区。
硬件核心定义 :扇区是磁盘硬件读写的最小单位,标准固定 512 字节。 磁盘硬件不支持读写半个扇区,所有硬件 IO 的最小粒度,都是一整个扇区。
3.3 柱面(Cylinder)

结合「磁头共进退」的关键特性:当磁臂固定在某一个径向位置时,所有盘面、相同半径的所有磁道,堆叠形成一个虚拟圆柱体,这个虚拟结构就是柱面。
关键点:
- 柱面是逻辑概念,磁盘无真实物理结构;
- 柱面总数 = 单盘面磁道总数;
- 同一柱面下,所有磁道的扇区数量完全一致。
3.4 参数汇总
- 磁头(Head):每个盘片一般有上下两面,分别对应1个磁头,共2个磁头。
- 磁道(Track):从盘片外圈往内圈编号,0磁道,1磁道......靠近主轴的同⼼圆用于停靠磁头,不存储数据。
- 柱面(Cylinder):所有盘片上相同半径的磁道,在逻辑上构成了一个圆柱面,称为柱面。数量上等同于磁道个数。
- 扇区(Sector) :每个磁道被切分成很多扇形区域,每道的扇区数量相同。扇区是磁盘存储数据的基本单位,通常大小为512字节。
- 盘片(Platter):就是盘片的数量。
3.5 磁盘容量计算公式
磁盘容量 = 磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数
3.6 数据存储本质
文件 = 文件内容 + 文件属性。无论是文件的文字数据、二进制数据,还是权限、大小、时间等属性数据,本质都是二进制数据,全部存储在磁盘扇区中。只要可以精准定位单个扇区,就可以连续定位多个扇区,从而存储完整文件数据。
四、 传统 CHS 三维寻址原理与致命缺陷
4.1 CHS 寻址逻辑
早期磁盘操作系统,通过三维物理坐标精准定位任意一个扇区,这套机制即为 CHS 寻址:

- C(Cylinder)柱面号:移动磁臂,定位目标半径轨道层;
- H(Head)磁头号:切换对应盘面的读写磁头;
- S(Sector)扇区号 :等待盘面旋转,对齐目标扇区。
简单理解:先找层(柱面)→ 再找面(磁头)→ 最后找块(扇区),三维定位唯一扇区。
4.2 CHS 寻址的硬件位数限制
早期 BIOS 固件,固定使用特定位数存储 CHS 坐标,直接限制了磁盘最大容量:
- 磁头:8bit → 最大 2⁸ = 256
- 柱面:10bit → 最大 2¹⁰ = 1024
- 扇区:6bit → 最大 2⁶ = 63
代入容量公式:最大容量 = 256 × 1024 × 63 × 512B = 8064MB ≈ 8.4GB
五、 磁盘逻辑重构:从三维 CHS 到一维 LBA 寻址
5.1 生活化类比:磁带模型

磁带是所有人都能理解的一维线性存储结构,数据从头到尾连续排列,只有一个线性下标。
磁盘物理上是环形三维结构,但操作系统不喜欢复杂的三维坐标。于是系统做了顶级抽象:把卷曲的磁盘,彻底拉直为一条线性磁带。


拉直后的每一个扇区,拥有唯一、连续、从 0 开始的线性下标,这个下标就是 LBA(Logical Block Address,逻辑块地址)。

5.2 磁盘三维数组本质(底层核心模型)
我们可以用 C 语言数组完美诠释磁盘存储结构:
- 单条磁道 :展开后是一维数组,元素为单个扇区;
- 单个柱面 :包含所有盘面的同半径磁道,是二维数组;
- 整块磁盘 :由无数柱面堆叠,是三维数组(C/H/S)。
CHS 寻址,本质就是访问三维数组的 [C][H][S] 坐标。但在计算机底层,所有多维数组,最终都会被编译器平铺为一维数组。磁盘同理:三维 CHS 结构,最终被硬件平铺为一维 LBA 线性结构。

5.3 关键核心:地址转换执行者
操作系统只使用 LBA,完全不感知 CHS!
LBA 与 CHS 的互相转换,不是内核、不是软件完成,而是由磁盘自带固件、伺服硬件电路自动完成 。
OS 下发指令:读取 LBA=1000,磁盘固件自动换算 CHS 物理坐标 → 控制磁臂、磁头、盘面完成读写。
六、 CHS 与 LBA 精准换算公式
6.1 编号规则
- 柱面 C、磁头 H:从 0 开始编号
- 扇区 S:硬件规则 从 1 开始编号
- LBA 线性地址:从 0 开始编号
6.2 前置变量
单个柱面总扇区数 = 磁头数 × 每道扇区数
6.3 CHS 转 LBA
LBA = 柱面号C × 单个柱面的扇区总数 + 磁头号H × 每磁道扇区数 + 扇区号S - 1- 即:
LBA = 柱面号C × (磁头数 × 每磁道扇区数) + 磁头号H × 每磁道扇区数 + 扇区号S - 1
注意:
- 扇区号通常是从1开始的,而在LBA中,地址是从0开始的。所以要
-1消除扇区的编号偏移。- 柱面和磁道都是从0开始编号的。
- 总柱面、磁道个数、扇区总数等信息,在磁盘内部会自动维护,上层开机的时候,会获取到这些参数。
6.4 LBA 转 CHS
- 柱面号
C = LBA // (磁头数 × 每磁道扇区数)【//表示除取整,即单个柱面的扇区总数】 - 磁头号
H = (LBA % (磁头数 × 每磁道扇区数)) // 每磁道扇区数 - 扇区号
S = (LBA % 每磁道扇区数) + 1
6.5 最终操作系统视角
整块磁盘 = 存储扇区的一维数组,下标 = LBA。操作系统只需传入一个数字,即可访问磁盘任意位置。
七、 文件系统第一层抽象:块(Block)机制
7.1 为什么需要块?
硬件最小读写单位是 512B 扇区。如果操作系统每次 IO 只读写 512B,会产生海量细碎 IO、频繁硬件调度,磁盘性能会极其低下。
为了优化 IO 效率,文件系统引入块(Block) 概念:一次性整合多个连续扇区,作为操作系统读写的最小单位。
7.2 块的核心规则
- 块大小在
mkfs格式化分区时确定,终身不可修改;- Linux 默认标准:1块 = 8个扇区 = 4KB;
- 块是文件系统读写的最小单位(软件层面);
- 扇区是磁盘硬件读写的最小单位 (硬件层面)。
(扇区是硬件概念,块是文件系统软件概念。)
7.3 块号与 LBA 扇区换算
- 磁盘就是一个三维数组,我们把它看待成为一个"一维数组",数组下标就是LBA,每个元素都是扇区。
- 每个扇区都有LBA,那么8个扇区一个块,每一个块的地址我们也能算出来。
- 知道LBA:
块号 = LBA / 8 - 知道块号:
LBA = 块号 * 8 + n(n是块内第几个扇区)

八、 文件系统第二层抽象:分区(Partition)
8.1 分区的本质
整块物理磁盘容量巨大,为了隔离系统数据、用户数据、业务数据,我们将磁盘划分为多个独立区域,这就是分区。Windows 的 C盘、D盘,Linux 的 /dev/sda1、/dev/sda2,本质都是分区。
8.2 Linux 分区特性
Linux 一切皆文件,磁盘与分区均以设备文件形式存在于 /dev 目录:
/dev/sda:整块物理磁盘/dev/sda1:第一个分区
8.3 分区最小单位:柱面
传统 MBR 分区机制中,分区划分的最小单位是柱面。此时我们可以将硬盘上的柱面(分区)进行平铺,将其想象成一个大的平面。

分区只需记录两个参数:
- 起始柱面号
- 结束柱面号
通过柱面数量、单柱面扇区数,即可精准算出:分区总扇区数、分区总容量、分区对应的 LBA 地址区间。

九、inode 索引节点
9.1 Linux 文件核心设计思想
Linux 文件 = 内容数据 + 属性数据,内容与属性完全分离存储
- 文件正文、二进制数据 → 存储在数据块 Block 中
- 文件权限、大小、属主、时间、链接数 → 存储在 inode 索引节点中
9.2 ls -l 与 stat 指令实操解析
执行基础列表指令 ls -l,展示 7 大文件属性:权限模式、硬链接数、所有者、所属组、大小、修改时间、文件名。

执行详细属性指令 stat test.c,展示的绝大多数元数据,全部来源于 inode(包括 Inode 号、Links 数、IO Block、Access/Modify/Change 时间等)。

9.3 inode 核心定义
inode(索引节点):专门存储文件属性元数据的磁盘数据结构
- 一个文件对应唯一一个 inode;
- 每个 inode 拥有全局唯一 inode 编号;
- Ext2/Ext3 默认 128字节,Ext4 支持 256字节;
- 无论文件大小,inode 占用磁盘大小固定不变。
9.4 超级关键坑点
文件名 不存储在 inode 内部!
文件名存储在目录文件的数据块中,目录文件维护「文件名 → inode号」的映射关系。这也是硬链接可以多个文件名对应同一个 inode 的底层原理。
9.5 原生 ext2_inode 磁盘结构体(内核源码级详解)
c
struct ext2_inode {
__le16 i_mode; // 文件类型、权限
__le16 i_uid; // 所有者UID低16位
__le32 i_size; // 文件字节大小
__le32 i_atime; // 最近访问时间
__le32 i_ctime; // 属性修改时间
__le32 i_mtime; // 内容修改时间
__le32 i_dtime; // 文件删除时间
__le16 i_gid; // 所属组GID低16位
__le16 i_links_count; // 硬链接计数
__le32 i_blocks; // 文件占用磁盘块数
__le32 i_flags; // 文件特殊标志
union {
// 多系统保留字段
} osd1;
// 核心:15个块指针,定位文件数据块
__le32 i_block[EXT2_N_BLOCKS];
__le32 i_generation; // NFS文件版本
__le32 i_file_acl; // 访问控制列表
__le32 i_dir_acl;
__le32 i_faddr;
union {
// 多系统保留字段
} osd2;
};
#define EXT2_NDIR_BLOCKS 12
#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS
#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)
#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
// 最终:i_block[15]
9.6 15 级块指针模型(Ext 文件系统核心)
i_block[15] 是 inode 最核心的结构,负责定位文件所有数据块:
- 12个直接块指针:直接指向数据块,小文件直接访问,速度最快;
- 1个一级间接块指针:指向间接块表,间接表存储数据块指针;
- 1个二级间接块指针:二级跳转,支撑中大文件;
- 1个三级间接块指针:三级跳转,支撑超大文件。
设计目的:兼顾小文件访问速度,同时支持超大文件存储。
结语:
今天的内容到这里就结束了,希望你能有所收获~
干货整理到手抖,觉得有用的话,赏个三连回回血?__(:ᗤ」ㄥ)_ _


