跳到主要内容

文件系统

文件系统是操作系统管理持久存储的子系统,负责把块设备上的字节组织成"文件"和"目录"两类命名对象,并提供访问控制、命名空间、持久性与一致性保证。

文件抽象与目录实现

文件在用户态是命名的字节序列,内核中则是 inode(索引节点)或目录项等元数据 + 数据块的组合。目录本身也是文件,内容是"名字 → inode 编号"的映射表。常见组织方式:

  • 线性表:目录项顺序存储,查找线性扫描,适合小目录。
  • 哈希表:hashed name 查 O(1),Linux ext 系列使用变体。
  • B 树:大目录的常规方案,NTFS、ReiserFS、ext4 的 dir_index 都是。

FAT 表结构

FAT(File Allocation Table)是一张链式分配表,每个簇对应一项,记录"下一个簇号",文件末端的项用 0xFFFFFFFF 标记。FAT12/16/32 区别在于表项位数与最大卷大小。优点是结构简单、跨平台;缺点是大文件性能差(随机访问要顺序跳簇)、元数据简陋、无权限与日志原语。

inode 机制

UNIX 风格文件系统把文件元数据集中在 inode 中(大小、权限、时间戳、数据块指针)。inode 编号即文件身份,目录项只保存"名字 → inode 号"。数据块寻址通常采用直接指针 + 间接指针 + 多级间接指针的混合方案,既支持小文件快速访问,又能容纳大文件。

inode:
mode, uid, gid, size, atime, mtime, ctime, links
blocks[12] 直接块指针
blocks[13] 一级间接
blocks[14] 二级间接
blocks[15] 三级间接

Linux ext2/ext3/ext4、BSD UFS、macOS HFS+/APFS 都沿用此模型。

日志文件系统(Journaling)

意外断电会让元数据处于"半写"状态,传统 fsck 需要扫描整盘修复,代价巨大。日志文件系统把元数据变更先写入日志区(journal),再落到主文件系统,恢复时只需重放或丢弃日志。ext3/ext4、NTFS、XFS 都使用此技术,显著提升崩溃后的启动速度与一致性。

Linux VFS

VFS(Virtual Filesystem Switch)是 Linux 内核的统一文件操作接口层。open/read/write 系统调用经 VFS 分发到具体文件系统的 inode_operationsfile_operationssuper_operations 回调。这种"接口 + 多种实现"的解耦让同一套系统调用可以透明地访问 ext4、xfs、ntfs、nfs、proc、sysfs 等。

RAID 简介

RAID(Redundant Array of Independent Disks)通过多盘协作提升性能或可靠性:

级别思路优点缺点
RAID 0条带化读写并行,无冗余任意盘坏即数据丢失
RAID 1镜像高可靠,读可并行容量减半,写需双写
RAID 5条带 + 单盘奇偶校验容量利用率高,可容忍 1 盘故障写需计算奇偶,重建慢
RAID 6条带 + 双盘奇偶校验可容忍 2 盘同时故障写惩罚更大

实际生产中常组合使用,如 RAID 10(先 1 后 0)兼顾性能与可靠性;现代存储还引入 SSD 特性的 RAID 5E/6E 与软件定义方案(如 Linux mdadmdm-raid、ZFS 内置的 raidz)。