跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言

磁盘到 inode:深入理解 Linux ext 文件系统底层原理

从磁盘硬件原理出发,解析 Linux ext 文件系统的底层机制。内容包括磁盘物理与逻辑结构(扇区、LBA)、Ext 文件系统组成(Super Block、Inode、Block Bitmap)、路径缓存(dentry)及软硬连接原理。通过理解 inode 编号查询、块映射及目录树结构,帮助开发者掌握文件存储与管理核心知识,适用于调试、优化及数据恢复场景。

涅槃凤凰发布于 2026/3/27更新于 2026/6/229 浏览
磁盘到 inode:深入理解 Linux ext 文件系统底层原理

文件系统是操作系统管理存储的核心机制。本文将从磁盘硬件原理出发,剖析 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 # 建立空目录
sudo mount -t ext4 ./disk.img /mnt/mydisk/ # 将分区挂载到指定的目录
sudo umount /mnt/mydisk # 卸载分区

访问目录即访问分区,dentry 里面可以判断分区。

2.4 路径缓存(目录树)

路径解析效率低,操作系统会将历史访问的目录逐步形成目录树(多叉树),即路径缓存。

验证方法:

find / -name test.c

第一次查找慢(IO 操作),再次查找快(内存缓存)。

struct dentry 结构用于路径缓存,既属于多叉树,又是淘汰链表,还是哈希。

struct dentry {
    atomic_t d_count;
    unsigned int d_flags;
    spinlock_t d_lock;
    struct inode *d_inode;
    struct hlist_node d_hash;
    struct dentry *d_parent;
    struct qstr d_name;
    struct list_head d_lru;
    // ... 其他字段
};
  • d_hash:哈希表用来快速查询
  • d_lru:淘汰链表,用于内存回收
  • d_parent:指向父目录
  • d_inode:inode 结构的地址
struct inode {
    unsigned long i_ino;
    atomic_t i_count;
    umode_t i_mode;
    unsigned int i_nlink;
    uid_t i_uid;
    gid_t i_gid;
    loff_t i_size;
    // ... 其他字段
};

2.5 inode 与 Data Blocks 的映射

文件属性的 inode 结构里存储了一个数组,存储了文件内容相关的块地址。

EXT2_N_BLOCKS 定义为 15。前 12 直接索引,后面的是一级、二级、三级索引。

如果文件非常大,Data Block 存不下,文件内容可以跨组保存。

2.6 文件结构图解

  • fs 是'导航仪':告诉我'我在哪'(根目录、当前目录);
  • files 是'文件夹':告诉我'我打开了哪些文件'(fd 到 file 的映射)。

三、软硬连接原理

3.1 软连接

创建软连接:ln -s 原文件 目标文件

软连接是一个独立的文件,有独立的 inode number,属性变为 l,内容存储的是原文件路径。

Windows 系统下的快捷方式相当于软连接。

3.2 硬链接

创建硬链接:ln 原文件 目标文件

硬链接的 inode 编号和原文件一样,本质是在目录下新建一个文件名与 inode 编号的映射关系。

引用计数从 1 变成 2。删除文件时计数器减 1,除非计数器减到 0 才会被删。

注意:硬链接只能给普通文件进行建立,Linux 系统不支持给目录建立硬链接。但软连接没此限制。

. 和 .. 目录本质是硬链接,但系统做了特殊处理,防止路径查找瘫痪。

目录

  1. 一、硬件理解
  2. 1.1 磁盘物理结构
  3. 1.2 磁盘的逻辑结构
  4. 二、Ext 文件系统
  5. 2.1 文件属性与分区
  6. 2.2 组管理字段
  7. 2.3 inode 编号查询文件
  8. 2.4 路径缓存(目录树)
  9. 2.5 inode 与 Data Blocks 的映射
  10. 2.6 文件结构图解
  11. 三、软硬连接原理
  12. 3.1 软连接
  13. 3.2 硬链接
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Whisper Large v3 模型解析:语音特征提取与处理机制
  • Flutter 三方库 deepyr 的鸿蒙化适配指南:构建 DaisyUI 响应式 Web 应用
  • AI 大模型深度探索:理论、实践与职业成长攻略
  • AI Agent 入门与 Coze 零代码搭建实战指南
  • 基于 AI 大模型的图像 OCR 识别实践与对比分析
  • 2025 年 AIGC 六大发展趋势与落地应用
  • Python 三角洲行动:战术小队模拟器
  • 本地部署 OCR 文字检测系统:ResNet18 WebUI 一键启动指南
  • 基于 LLM 的智能运维 Agent 系统设计与实现
  • 算法学习入门指南:数据结构与核心算法实战
  • LabVIEW 巡检机器人高精度轨迹跟踪虚拟仿真系统
  • 开源医疗大模型 Llama3-Aloe-8B-Alpha 技术特性与性能分析
  • OpenClaw 高级配置:模型容灾、多 Agent 协作与远程 macOS 控制
  • 基于 Q-learning 的无人机三维路径规划算法原理与 MATLAB 实现
  • 双指针算法:计算有效三角形的个数
  • C/C++ 动态规划入门:二维路径问题实战解析
  • Spring @Transactional 事务未回滚?检查 MySQL 存储引擎配置
  • 前端加密(常用加密方式及使用)
  • OpenClaw 在 Ubuntu 22.04 上的安装与初始化指南
  • C++ 异常处理机制:异常捕获、自定义异常与实战应用

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online