// 此模板仅供参考,如果不适用可以修改
问题描述
想获取M.2盘的温度值,没有温度信息:
但看到只有以下接口,并没有实现方法:
其类似同级的FrontHddMaxTemperatureCelsius,有具体实现方式
该如何获取M.2盘的温度信息?
// 此模板仅供参考,如果不适用可以修改
想获取M.2盘的温度值,没有温度信息:
但看到只有以下接口,并没有实现方法:
其类似同级的FrontHddMaxTemperatureCelsius,有具体实现方式
该如何获取M.2盘的温度信息?
答案内容由AI生成,仅供参考:
总结:如何获取 M.2 盘温度?
| 步骤 | 内容 |
|---|---|
| 1. 前提 | 确认 M.2 盘是 SATA 还是 NVMe 类型,控制器是否被识别 |
| 2. 必要条件 | 启用 iBMA 或支持 NVMe-MI 协议,确保能读取 SMART 信息 |
| 3. 配置文件 | 在 VPD/CSR 中配置 PCIEAddrInfo 和 ThresholdSensor |
| 4. 传感器绑定 | 将 SysM2sMaxTemperature 与实际传感器读值绑定 |
| 5. 日志验证 | 检查 sync_property_trace.log 是否正常更新温度 |
| 6. 测试验证 | 使用 setprop 模拟温度变化,验证风扇响应 |
根据您提供的上下文和系统描述,以下是关于如何获取 M.2 SSD 温度信息的全面分析与解决方案。
您希望获取 M.2 接口固态硬盘的实际温度信息,但在 BMC 界面或接口中发现以下情况:
SysM2sMaxTemperature 等只读参数,其默认值为 32768(这是一个典型的无效或异常标志值);TemperatureCelsius)暴露给 M.2 盘;FrontHddMaxTemperatureCelsius),但 M.2 缺失对应实现。| 实体 | 描述 |
|---|---|
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。 |
SysM2sMaxTemperature = 32768 的意义storage)代码中缺少对 M.2 SATA/SAS 盘的温度轮询逻辑。
参考文档 [6] 提到:“若无法获取温度,则可根据调速策略的异常调速进行调速”,说明 温度获取依赖于适配层配置。
| 磁盘类型 | 温度获取方式 | 是否支持 TemperatureCelsius |
|---|---|---|
| SAS/SATA SSD (标准背板) | 通过 RAID 卡或 iBMA 上报 | |
| NVMe SSD | 通过 NVMe-MI 协议或 PCIe 枚举 | TemperatureCelsius 字段) |
| M.2 SATA SSD | 依赖 iBMA + VPD 配置 或 M.2 转接卡适配 |
特别指出:在知识库文档
[5]和[10]中提到,M.2 NVMe/SATA 盘若没有适配 iBMA 或 VPD 文件,BMC 无法主动获取其 SMART/温度信息。
M.2 SATA SSD 的 SMART 信息(含温度)通常由 iBMA(Intelligent Bare Metal Agent) 代理采集后上报给 BMC。
确认 iBMA 是否已在系统内运行
ps | grep iBMA
若无进程运行,则需加载相关固件或驱动。
检查是否已为 M.2 转接卡配置正确的 PCIEAddrInfo
{
"ClassName": "PCIEAddrInfo_SAS",
"ObjectIdentifier": [1, "1", "1", "010102"],
"ObjectName": "PcieAddrInfo_M2_SSD",
"Bus": 0x03,
"Device": 0x00,
"Function": 0x0,
"VendorId": "0x1B21", // 例如 ASMedia 控制器 ID
"DeviceId": "0x2431"
}
验证 storage 组件是否已订阅温度信息
/var/log/storage.log 或 sync_property_trace.log,检查是否报错:attempt to index a nil value
→ 如存在,说明轮询函数鲁棒性不足,导致崩溃。即使硬件支持,若未在 BMC 配置文件中声明传感器,也不会创建 TemperatureCelsius 接口。
{
"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 的实际数据源:storage -> sml -> ctrl_info.lua -> update_retval() -> 设置 temperature
可用于验证温度调速逻辑是否生效:
# 设置模拟最大温度(用于测试超温响应)
setprop SysM2sMaxTemperature 75
# 查看是否触发告警或风扇提速
lsprop bmc.kepler.Systems.DiskCoolingConfig | grep SysM2sMaxTemperature
注意:真实温度仍需硬件支持上报,此方法仅作功能验证。
查看资源树中是否有 TemperatureCelsius 字段
rstcli -t /bmc/kepler/Systems/1/Storage/1/Drive/...
检查是否存在 TemperatureCelsius 字段且值为 255 或 0xFF —— 若是,则表示传感器读取失败(参考文档 [1])。
添加日志打印定位问题点
drive_object.lua 的 update_raid_pd_info() 函数中加日志:print("Updating PD info, temp:", pd_info.temperature)
参考适配指南
| 步骤 | 内容 |
|---|---|
| 1. 前提 | 确认 M.2 盘是 SATA 还是 NVMe 类型,控制器是否被识别 |
| 2. 必要条件 | 启用 iBMA 或支持 NVMe-MI 协议,确保能读取 SMART 信息 |
| 3. 配置文件 | 在 VPD/CSR 中配置 PCIEAddrInfo 和 ThresholdSensor |
| 4. 传感器绑定 | 将 SysM2sMaxTemperature 与实际传感器读值绑定 |
| 5. 日志验证 | 检查 sync_property_trace.log 是否正常更新温度 |
| 6. 测试验证 | 使用 setprop 模拟温度变化,验证风扇响应 |
lua: attempt to index a nil value如果您当前使用的是 华为 BC83MSMA M.2 转接板 + 紫光 SATA SSD,建议:
联系供应商提供完整的 VPD 配置文件,并确保
iBMA已部署且正常运行。
完成上述步骤后,SysM2sMaxTemperature 将不再是 32768,而是实际的温度值,且可在 WebUI 和 API 中查看。
目前没实现,如果要实现需要先获取M2TransferCard上的硬盘,遍历硬盘的温度取合法温度的最大值