2. 存储硬件基础回顾
在深入 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)。文件系统应尽量将相关数据块连续存放,减少磁头移动。
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 对齐),减少不必要的搬移。
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 栈开销占比更大 |
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)。