Linux下判断挂载点是否在SSD,最可靠方法是查设备ROTA标志:值为0表示SSD,1表示HDD;需先用df和findmnt定位底层块设备,再读取/sys/block/*/queue/rotational,注意LVM、NVMe命名及虚拟化层干扰。

Linux 下用 stat 和 lsblk 判断挂载点是否在 SSD
直接看设备的 ROTA(Rotational)标志最可靠:值为 0 表示 SSD,1 表示机械盘。但注意,stat 只能查文件所在挂载点的底层块设备,不能跨 bind mount 或 overlayfs 直接穿透——得先找到真实挂载设备。
实操步骤:
- 用
df /path/to/file查出挂载点(比如/mnt/data) - 用
findmnt -n -o SOURCE /mnt/data获取对应块设备(如/dev/nvme0n1p2) - 执行
cat /sys/block/nvme0n1/queue/rotational(注意去掉末尾数字和 p*)——返回0即 SSD - 如果设备是 LVM 或 mdadm,需进一步查
lsblk -d -o NAME,ROTA,找最底层物理设备
常见坑:/dev/sda 不一定代表机械盘——某些 USB SSD 或旧 SATA SSD 也可能被识别为 sdX;ROTA=1 也不绝对等于 HDD,某些混合缓存盘或虚拟化层可能误报。
Windows 下通过 WMI 查询 MediaType 和 DeviceID
Windows 没有统一“SSD 标志”,得组合判断:Win32_DiskDrive.MediaType 是主要依据,但部分 NVMe 设备返回空或 Unspecified,此时要 fallback 到 Win32_PhysicalMedia 的 MediaDescription 或 Win32_DiskDrive.InterfaceType(NVMe 基本可认定为 SSD)。
立即学习“C++免费学习笔记(深入)”;
关键点:
-
MediaType == "SSD"最可信,但仅 Windows 10 1809+ 对 NVMe/PCIe SSD 支持良好 -
InterfaceType == "NVMe"或"PCI"且MediaType为空时,大概率是 SSD -
Win32_Volume只能查卷信息(如C:),无法直接关联到物理介质类型,必须先通过AssociatorsOf关联到Win32_DiskDrive - C++ 调用时建议用
IWbemServices::ExecQuery查SELECT MediaType, InterfaceType FROM Win32_DiskDrive,再比对DeviceID与路径所属磁盘
注意:BitLocker 加密卷、存储空间(Storage Spaces)池中的虚拟磁盘,MediaType 可能始终返回 Unspecified,此时只能依赖接口类型 + 性能特征(如队列深度、延迟)间接推断。
C++ 跨平台封装的现实约束
没有标准库函数能直接告诉你“这个路径是不是 SSD”,C++ 标准根本不感知存储介质类型。所有方案都依赖 OS 特定 API,且结果存在不确定性。
工程建议:
- Linux:优先走 sysfs(
/sys/block/*/queue/rotational),比 ioctlBLKGETSIZE64或HDIO_GET_IDENTITY更轻量、更通用 - Windows:避免用
GetDriveType(只分固定/移动/网络,不区分 SSD/HDD),必须走 WMI - 不要缓存判断结果——热插拔 SSD、LVM 重配置、udev 规则变更都可能让设备属性动态变化
- 若只需性能优化(如禁用 fsync、调整 buffer size),可跳过介质判断,直接测随机 4K IOPS 或延迟(
fio --name=randread --ioengine=libaio --rw=randread --bs=4k --runtime=5),更可靠
真正难的不是查 ROTA 或 MediaType,而是处理中间层抽象:LVM、ZFS、btrfs RAID、Windows Storage Spaces、WSL2 虚拟磁盘——它们把物理介质完全隐藏了,此时所谓“SSD 判断”本质上已失去意义。


















