C++如何判断一个路径是否真正物理位于NVMe固态硬盘介质

轻宇吖_4034

轻宇吖_4034

2026-06-29

891人浏览

原创

linux下判断路径是否位于nvme物理盘上,需先用stat获取主次设备号,再通过/sys/dev/block/maj:min/device/subsystem软链接目标是否含“nvme”确认;windows则须以管理员权限打开物理磁盘句柄并用ioctl_storage_query_property查询bustype是否等于bustypenvme。

c++如何判断一个路径是否真正物理位于nvme固态硬盘介质

Linux下用stat和ioctl查设备类型最可靠

仅靠路径字符串或挂载点名称无法判断是否落在NVMe物理盘上——/dev/nvme0n1p1可能被软链接到/mnt/data,也可能被LVM或mdraid抽象掉。真正有效的方式是获取该路径对应inode的底层块设备节点,再读取其设备属性。

核心步骤:先用stat -c "%t %T" /path拿到主次设备号(major/minor),再用major查/sys/dev/block/<em>MAJ</em>:<em>MIN</em>/device/model或/sys/dev/block/<em>MAJ</em>:<em>MIN</em>/device/subsystem确认是否指向nvme子系统。

  • stat返回的%t %T是十六进制主次设备号,需转十进制后拼成MAJ:MIN格式
  • 若/sys/dev/block/MAJ:MIN/device/subsystem软链接目标含nvme(如../../../../../class/nvme),基本可确认
  • 注意LVM逻辑卷会指向dm子系统,需进一步查/sys/dev/block/MAJ:MIN/dm/uuid反推原始设备

C++里用stat()和readlink()做自动化判断

不能只依赖statfs()或getmntent()——它们只告诉你挂载在哪,不告诉你底层是什么。必须穿透到block device层。

关键代码片段:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
struct stat st;
if (stat("/your/path", &st) == 0 && S_ISBLK(st.st_mode)) {
    int maj = major(st.st_rdev);
    int min = minor(st.st_rdev);
    char path[256];
    snprintf(path, sizeof(path), "/sys/dev/block/%d:%d/device/subsystem", maj, min);
    char target[512];
    ssize_t len = readlink(path, target, sizeof(target)-1);
    if (len > 0) {
        target[len] = '';
        if (strstr(target, "nvme") != nullptr) {
            // 真实NVMe介质
        }
    }
}
  • st.st_rdev才是设备号,st.st_dev是文件系统设备号,别混淆
  • readlink()返回的是相对路径,需检查是否含"nvme"而非硬匹配全路径
  • 某些NVMe驱动(如老内核的nvme-fabrics)可能暴露为rdma子系统,需额外查/sys/dev/block/.../device/transport

Windows下必须用IOCTL_STORAGE_QUERY_PROPERTY

Windows没有统一/sys接口,靠GetDriveType()或GetVolumeInformation()完全没用——它们连SSD/HDD都分不清,更别说NVMe了。

正确做法:打开卷句柄 → 获取物理磁盘号 → 打开物理磁盘句柄 → 发送IOCTL_STORAGE_QUERY_PROPERTY查询StorageAdapterProperty结构体里的BusType字段。

  • 若BusType等于BusTypeNvme(值为19),才是NVMe;BusTypeSata(8)是SATA SSD,不是NVMe
  • 注意:需以管理员权限打开物理磁盘(\.PhysicalDriveX),普通用户权限会失败
  • 从路径转物理盘号要用IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,别直接猜盘符映射

别信hdparm -I或smartctl输出里的“NVMe”字样

这些工具输出容易误导:如果路径挂在ZFS池、Btrfs多设备阵列或Ceph RBD上,smartctl -i /dev/sda显示NVMe,不代表你访问的文件就走NVMe路径——中间可能经过网络、内存或虚拟块层。

  • 真实场景中,/mnt/ceph/data底层可能是NVMe,但I/O路径经过TCP+RDMA+内核模块,延迟和带宽已脱离NVMe特性
  • 数据库或存储引擎(如RocksDB)若开启direct I/O,才真正绕过page cache接触物理设备;否则哪怕在NVMe上,也受VFS缓存影响
  • 容器环境更要小心:docker run -v /host/nvme:/container/path只是bind mount,宿主机路径是否NVMe,容器里stat结果一样,但cgroup blkio限速可能作用在不同层级

物理介质类型只是起点,I/O栈深度、队列深度、是否启用I/O scheduler、甚至PCIe拓扑(比如NVMe盘插在PLX switch下游),都会让“是不是NVMe”这个判断失去单一意义。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

固态硬盘 c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2228

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

999

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

427

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

406

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1389

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1197

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习