文件系统
文件系统是操作系统管理持久存储的子系统,负责把块设备上的字节组织成"文件"和"目录"两类命名对象,并提供访问控制、命名空间、持久性与一致性保证。
文件抽象与目录实现
文件在用户态是命名的字节序列,内核中则是 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_operations、file_operations、super_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 mdadm、dm-raid、ZFS 内置的 raidz)。