尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

NVMe、SATA 还是 USB?hwinfo 用 C++ 识别磁盘接口、序列号与挂载点的详细教程

NVMe、SATA 还是 USB?hwinfo 用 C++ 识别磁盘接口、序列号与挂载点的详细教程 NVMe、SATA 还是 USBhwinfo 用 C 识别磁盘接口、序列号与挂载点的详细教程【免费下载链接】hwinfocross platform C library for hardware information (CPU, RAM, GPU, ...)项目地址: https://gitcode.com/gh_mirrors/hw/hwinfohwinfo是一个跨平台的开源 C 硬件信息库一个函数调用getAllDisks()就能返回系统中每块磁盘的接口类型NVMe / SATA / USB、厂商、型号、序列号、容量和挂载点无需手写 shell 脚本或 WMI 查询Linux、macOS、Windows 三端行为一致。 为什么需要统一的磁盘信息 API不同系统读取磁盘信息的入口完全不同平台传统方式痛点Linux解析/sys/class/block、lsblk路径结构各异USB 速度要向上追溯WindowsWMI /DeviceIoControl接口繁琐需处理句柄与结构体偏移macOSIOKit getfsstatCoreFoundation 类型转换复杂hwinfo 把三套机制封装成同一个 hwinfo::Disk 类——实际源码见 disk.h。你只面向一套 API跨平台移植成本几乎为零。 快速构建 hwinfo前置要求git、CMake、任意 C 编译器gcc / clang / MSVC。git clone https://gitcode.com/gh_mirrors/hw/hwinfo cd hwinfo mkdir build cmake -B build -DCMAKE_BUILD_TYPERelease cmake --build build --config Release 磁盘检测默认开启CMake 选项HWINFO_DISKON无需额外配置。也可以把hwinfo::disk作为独立 CMake target 单独链接只引入需要的组件。构建完成后直接运行示例程序即可看到类似 README 中展示的磁盘报告输出--------------------------------- Disks ----------------------------------- Disk 0: vendor: (Standard disk drives) model: WD_BLACK SN850 Heatsink 1TB serial-number: ***. size: 1000202273280 一次调用拿到哪些磁盘信息核心 API 只有一行#include hwinfo/hwinfo.h std::vectorhwinfo::Disk disks hwinfo::getAllDisks();hwinfo::Disk 提供这些只读访问器方法返回内容典型用途vendor()厂商如 SAMSUNG、KINGSTON资产登记model()型号如WD_BLACK SN850硬件清单serial_number()序列号保修追溯、设备唯一标识size()容量字节存储统计disk_interface()接口枚举判断 NVMe/SATA/USBmount_points()挂载点/分区列表定位磁盘用途id()磁盘编号多盘区分拿不到的字段会返回unknown而不是崩溃行为对新手非常友好。⚙️ 三种系统下的接口识别原理hwinfo 最有意思的地方在于它如何把USB 设备进一步细分成 USB 2.0 / USB3 5Gbit / USB4 80Gbit 等 9 档。Linuxsrc/linux/disk.cpp遍历/sys/class/block自动跳过分区、loop、ram 等虚拟设备通过device符号链接的规范化路径判断总线路径含nvme→ NVMe含usb→ 走 USB 分支含ata→ SATA含scsi→ SCSIUSB 分支会向上逐级查找 USB 控制器的speed文件按实测速率映射控制器速率 (Mbps)识别结果≥ 80000USB4 80Gbit≥ 40000USB4 40Gbit≥ 20000USB3 20Gbit或 USB4 20Gbit≥ 10000USB3 10Gbit≥ 5000USB3 5Gbit480USB 2.0 480USB 1.1Windowssrc/windows/disk.cpp遍历\\.\PhysicalDrive0~15用IOCTL_STORAGE_QUERY_PROPERTY直接读取总线的STORAGE_BUS_TYPE映射为 NVMe / USB / SATA / SCSI厂商字段缺失时还会在型号字符串里匹配 SAMSUNG、KINGSTON、INTEL 等已知品牌做兜底挂载点通过IOCTL_STORAGE_GET_DEVICE_NUMBER把物理盘编号关联回C:\、D:\等盘符macOSsrc/apple/disk.cpp通过 IOKit 匹配IOMedia整盘对象读取 BSD 名如disk3、型号、UUID 和容量再用getfsstat建立BSD 设备 → 挂载点映射把disk3s1s1这类分区归属回整盘disk3️ 实战打印磁盘接口、序列号与挂载点官方示例程序 system_infoMain.cpp 中的磁盘部分仅 10 行见第 117 行起的getAllDisks()循环std::vectorhwinfo::Disk disks hwinfo::getAllDisks(); for (const auto disk : disks) { std::cout Disk disk.id() :\n vendor: disk.vendor() \n model: disk.model() \n serial: disk.serial_number() \n interface: disk.disk_interface() \n size: unit_prefix_to(disk.size(), IECPrefix::GIBI) GiB\n mounts: hwinfo::utils::join(disk.mount_points(), , ) \n; }几个实用技巧接口枚举可直接输出disk_interface()重写了operatorstd::cout直接打印出Disk::Interface::NVME这样的可读字符串容量人类可读化配合 unit.h 的unit_prefix_to把字节转成 GiB判断外置盘interface属于USB*系列时通常就是外接移动硬盘适合做备份盘提醒序列号兜底Windows 下序列号缺失时返回unknown可用于日志中的告警判断️ 常见问题Q为什么我的 USB 3.2 硬盘显示成 USB3_5GBithwinfo 读取的是主机端 USB 控制器的协商速率。如果线或主板端口只支持 5Gbps即使硬盘本身是 USB 3.2 设备识别结果也会是 5Gbit 档——这是真实带宽不是 bug。Qmount_points()在 Linux 上返回的是什么返回的是磁盘下的分区设备名如/dev/sda1即该磁盘包含哪些可挂载单元而非最终挂载路径。Q如何只依赖磁盘模块CMake 中单独链接hwinfo::disk即可配合 CMake 选项HWINFO_DISK控制开关减小静态库体积。✅ 小结hwinfo 用一行getAllDisks()统一了三大平台的磁盘枚举Disk类覆盖厂商、型号、序列号、容量、接口、挂载点六大字段接口识别细化到 USB3 5/10/20Gbit 与 USB4 四档足以支撑存储审计、资产管理和备份提醒等场景从getAllDisks()的第一次调用开始你的跨平台磁盘信息方案就有了起点 【免费下载链接】hwinfocross platform C library for hardware information (CPU, RAM, GPU, ...)项目地址: https://gitcode.com/gh_mirrors/hw/hwinfo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表