文件系统把块设备组织成目录和文件,回答”名字怎么找到数据、数据存在哪、崩溃后怎么恢复”。本文讲清 inode 与 dentry 的分工、硬链接与软链接的本质差异、VFS 抽象层、Page Cache 与 mmap 的关系,以及 ext4、XFS、Btrfs 三种常见文件系统的定位。

文件系统在管什么

对应用来说,文件是路径加字节流;对磁盘来说,只有一堆编号的数据块。文件系统夹在中间,负责四件事:命名(路径到对象的映射)、组织(目录树)、定位(文件第 N 个字节对应哪个块)、保护(权限与所有者)。理解这四件事,inode、dentry、Page Cache 这些名词就各就各位了。

inode 与 dentry:名字和实体分离

inode(索引节点)是文件系统对象的身份证,记录类型、权限、所有者、大小、时间戳和数据块位置,唯独不记文件名。文件名存在目录里——目录本质上是一种特殊文件,内容就是”文件名 → inode 号”的映射表。

dentry(目录项)则是内核在内存里建的查找缓存:路径 /var/log/app.log 每解析一级就生成一个 dentry,指向对应 inode,下次访问同一路径就不必重新翻目录。可以粗略记成:文件名在磁盘目录项里,dentry 在内存里,inode 代表文件实体。

这套”名字与实体分离”的设计解释了很多现象:同一文件系统内 mv 改名只是改目录项,数据纹丝不动;文件被删除后,只要还有进程打开着,inode 和数据块就不会释放,df 依然显示空间被占。

硬链接 vs 软链接

维度 硬链接 软链接(符号链接)
指向 同一个 inode 一段路径字符串
inode 不新建,inode 链接计数加一 自己是独立文件,有新 inode
删除源文件后 数据仍在,链接照常可读 变成悬空链接
跨文件系统 不能 可以
链接目录 普通接口不允许 可以

本质差异在引用层级:硬链接是目录项层面的第二个名字,与原名完全平等,inode 链接计数归零且无人打开时数据才真正回收;软链接是文件层面的转发,内核读到它后按保存的路径重新解析一次。硬链接不能跨文件系统,是因为 inode 号只在本文件系统内有意义,换一套编号体系就失效了。

VFS:一层抽象换掉 N 套接口

Linux 同时支持 ext4、XFS、Btrfs、tmpfs、procfs、NFS 等文件系统,应用不可能为每种写一套打开逻辑。VFS(虚拟文件系统)在中间定义统一对象——superblock(一个挂载实例)、inode(一个文件对象)、dentry(路径组件)、file(一次打开)——应用调用的 open/read/write 由 VFS 转发给具体实现。于是 cat /proc/cpuinfo 和 cat /var/log/app.log 走同一套接口,差别被压到抽象层之下。

Page Cache 与 mmap

读写磁盘比内存慢几个数量级,Linux 用 Page Cache 把文件数据页缓存在内存里:read 命中缓存就不碰磁盘;write 通常只把缓存页标脏便返回,由内核择机回写。这也解释了 free 里 buff/cache 很大是常态,以及 write 返回成功不等于落盘——要持久性必须 fsync。

mmap 与 Page Cache 是”同一缓存、两种视图”的关系:mmap 把文件页直接映射进进程地址空间,应用像访问内存一样访问文件,缺页时由内核把对应页调入 Page Cache。相比 read/write 的”内核拷贝到用户缓冲区”,mmap 省掉这次拷贝,适合随机访问大文件;Kafka 正是用 mmap 把日志文件交给 Page Cache 管理。

ext4、XFS、Btrfs 的定位

  • ext4:成熟稳重的通用默认盘,用 extent 管理大块、日志保证元数据一致,绝大多数发行版的默认选择。
  • XFS:面向大文件与高并发 I/O,延迟分配与 extent 设计出色,适合数据库、视频存储等大吞吐场景。
  • Btrfs:写时复制(CoW)文件系统,原生快照、校验和、多设备管理,适合需要快照和数据自校验的场景,代价是部分负载下性能不如前两者稳定。

实践要点

  • 磁盘满先看两处:df -h 看块用量,df -i 看 inode——海量小文件可能先耗尽 inode。
  • df 满而 du 找不到大文件,多半是被删除但仍被进程持有的文件,lsof +L1 能查出来。
  • 关键数据写入后按语义 fsync;新建或重命名后要求掉电不丢,还要对父目录做一次 fsync。

小结

  • inode 记录元数据与块位置,dentry 缓存路径查找,文件名只活在目录里。
  • 硬链接是同一 inode 的别名,软链接是保存路径的独立文件。
  • VFS 统一接口,Page Cache 统一缓冲,mmap 把文件页映射成内存视图。
  • ext4 通用、XFS 擅长大文件高并发、Btrfs 主打快照与 CoW。