2. 存储硬件基础回顾:机械硬盘(HDD)与固态硬盘(SSD)

在深入 inode 分配与块设备驱动之前,必须重新理解底层存储介质的物理特性。机械硬盘(HDD)与固态硬盘(SSD)在物理结构、寻址方式和性能指标上存在本质差异,这些差异直接影响文件系统的布局策略和 IO 调度算法。

2.1 机械硬盘(HDD)物理结构

HDD 的核心组件包括盘片(Platter)、磁头(Head)、主轴电机(Spindle Motor)和音圈电机(Voice Coil Actuator)。数据存储在盘片的磁性涂层上,通过磁头在高速旋转的盘片表面飞行读写。

关键物理限制: 寻道时间(Seek Time)是 HDD 最慢的操作,通常为 4–15 ms,远高于旋转延迟(Rotational Latency,7200 RPM 下约 4.17 ms)。文件系统应尽量将相关数据块连续存放,减少磁头移动。
机械硬盘(HDD)内部结构示意 盘片 M H H 音圈电机 关键组件 • 盘片:存储介质 • 磁头:读写单元 • 主轴:旋转驱动 • 音圈电机:寻道驱动 磁道(Track)与扇区(Sector)构成同心圆数据布局

2.2 固态硬盘(SSD)物理结构

SSD 基于 NAND Flash 芯片,无机械运动部件。其基本存储单元为浮栅晶体管,按组织层级分为:Cell → Page → Block → Plane → Die → Chip。

  • Page(页): 读写最小单元,通常 4KB–16KB。
  • Block(块): 擦除最小单元,通常 256–512 个 Page,大小 2MB–8MB。
  • FTL(Flash Translation Layer): 核心固件层,负责逻辑地址到物理地址的映射、垃圾回收(GC)、磨损均衡(Wear Leveling)。
写入放大(Write Amplification): 由于 SSD 不能覆盖写,必须擦除整个 Block 后再写入,导致实际写入量大于逻辑写入量。文件系统应尽量对齐写入大小(4KB 对齐),减少不必要的搬移。
固态硬盘(SSD)层级结构 Die 0 Plane 0 Block 0 Block 1 Block N Plane 1 Block 0 Block 1 Block N Block 内部结构 Page 0(4KB) Page 1(4KB) Page 2(4KB) Page 3(4KB) Page N(4KB) 擦除单位:Block | 读写单位:Page

2.3 寻址方式:CHS 与 LBA

操作系统通过逻辑地址访问存储设备,底层需要转换为物理位置。历史上存在两种寻址模式:

特性 CHS(Cylinder-Head-Sector) LBA(Logical Block Addressing)
组成 柱面(C) + 磁头(H) + 扇区(S) 线性逻辑块号(0, 1, 2, ...)
适用设备 早期 HDD(IDE/ATA) 所有现代 HDD 和 SSD
最大容量限制 约 8.4 GB(CHS 24-bit) LBA48 支持 128 PB
转换方式 INT 13h 中断 / BIOS 转换 ATA/SCSI 命令直接传递
文件系统视角 需考虑几何参数 线性地址空间,透明
工程实践: 现代 Linux 块设备驱动完全基于 LBA 寻址。在编写驱动时,只需处理 sector_t 类型的逻辑块号,无需关心物理柱面/磁头。CHS 仅在老旧磁盘分区工具(如 fdisk 的 -c 选项)或虚拟机兼容模式下出现。

2.4 IO 性能指标:IOPS 与延迟

衡量存储设备性能的两个核心指标:

  • IOPS(Input/Output Operations Per Second): 每秒完成的 IO 请求数。随机小 IO(4KB)场景下,SSD 可达数万至百万 IOPS,HDD 通常只有 100–200 IOPS。
  • 延迟(Latency): 单个 IO 请求从发出到完成的时间。HDD 平均延迟 5–15 ms,SSD 通常 0.02–0.2 ms。
场景 HDD 典型值 SSD 典型值 文件系统影响
顺序读(128KB) 150–250 MB/s 500–7000 MB/s 大块预读策略有效
随机读(4KB) 0.5–2 MB/s(≈100–500 IOPS) 200–1000 MB/s(≈50K–250K IOPS) inode 分散时性能急剧下降
随机写(4KB) 0.5–2 MB/s 100–500 MB/s(受写入放大影响) 日志/元数据写回策略需优化
IO 延迟(随机 4KB) 5–15 ms 0.02–0.2 ms SSD 下 IO 栈开销占比更大
HDD vs SSD 随机 IO 延迟对比(4KB) HDD 延迟:5 – 15 ms SSD 延迟:0.02 – 0.2 ms 0 ms ~7.5 ms 15 ms SSD 延迟约为 HDD 的 1/100,文件系统设计需重新权衡

2.5 对文件系统设计的工程启示

核心结论: 文件系统的 inode 分配策略必须感知底层存储特性。
  • HDD 优化方向: 减少寻道次数。inode 与数据块尽量靠近(如 Ext4 的 flex_bg 特性),使用块组(Block Group)局部化元数据。
  • SSD 优化方向: 减少写入放大。inode 分配应尽量对齐到 Page 边界(4KB),避免小碎片写入;使用 TRIM/Discard 命令通知 SSD 释放无效块。
  • 通用原则: 无论 HDD 还是 SSD,inode 的连续分配和预分配都能提升顺序 IO 性能;随机 IO 场景下,inode 的局部性比绝对位置更重要。
避坑提醒: 在 SSD 上使用传统 HDD 优化的文件系统参数(如降低碎片容忍度、频繁 sync)可能导致更差的性能和更短的寿命。务必根据 /sys/block/sdX/queue/rotational 判断设备类型,动态调整 IO 调度器(mq-deadline 或 none)。