文件存在磁盘上到底长什么样?一文吃透 Linux 磁盘文件系统核心原理

📅 2026/6/26 23:36:43
文件存在磁盘上到底长什么样?一文吃透 Linux 磁盘文件系统核心原理
一、文件系统的本质给磁盘穿上 “结构化外衣”磁盘本身只是一块可以按扇区通常 512 字节读写的裸存储设备没有 “文件”“文件夹” 的概念只能按物理地址读写原始二进制数据。文件系统就是操作系统在磁盘上建立的一套数据组织结构和管理规则它把磁盘空间划分成统一管理的单元实现按文件名存取数据不用记忆物理扇区地址支持目录层级、文件权限、时间戳等属性自动管理空闲空间分配、回收、碎片化处理保障数据可靠性支持异常恢复。简单类比裸磁盘 空白的白纸只有页码没有内容分类文件系统 在白纸上画好表格、做好目录索引让你可以按标题快速找到内容。二、Linux 文件系统双层架构VFS 具体文件系统Linux 支持几十种不同的文件系统ext4、xfs、btrfs、ntfs 等为了给上层提供统一接口内核设计了虚拟文件系统Virtual File SystemVFS抽象层。1. VFS 虚拟文件系统VFS 是内核的抽象框架定义了一套所有文件系统都必须遵守的通用接口和数据模型向上给用户态提供统一的系统调用open/read/write。 无论底层是 ext4 还是 xfs是本地磁盘还是网络文件系统上层应用的调用方式完全一致实现了 “一套接口多种实现”。VFS 的四大核心对象超级块super_block描述整个文件系统的全局信息比如块大小、inode 总数、空闲块数量索引节点inode描述一个文件的元数据大小、权限、时间、数据块指针每个文件对应唯一 inode目录项dentry描述文件名和 inode 的对应关系维护目录层级结构文件对象file描述一个被进程打开的文件保存读写偏移等运行时状态。2. 具体文件系统负责落地 VFS 定义的接口真正管理磁盘上的数据布局常见实现ext4Linux 主流日志文件系统稳定通用xfs高性能日志文件系统适合大文件、大存储场景btrfs支持快照、校验、子卷的新一代文件系统。三、磁盘物理布局以 ext4 为例数据到底存在哪一个 ext4 文件系统会把磁盘分区划分为一个个块组Block Group每个块组结构完全相同分散管理减少磁道寻道开销。单个块组的结构从前往后依次是引导块存放系统引导信息只有第一个块组有超级块副本整个文件系统的元数据备份损坏时可用于恢复块组描述符表记录当前块组的空间使用状态数据块位图用二进制位标记每个数据块是空闲还是已占用inode 位图用二进制位标记每个 inode 是空闲还是已占用inode 表连续存放该块组所有的 inode 结构体数据块区域真正存放文件内容的地方是磁盘空间的主体。关键单位说明扇区磁盘硬件最小读写单位通常 512 字节是磁盘的物理属性块Block文件系统最小读写单位是逻辑概念通常 4KB8 个扇区是内核和文件系统交互的最小单元。四、文件的唯一身份inode 与目录项1. inode文件的 “身份证”每个文件对应唯一的 inode 编号inode 里存储了文件的所有元数据唯独不存储文件名文件大小、权限位rwx、所有者、所属组三个时间戳创建时间、修改时间、访问时间数据块指针指向文件内容所在的数据块地址硬链接计数。经典结论Linux 系统中文件名不是文件的固有属性只是用来查找 inode 的别名。2. 目录项 dentry文件名的索引目录本身也是一种特殊文件它的内容就是一张目录项表每条记录包含「文件名 对应的 inode 编号」。 我们根据文件名找文件的过程本质就是在目录文件里查找文件名得到对应的 inode 编号根据 inode 编号找到 inode 结构体根据 inode 里的数据块指针读取文件内容。这也解释了为什么硬链接可以跨目录访问同一个文件、删除文件名不代表删除数据 —— 只要 inode 的硬链接计数不为 0文件数据就还在。五、读取一个文件的完整内核流程以read系统调用读取普通文件为例完整执行链路用户调用read系统调用陷入内核态VFS 层接收请求根据文件路径逐层解析目录项找到目标文件的 inode内核先检查页缓存中是否有对应的数据页缓存命中直接把数据从内核页缓存拷贝到用户空间函数返回全程不碰磁盘缓存未命中内核根据 inode 的数据块指针计算出磁盘上的物理块地址内核向块设备层发起读请求通过磁盘控制器读取对应扇区的数据数据先载入内核页缓存再拷贝到用户空间系统调用返回切回用户态程序拿到数据。写文件的流程write系统调用陷入内核找到对应 inode分配数据块如果需要数据写入内核页缓存对应页面标记为脏页write直接返回用户认为写入完成内核后台回写线程定期把脏页批量写入磁盘完成真正的持久化。六、文件系统与内核页缓存的协同文件系统和内核页缓存是深度绑定的所有文件读写默认都经过页缓存只有设置O_DIRECT标志才会绕过缓存直接 IO页缓存以文件的页为单位缓存和文件系统的块对齐提升命中率预读机制读取文件时内核会提前把后面的几个页面也加载进缓存利用空间局部性提升顺序读性能。七、生活化举例理解举例 1图书馆类比文件系统架构可以把整个文件系统比作一座图书馆各个组件一一对应裸磁盘 图书馆所有书架的物理空间只有位置编号没有分类VFS 虚拟文件系统 图书馆统一的借阅规则无论什么类别的书借还流程完全一致ext4/xfs 等具体文件系统 不同阅览室的书架摆放、分类规则inode索引节点 每本书的索引卡片记录了书的作者、页数、存放架位唯独不写书名目录项 前台的书名检索目录记录「书名 → 索引卡编号」的对应关系数据块 书架上真正放书的位置查找文件的过程 先查书名目录拿到索引卡编号再凭索引卡找到书的具体位置。举例 2查找/home/user/test.txt的完整过程我们日常按文件名打开文件内核底层会走完整的目录解析流程系统先获取根目录/的 inode固定编号读取根目录的目录项表找到home目录对应的 inode 编号根据home的 inode 编号读取home目录文件的内容目录项表找到user目录对应的 inode 编号根据user的 inode读取user目录的目录项找到test.txt对应的 inode 编号根据 inode 编号在 inode 表中定位到该文件的 inode 结构体获取文件权限、大小、数据块指针等信息最后根据数据块指针到磁盘对应位置读取文件的实际内容。八、核心考点与易混区分易混点文件名存在哪里 正解存在目录文件的目录项里不在 inode 里。易混点文件大小受什么限制 正解受 inode 里数据块指针的寻址能力和磁盘空间共同限制。考点VFS 的作用与四大核心对象。考点ext4 块组的结构inode 包含的内容。结论write成功不代表数据落盘只是写入了页缓存强持久化必须调用fsync。九、思维导图Linux磁盘文件系统原理 ├─ 本质在裸磁盘上建立的结构化数据管理规则 ├─ 双层架构 │ ├─ VFS虚拟文件系统 │ │ ├─ 作用统一上层接口屏蔽底层差异 │ │ └─ 四大对象超级块、inode、目录项、文件对象 │ └─ 具体文件系统ext4、xfs、btrfs等落地磁盘管理 ├─ ext4磁盘布局块组 │ ├─ 引导块、超级块副本 │ ├─ 块组描述符、数据块位图、inode位图 │ ├─ inode表存放所有inode结构体 │ └─ 数据块区域存储文件实际内容 ├─ 核心概念 │ ├─ inode文件元数据大小、权限、指针不含文件名 │ ├─ 目录项文件名→inode编号的映射表 │ ├─ 扇区磁盘物理最小单位512B │ └─ 块文件系统逻辑最小单位通常4KB ├─ 文件读写全流程 │ ├─ 读解析路径找inode → 查页缓存 → 命中直接返回未命中读磁盘 │ └─ 写写入页缓存标记脏页 → 后台线程异步回写磁盘 ├─ 与页缓存协同 │ ├─ 默认所有IO经过页缓存提升性能 │ ├─ O_DIRECT可绕过缓存实现直接IO │ └─ 预读机制提升顺序读性能 └─ 核心考点 ├─ inode不存储文件名文件名在目录项中 ├─ VFS的作用与四大对象 ├─ write成功≠数据落盘fsync才保证持久化 └─ ext4块组的组成结构谢谢