一篇围绕文件系统硬件展开的学习笔记。


文件系统是对具体存储介质的抽象。本篇讨论文件系统背后的硬件基础:磁盘、SSD、磁带,以及它们如何影响连接方式、调度、格式化、引导和交换空间。

1. 磁盘分类

文件系统最典型的外存设备是机械磁盘。它可以看成是由盘片、磁道、柱面和扇区构成的物理结构。

对象含义
盘片用磁性材料保存数据的圆盘
磁道盘片表面上的同心圆轨迹
柱面多个盘片上同一半径的磁道集合
扇区磁道上的更小划分,通常是最小传输单位的一部分

读写磁头附着在磁臂上,悬浮在盘片表面之上。磁盘 I/O 的主要延迟来自两部分:

延迟含义
寻道时间磁臂移动到目标柱面的时间
旋转延迟盘片旋转到目标扇区下方的时间

机械磁盘之外,文件系统还会面对 SSD 和磁带。

设备特点
SSD没有机械运动部件,延迟更低,功耗更小,但容量、成本和寿命都有自己的权衡
磁带容量大,适合备份和归档,但随机访问极慢

机械磁盘和 SSD 的差异,直接决定了后面的调度策略是否有意义。磁带则更像离线存储媒介,而不是常规文件系统的主战场。

磁盘旋转还涉及两种常见速度控制方式:

方式含义
CLVConstant Linear Velocity,保持单位时间内经过磁头的扇区数量大致恒定
CAVConstant Angular Velocity,保持盘片角速度恒定

CD、DVD 一类介质更接近 CLV,而机械硬盘通常采用 CAV。在 CAV 下,外层磁道比内层磁道更长,因此往往能够容纳更多扇区。

从操作系统角度看,磁盘通常又会被抽象为逻辑块的一维数组。逻辑块是最小传输单位,常见大小为 512B ,也可能因设备和低级格式化方式不同而变化。文件系统最终面向的,是这组线性编号的逻辑块,而不是直接操作柱面、磁道和扇区。

2. 磁盘连接

磁盘通常有两种接入方式:主机连接存储和网络连接存储。

方式含义
主机连接存储通过 I/O 总线直接连接到主机
网络连接存储通过网络远程访问存储设备

主机连接存储常见于本地磁盘、RAID 阵列和直接连接的外设,典型总线包括 ATA、SATA、USB 和 Fibre Channel 等。

网络连接存储则把存储看成远程服务,通过 NFS、CIFS 或 iSCSI 一类协议访问。它更灵活,但带来额外网络开销。

3. 磁盘调度

磁盘调度可以是操作系统的一部分,也可以是磁盘控制器的一部分,或者两者同时参与。

位置更擅长处理什么局限
操作系统结合任务优先级、请求来源和系统负载做调度难以完全掌握设备内部的物理细节
磁盘控制器根据物理位置减少寻道和旋转延迟难以判断请求服务于哪个应用、优先级多高

因此,两层调度关注的问题并不相同。操作系统更关心“哪些请求更应该先完成”,例如交换区访问可能比普通文件访问更紧急;控制器更关心“怎样按物理位置重排请求更省时间”。

磁盘调度解决的是“多个 I/O 请求按什么顺序服务更合适”。

磁盘访问时间由三部分相关因素决定:

因素含义
寻道时间头移动到目标柱面的时间
旋转延迟盘片转到目标扇区的时间
传输时间真正读写数据的时间

调度策略的核心目标是减少磁头移动、降低平均等待时间,并尽量提高磁盘带宽。

FCFS

先来先服务(First-Come First-Served)最简单,也最公平,但不关心请求在磁盘上的位置。

SSTF

最短寻道时间优先(Shortest-Seek-Time-First)总是选择离当前磁头最近的请求。它通常比 FCFS 更快,但可能导致远处请求长期得不到服务。

SCAN 与 C-SCAN

SCAN中,磁头在最内部磁道与最外部磁道间来回循环移动,处理沿途的请求。也被称为电梯算法。 C-SCAN(Circular SCAN)中,磁道从最内部磁道移动到最外部磁道,处理沿途的请求,但回程过程迅速且不处理任何请求。

LOOK 与 C-LOOK

在SCAN调度中,磁头在最内部磁道与最外部磁道之间来回运动。但LOOK调度只在当前任务序列覆盖 的最内部磁道与最外部磁道之间运动,即LOOK调度只遍历磁盘空间的子集

SCAN调度与C-SCAN调度, LOOK调度与C-LOOK调度解决了调度的饥饿问题,并且在请求位置随机分布的大负荷系统上表现优越。

对比

机械磁盘最适合这些调度算法,因为它们确实存在显著的机械延迟。SSD 没有磁头和旋转延迟,所以这类调度的收益大幅下降。

磁盘调度的效果还会受到文件系统布局影响。文件分配方式会改变请求目标在磁盘上的分布,因此也会改变磁头移动模式。

布局因素对调度的影响
连续分配文件数据更集中,顺序访问时磁头移动更少
链接分配与索引分配数据块更容易分散,访问过程更可能跨越多个区域
目录与索引块的位置路径解析和索引查找会引入额外 I/O

文件访问通常不会直接从数据块开始。路径需要逐级解析目录,索引分配还可能先访问 inode 或间接块,再访问真正的数据块。因此,目录、索引块和数据块若相距较远,即使读的是一个小文件,也可能经历多次寻道和旋转延迟。

一般而言,机械磁盘更常使用 SSTFLOOK 一类强调减少机械移动的策略;SSD 没有移动部件,FCFS 这类简单策略往往已经足够。

4. 磁盘格式化

磁盘格式化至少可以分成两层:低级格式化,以及分区后的逻辑格式化。

低级格式化

新磁盘最初只是可记录数据的物理介质,还不能直接供文件系统使用。低级格式化会把盘面划分成可寻址的扇区,并为每个扇区写入固定结构。

一个扇区通常包含下面几个部分:

部分作用
头部记录扇区标识等控制信息
数据区存放真正的数据
尾部保存纠错码等校验信息

低级格式化完成后,磁盘才具备最基本的读写单位。

分区与逻辑格式化

分区会把磁盘划分成多个连续区域。操作系统可以把每个分区视为一个独立的逻辑磁盘,再决定其用途。

步骤作用
分区划分磁盘边界,决定哪些区域属于哪个用途
逻辑格式化在分区上建立文件系统,并写入初始元数据

逻辑格式化写入的并非用户文件,而是文件系统自己的起始结构,例如空目录、超级块、inode 区域或其他卷控制信息。

并不是每个分区都必须建立文件系统。交换区或某些原始分区可以跳过逻辑格式化,直接把该区域视为逻辑块数组使用。

5. 引导块

系统启动时,ROM 中的自举程序本身通常很小,它只能完成最基本的硬件初始化和定位工作。接下来,它需要从磁盘上找到更完整的引导程序,并把它装入内存执行。

引导块保存的就是这一步所需的信息或代码。它通常位于启动分区的开头,因此常被看成磁盘上最早被访问的结构之一。

启动过程通常包含如下步骤:

  1. 处理器启动后执行 ROM 中的自举代码。
  2. 自举代码定位可启动设备上的引导块。
  3. 引导块中的引导程序被读入内存并开始执行。
  4. 更完整的引导程序继续定位并加载操作系统内核。

这也是为什么启动分区和普通数据分区并不完全相同。前者不仅保存文件系统数据,还承担“把内核带起来”的责任。

6. 交换空间

交换空间可以放在两种地方:

形式特点
文件系统中的特殊文件管理方便,但访问路径更长
原始分区直接使用块设备,性能更直接

交换区往往按块直接使用,数据结构由内存系统管理,因此原始分区是常见选择。