这是一个关于文件系统发展的系列文章的第二部分,主要介绍了 1984 年的 BSD Fast Filing System(FFS)及其在硬件、传统文件系统缺点、创新点、其他变化和改进以及性能等方面的情况:
- 硬件背景:1984 年,针对 4.3BSD 的计算机是桌面和机柜工作站,32 位数据寄存器和地址寄存器,外部数据和地址总线大小各异,早期 Sun Workstations 采用 68k CPU,后来推出了 SPARC 架构的 Sun - 4 系列,同时 MIPS 和 PA - RISC 架构的 CPU 也相继出现,DEC 的 VAX 是 32 位 CISC CPU 机柜电脑,1992 年才转为 RISC,1998 年被康柏收购后 CPU 停产,IP 于 2001 年卖给英特尔,当时工作站类型系统的主内存在低两位 MB 范围,系统时钟为两位数 MHz。
- 传统文件系统缺点:32 位 VAX 系统在 1980 年代的工作站工作中存在问题,如原始 Unix 文件系统在文件大小、I/O 速度和文件数量方面显示出结构问题,512 字节的 I/O 大小严重降低了磁盘子系统性能,文件系统元数据与实际数据分离导致访问文件时寻道时间长,单个目录中的文件未连续分配导致多次非连续块访问。
BSD FFS 创新点:
- 柱面组和理解 CHS:BSD FFS 理解硬盘的物理布局,将磁盘分为柱面组,每个柱面组成为传统 Unix 文件系统的迷你版本,包含超级块、本地 inode 区域和位图,位图的使用替代了传统文件系统中的空闲列表,同时考虑 CHS 布局确保超级块不总是在同一盘片,还能根据处理器和磁盘转速配置并记录交错因子以优化磁盘 I/O 吞吐量。
- 大区块、小碎片和尾部打包:FFS 内部使用至少 4KB 大小的逻辑块,通过尾部打包将多个文件的末端存储在同一逻辑块中,减少存储开销,同时防止文件缓慢增长导致的碎片和重新布局。
- 长寻道布局策略:引入布局策略控制新目录、文件的放置和大文件的处理,尽量将文件放置在合适的柱面组,对于大文件强制长寻道以均匀使用磁盘空间,虽会导致文件碎片但能保证大文件 I/O 效率。
- 目录布局策略:同一目录中的文件放置在同一柱面组,不同目录放置在不同柱面组,以确保文件系统空间的均匀使用,目录中的文件搜索和空闲空间管理较为复杂。
其他变化和改进:
- 长 inode 编号和块地址:inode 编号变为 32 位,数量从 64K 增加到 4G,inode 大小翻倍为 128 字节,磁盘块地址为 4 字节,可支持最大 16TB 文件系统大小,文件长度记录为
quad
,允许单个文件大小超过 4G。 - 长文件名:定义了更复杂的目录项结构,文件名限制为 255 字节,目录项长度按 4 字节边界对齐,目录搜索和空闲空间管理更复杂,空闲空间不通过压缩回收。
- 符号链接:引入新的文件类型
l
(符号链接),通过“替换文件名”确定链接目标位置,可跨越文件系统边界,不受链接计数限制。 - 重命名系统调用:引入
rename()
系统调用,替代之前的库函数实现,操作更原子,避免部分执行和恶意干扰。 - 配额:引入文件系统使用配额的概念,包括软限制和硬限制,修改文件系统行为以实现有用的配额管理,如更改文件所有者和组归属需有特权等。
- 咨询式锁定:在 4.2BSD 中引入
flock()
系统调用实现咨询式文件锁定,可共享或独占,适用于整个文件,无死锁检测,与文件描述符绑定,Posix 后来引入不同的锁系统fcntl()
,Linux 同时存在两种不兼容的文件锁定实现。
- 长 inode 编号和块地址:inode 编号变为 32 位,数量从 64K 增加到 4G,inode 大小翻倍为 128 字节,磁盘块地址为 4 字节,可支持最大 16TB 文件系统大小,文件长度记录为
- 性能:
ls
和ls -l
操作快速,因为同一目录中的文件 inode 在同一柱面组,读取和列出目录的寻道次数和距离低,理论最大带宽利用率从传统文件系统的 3%提高到 22%甚至 47%,在实际生产系统中取得良好效果,同时还有一些生活质量提升,如方便团队工作和解锁新功能,但 ext2 文件系统仍存在一些局限性,如非日志文件系统、处理大量条目和深层目录层次结构能力有限等,直到 1994 年 SGI 的 XFS 才解决这些问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。