如何获取M.2盘的温度

// 此模板仅供参考,如果不适用可以修改

问题描述

想获取M.2盘的温度值,没有温度信息:

但看到只有以下接口,并没有实现方法:

其类似同级的FrontHddMaxTemperatureCelsius,有具体实现方式

该如何获取M.2盘的温度信息?

答案内容由AI生成,仅供参考:
:white_check_mark: 总结:如何获取 M.2 盘温度?

步骤 内容
1. 前提 确认 M.2 盘是 SATA 还是 NVMe 类型,控制器是否被识别
2. 必要条件 启用 iBMA 或支持 NVMe-MI 协议,确保能读取 SMART 信息
3. 配置文件 在 VPD/CSR 中配置 PCIEAddrInfoThresholdSensor
4. 传感器绑定 SysM2sMaxTemperature 与实际传感器读值绑定
5. 日志验证 检查 sync_property_trace.log 是否正常更新温度
6. 测试验证 使用 setprop 模拟温度变化,验证风扇响应
点击此处查看详细分析解答

如何获取 M.2 盘的温度信息

根据您提供的上下文和系统描述,以下是关于如何获取 M.2 SSD 温度信息的全面分析与解决方案。


:magnifying_glass_tilted_left: 问题核心

您希望获取 M.2 接口固态硬盘的实际温度信息,但在 BMC 界面或接口中发现以下情况:

  • 仅存在 SysM2sMaxTemperature 等只读参数,其默认值为 32768(这是一个典型的无效或异常标志值);
  • 没有直接的实时温度读取接口(如 TemperatureCelsius)暴露给 M.2 盘;
  • 其他类型磁盘(如前置 HDD、NVMe)有明确配置项(如 FrontHddMaxTemperatureCelsius),但 M.2 缺失对应实现。

:books: 已知信息梳理

:white_check_mark: 相关实体与属性(来自知识图谱)

实体 描述
SysM2sMaxTemperature 表示系统中 M.2 驱动器的最高温度记录,单位:摄氏度;
• 类型:只读 Double
• 当前值为 32768°C — 这是典型的无效值或数据未更新标志,表明未正常采集温度。
• 属于 bmc.kepler.Systems.DiskCoolingConfig 配置类别。
CoolingConfig 系统级冷却配置对象,用于管理风扇策略、温度阈值等;
• 是 M.2 温度监控配置的承载容器,理论上应包含 M.2 温度采集逻辑。
TemperatureCelsius 通用字段,用于表示各类硬件组件的实时温度(单位:°C);
• 支持 SSD、NVMe、HDD、电源、BMC 芯片等;
• 可通过传感器或 D-Bus 接口访问。
Solid State Drive Temperature Sensor 每个 SSD 插槽可配备独立温度传感器,命名形式为 SSD Disk${Slot} Temp

:warning: 当前状态分析

1. SysM2sMaxTemperature = 32768 的意义

  • 32768 是系统中常见的“未初始化”或“数据失败”标志值(例如 S16 整数溢出、传感器读取失败);
  • 表示 M.2 SSD 的温度数据未能被正确采集或上报
  • 可能原因包括:
    • BMC 未适配该 M.2 转接板或硬盘型号;
    • 缺少 VPD(Virtual Product Data)文件定义;
    • iBMA 未启用或未上报温度信息;
    • 存储管理模块(storage)代码中缺少对 M.2 SATA/SAS 盘的温度轮询逻辑。

:pushpin: 参考文档 [6] 提到:“若无法获取温度,则可根据调速策略的异常调速进行调速”,说明 温度获取依赖于适配层配置


2. M.2 盘温度获取路径对比

磁盘类型 温度获取方式 是否支持 TemperatureCelsius
SAS/SATA SSD (标准背板) 通过 RAID 卡或 iBMA 上报 :white_check_mark: 支持
NVMe SSD 通过 NVMe-MI 协议或 PCIe 枚举 :white_check_mark: 支持(TemperatureCelsius 字段)
M.2 SATA SSD 依赖 iBMA + VPD 配置 或 M.2 转接卡适配 :cross_mark: 当前未生效

:magnifying_glass_tilted_right: 特别指出:在知识库文档 [5][10] 中提到,M.2 NVMe/SATA 盘若没有适配 iBMA 或 VPD 文件,BMC 无法主动获取其 SMART/温度信息


:white_check_mark: 解决方案建议

:white_check_mark: 方案一:确认并启用 iBMA 支持(前提条件)

M.2 SATA SSD 的 SMART 信息(含温度)通常由 iBMA(Intelligent Bare Metal Agent) 代理采集后上报给 BMC。

操作步骤:

  1. 确认 iBMA 是否已在系统内运行

    ps | grep iBMA
    

    若无进程运行,则需加载相关固件或驱动。

  2. 检查是否已为 M.2 转接卡配置正确的 PCIEAddrInfo

    • 在 VPD 或 CSR 文件中添加如下结构(示例):
      {
        "ClassName": "PCIEAddrInfo_SAS",
        "ObjectIdentifier": [1, "1", "1", "010102"],
        "ObjectName": "PcieAddrInfo_M2_SSD",
        "Bus": 0x03,
        "Device": 0x00,
        "Function": 0x0,
        "VendorId": "0x1B21",  // 例如 ASMedia 控制器 ID
        "DeviceId": "0x2431"
      }
      
    • 确保 BMC 可通过 BDF 匹配到该设备。
  3. 验证 storage 组件是否已订阅温度信息

    • 查看日志 /var/log/storage.logsync_property_trace.log,检查是否报错:
      attempt to index a nil value
      
      → 如存在,说明轮询函数鲁棒性不足,导致崩溃。

:white_check_mark: 方案二:配置 VPD/CSR 文件以支持温度传感器

即使硬件支持,若未在 BMC 配置文件中声明传感器,也不会创建 TemperatureCelsius 接口。

在 CSR 文件中添加传感器定义:

{
  "ClassName": "ThresholdSensor",
  "ObjectName": "SSD_M2_Temp_Sensor",
  "SensorName": "M.2 SSD Temperature",
  "Reading": "SysM2sMaxTemperature",
  "SensorType": "Temperature",
  "UpperCritical": 80.0,
  "LowerCritical": 0,
  "SamplingPeriod": 5000  // 5秒采样一次
}

定义 SysM2sMaxTemperature 的实际数据源:

  • 需在代码中从 iBMA 或 NVMe-MI 接口读取原始温度,并更新此字段;
  • 示例调用路径:
    storage -> sml -> ctrl_info.lua -> update_retval() -> 设置 temperature
    

:white_check_mark: 方案三:手动触发 setprop 模拟测试(调试用)

可用于验证温度调速逻辑是否生效:

# 设置模拟最大温度(用于测试超温响应)
setprop SysM2sMaxTemperature 75

# 查看是否触发告警或风扇提速
lsprop bmc.kepler.Systems.DiskCoolingConfig | grep SysM2sMaxTemperature

:warning: 注意:真实温度仍需硬件支持上报,此方法仅作功能验证。


:hammer_and_wrench: 其他排查建议

  1. 查看资源树中是否有 TemperatureCelsius 字段

    rstcli -t /bmc/kepler/Systems/1/Storage/1/Drive/...
    

    检查是否存在 TemperatureCelsius 字段且值为 2550xFF —— 若是,则表示传感器读取失败(参考文档 [1])。

  2. 添加日志打印定位问题点

    • drive_object.luaupdate_raid_pd_info() 函数中加日志:
      print("Updating PD info, temp:", pd_info.temperature)
      
    • 观察是否接收到有效温度数据。
  3. 参考适配指南

    • [硬盘背板开发指南] 明确指出:SAS/SATA 盘温度依赖 iBMA 上报
    • [GPU 卡适配流程] 模式可类比 —— 所有外设均需 CSR + 数据通道配置。

:white_check_mark: 总结:如何获取 M.2 盘温度?

步骤 内容
1. 前提 确认 M.2 盘是 SATA 还是 NVMe 类型,控制器是否被识别
2. 必要条件 启用 iBMA 或支持 NVMe-MI 协议,确保能读取 SMART 信息
3. 配置文件 在 VPD/CSR 中配置 PCIEAddrInfoThresholdSensor
4. 传感器绑定 SysM2sMaxTemperature 与实际传感器读值绑定
5. 日志验证 检查 sync_property_trace.log 是否正常更新温度
6. 测试验证 使用 setprop 模拟温度变化,验证风扇响应

:paperclip: 相关参考链接


如果您当前使用的是 华为 BC83MSMA M.2 转接板 + 紫光 SATA SSD,建议:

:light_bulb: 联系供应商提供完整的 VPD 配置文件,并确保 iBMA 已部署且正常运行。

完成上述步骤后,SysM2sMaxTemperature 将不再是 32768,而是实际的温度值,且可在 WebUI 和 API 中查看。

目前没实现,如果要实现需要先获取M2TransferCard上的硬盘,遍历硬盘的温度取合法温度的最大值