【Linux 系统篇(二十七)】文件(四):Ext 系列文件系统(上):从物理磁盘到逻辑抽象


大家好,欢迎来到 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、内存、显卡、网卡均为纯电子元器件,依靠电信号光速传输数据;唯独机械硬盘依靠马达旋转、磁臂摆动、磁头悬浮等物理机械运动完成读写。

  基于硬件属性,机械磁盘具备四大核心特征:

  1. 属于外设设备:磁盘不属于计算机核心内存设备,是典型外部存储外设。CPU 无法直接读取磁盘数据,必须先加载到内存,再由 CPU 处理。
  2. 速度极慢:机械运动速度远低于电子信号,寻道、旋转、等待扇区对齐,是磁盘 IO 延迟的根本来源。
  3. 容量巨大、性价比极高:相比固态硬盘,机械硬盘单位 TB 价格极低,是服务器冷数据、长期备份数据的核心存储介质。
  4. 结构精密、怕震动、怕磁场、怕灰尘。

1.2 拓展科普:机房、服务器、磁盘磁铁原理

1.2.1 机房与服务器科普

  我们日常使用的云服务器、云主机,物理载体全部托管在专业 IDC 机房:

  • 服务器 :企业级专用主机,支持硬盘热插拔、7×24 小时不间断运行,硬盘负载、转速、精度远高于家用硬盘;

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

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

  家用电脑硬盘仅适合间歇性使用,无法承受服务器级别的不间断读写压力。

1.2.2 磁盘与磁铁的核心原理

  机械硬盘的存储本质是磁记录原理 :盘片表面涂覆磁性介质,磁头通过改变介质磁极的南北方向,区分二进制的 0 和 1,从而永久存储数据。

由此得出两个关键结论:

  1. 磁盘惧怕强磁铁:强磁场会直接打乱盘片磁性排布,导致数据永久性损坏。
  2. 磁盘绝对不能私自开盖:硬盘内部为高度无尘(高端盘为充氦)环境,普通空气的微小灰尘,落在高速旋转的盘片上,会直接刮伤盘面,造成物理坏道、磁盘报废,普通环境无法维修。

二、 磁盘完整物理结构

  机械硬盘所有的数据存储、寻址、读写逻辑,全部依赖以下物理组件,所有文件系统底层原理均源于此。

2.1 核心物理组件

  1. 盘片(Platter):磁盘的数据真正存储载体,一般为铝合金/玻璃基底,表面镀磁性涂层。一块硬盘可包含多张盘片,每张盘片分为正反两个盘面,均可独立存储数据。

  2. 主轴 & 主轴马达:所有盘片固定在同一根主轴上,马达驱动所有盘片同步高速旋转(7200/10000 转/分钟)。所有盘片转速完全一致,无法单独旋转某一张盘片。

  3. 磁头(Head):磁盘的读写"笔尖",悬浮在盘面上方纳米级高度,不接触盘面。规则:一个盘面对应一个独立磁头,一张盘片对应两个磁头。

  4. 磁头传动臂(核心重点) :所有磁头全部固定在同一根传动臂上,共进退、共移动!磁臂摆动时,所有盘面的磁头同时向圆心/外圈移动,无法单独移动单个磁头。

  5. 驱动电机 & 控制电路板(含伺服系统):负责驱动磁臂摆动(音圈马达)、磁头信号解析、磁盘固件运算、以及后面要讲的 LBA 与 CHS 地址转换工作。


三、 磁盘存储逻辑结构:磁道、扇区、柱面

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

3.1 磁道(Track)

  盘面上同心圆环轨道即为磁道。编号规则:从最外圈从 0 开始编号,向内圈依次递增。

  特殊细节:磁盘最内侧靠近主轴的磁道,不存储任何数据,仅作为磁头断电停泊区,保护数据盘面不被划伤。

3.2 扇区(Sector)

  一条环形磁道,被均等切分为无数个扇形小块,每一个小块就是扇区。

  硬件核心定义 :扇区是磁盘硬件读写的最小单位,标准固定 512 字节。 磁盘硬件不支持读写半个扇区,所有硬件 IO 的最小粒度,都是一整个扇区。

3.3 柱面(Cylinder)

  结合「磁头共进退」的关键特性:当磁臂固定在某一个径向位置时,所有盘面、相同半径的所有磁道,堆叠形成一个虚拟圆柱体,这个虚拟结构就是柱面。

关键点:

  1. 柱面是逻辑概念,磁盘无真实物理结构;
  2. 柱面总数 = 单盘面磁道总数;
  3. 同一柱面下,所有磁道的扇区数量完全一致。

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 坐标,直接限制了磁盘最大容量:

  1. 磁头:8bit → 最大 2⁸ = 256
  2. 柱面:10bit → 最大 2¹⁰ = 1024
  3. 扇区:6bit → 最大 2⁶ = 63
    代入容量公式:最大容量 = 256 × 1024 × 63 × 512B = 8064MB ≈ 8.4GB

五、 磁盘逻辑重构:从三维 CHS 到一维 LBA 寻址

5.1 生活化类比:磁带模型

  磁带是所有人都能理解的一维线性存储结构,数据从头到尾连续排列,只有一个线性下标。

  磁盘物理上是环形三维结构,但操作系统不喜欢复杂的三维坐标。于是系统做了顶级抽象:把卷曲的磁盘,彻底拉直为一条线性磁带。

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

5.2 磁盘三维数组本质(底层核心模型)

  我们可以用 C 语言数组完美诠释磁盘存储结构:

  1. 单条磁道 :展开后是一维数组,元素为单个扇区;
  2. 单个柱面 :包含所有盘面的同半径磁道,是二维数组;
  3. 整块磁盘 :由无数柱面堆叠,是三维数组(C/H/S)。

  CHS 寻址,本质就是访问三维数组的 [C][H][S] 坐标。但在计算机底层,所有多维数组,最终都会被编译器平铺为一维数组。磁盘同理:三维 CHS 结构,最终被硬件平铺为一维 LBA 线性结构。

5.3 关键核心:地址转换执行者

  操作系统只使用 LBA,完全不感知 CHS!

  LBA 与 CHS 的互相转换,不是内核、不是软件完成,而是由磁盘自带固件、伺服硬件电路自动完成 。

  OS 下发指令:读取 LBA=1000,磁盘固件自动换算 CHS 物理坐标 → 控制磁臂、磁头、盘面完成读写。


六、 CHS 与 LBA 精准换算公式

6.1 编号规则

  1. 柱面 C、磁头 H:从 0 开始编号
  2. 扇区 S:硬件规则 从 1 开始编号
  3. 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 块的核心规则

  1. 块大小在 mkfs 格式化分区时确定,终身不可修改;
  2. Linux 默认标准:1块 = 8个扇区 = 4KB;
  3. 块是文件系统读写的最小单位(软件层面);
  4. 扇区是磁盘硬件读写的最小单位 (硬件层面)。
    (扇区是硬件概念,块是文件系统软件概念。)

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 分区机制中,分区划分的最小单位是柱面。此时我们可以将硬盘上的柱面(分区)进行平铺,将其想象成一个大的平面。

分区只需记录两个参数:

  1. 起始柱面号
  2. 结束柱面号

  通过柱面数量、单柱面扇区数,即可精准算出:分区总扇区数、分区总容量、分区对应的 LBA 地址区间。


九、inode 索引节点

9.1 Linux 文件核心设计思想

  Linux 文件 = 内容数据 + 属性数据,内容与属性完全分离存储

  1. 文件正文、二进制数据 → 存储在数据块 Block 中
  2. 文件权限、大小、属主、时间、链接数 → 存储在 inode 索引节点中

9.2 ls -l 与 stat 指令实操解析

  执行基础列表指令 ls -l,展示 7 大文件属性:权限模式、硬链接数、所有者、所属组、大小、修改时间、文件名。

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

9.3 inode 核心定义

  inode(索引节点):专门存储文件属性元数据的磁盘数据结构

  1. 一个文件对应唯一一个 inode;
  2. 每个 inode 拥有全局唯一 inode 编号;
  3. Ext2/Ext3 默认 128字节,Ext4 支持 256字节;
  4. 无论文件大小,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 最核心的结构,负责定位文件所有数据块:

  1. 12个直接块指针:直接指向数据块,小文件直接访问,速度最快;
  2. 1个一级间接块指针:指向间接块表,间接表存储数据块指针;
  3. 1个二级间接块指针:二级跳转,支撑中大文件;
  4. 1个三级间接块指针:三级跳转,支撑超大文件。

  设计目的:兼顾小文件访问速度,同时支持超大文件存储。


结语:

  今天的内容到这里就结束了,希望你能有所收获~

干货整理到手抖,觉得有用的话,赏个三连回回血?__(:ᗤ」ㄥ)_ _

相关推荐
沉下心来学鲁班33 分钟前
DeepAgents 记忆机制:让 AI Agent 拥有“跨对话“的记忆
服务器·人工智能·python
鬼手点金1 小时前
opencode-隐私优先配置
服务器·前端·javascript·bug·openclaw
夜之眷属1 小时前
记一次战斗服务器 CPU 打满 100% 且“无法恢复“的排查
java·linux·运维·服务器·后端·性能优化
超级大福宝1 小时前
VS Code Remote-SSH 因 RemoteForward 端口冲突导致连接失败的排查与解决
运维·服务器·windows·vscode·ssh
fengkai45451 小时前
十一、MySQL 第 4-7 章
运维·数据库·mysql
荣合技术服务1 小时前
服务器数据恢复服务商——荣合科算技术服务
运维·服务器·数据恢复·荣合科算
Sayai1 小时前
ClickHouse WITH FILL 实战:监控大屏时间序列补零,附多粒度指标表与物化视图级联设计
大数据·运维·数据仓库·clickhouse·物化视图
九章-悲回风1 小时前
Linux - Docker及常用镜像部署
linux·运维·docker
xUxIAOrUIII1 小时前
守护进程(daemon)
linux·运维