XFS 文件系统实现解析

本文是《XFS Algorithms & Data Structures》阅读笔记。

基础知识

概览

接口

XFS 提供标准 Unix 文件系统接口:树形文件 / 目录组织,符号链接,设备。

所有 FS 中的实体都是一个索引节点(index node, or inode)。每个索引节点拥有唯一的 inode 编号。

XFS 的 inode 也有 Unix 文件通用属性之外的扩展属性。

分配组(Allocation Group):XFS 划分的大小完全相等的大块(Chunks),每个 AG 中可以独立存在一个操作系统。从而 XFS 可以实现并行操作。

每个分配组使用多个 B+ 树来维护记录(比如空闲块的位置,已分配 inode 的位置,空闲 inode 的位置)

岔:每个实体可以拥有最多两个块字典(block map),又称岔(fork),从而将文件系统的块映射到某个文件或目录。

特性岔(attribute fork):是一些块,能够存储和索引某个文件的扩展特性。

日志:XFS 会记录文件系统的元数据变化。

元数据

文件系统最大的挑战在于验证结构。因为文件系统是很容易遇到一些奇葩操作导致损坏的,所以一方面要避免违规操作,另一方面要能检测和修复结构错误。版本 5 的磁盘格式支持如下元数据:

  • 魔数:用于区分元数据类型

  • 文件系统 UUID 副本:用于确保给定磁盘块连接到上级块(superblock)

  • 所有者

  • 块号:防止错误的写入

  • 最后写入的日志序号:避免重放日志

  • CRC32 校验和

为了保证元数据自己也是靠谱的,还需要记录更多信息。