基于2512_LTS的openubmc版本
请问NVMe盘的TemperatureCelsius属性是在哪赋值的?
在代码里看到了从SSDChip读数据的地方,但是并没有看到将subsystem_mgmt_data.ctemp赋值给self.TemperatureCelsius的地方:
全局搜索也没找到像是的赋值的地方,请问nvme盘drive对象的self.TemperatureCelsius是在哪赋值的?
基于2512_LTS的openubmc版本
请问NVMe盘的TemperatureCelsius属性是在哪赋值的?
在代码里看到了从SSDChip读数据的地方,但是并没有看到将subsystem_mgmt_data.ctemp赋值给self.TemperatureCelsius的地方:
全局搜索也没找到像是的赋值的地方,请问nvme盘drive对象的self.TemperatureCelsius是在哪赋值的?
答案内容由AI生成,仅供参考:
总结
| 项目 | 内容 |
|---|---|
TemperatureCelsius 赋值位置 |
c_drive:update_dynamic_info() 函数中 |
| 实际数据来源 | obj:update_dynamic_drive_info() 从 SSDChip/NVMe-MI 读取 |
| 赋值前提是 | 系统已上电(power_on == 1) |
| 值为 255 的原因 | power_on == 0 或 SSDChip 读取失败 |
| 依赖模块 | SmBiosStatus、IPMI、CPLD、Chip_Temp、CSR 配置 |
根据您提供的代码片段和上下文信息,关于 NVMe盘的TemperatureCelsius属性 赋值位置的问题,结合知识库中的内容可以给出以下完整分析。
NVMe盘的 TemperatureCelsius 属性是在 c_drive:update_dynamic_info() 方法中被赋值的,具体逻辑是:
obj:update_dynamic_drive_info() 获取来自硬件(如SSDChip)的原始温度数据 info.TemperatureCelsiuspower_on == 1)self.TemperatureCelsius该逻辑位于管理存储设备的动态信息更新流程中,而非直接写在 get_status_flags() 这类功能函数内。
您提到在get_status_flags()中看到读取了SSDChip的数据,但未找到对TemperatureCelsius的赋值。这是因为 TemperatureCelsius 并不是通过这条路径写入的,而是在 另一个通用驱动信息更新函数 中完成的。
c_drive:update_dynamic_info() 是关键方法根据上下文中的文档片段(reference_id: 1),存在如下代码段:
function c_drive:update_dynamic_info(obj)
if not obj then
return
end
local info = obj:update_dynamic_drive_info()
if not info then
return
end
-- 关键判断:只有当系统已上电时,才更新 TemperatureCelsius
if c_storageconfig.get_instance().power_on == 0 then
self.TemperatureCelsius = common_def.INVALID_U8 -- 通常为255
else
self.TemperatureCelsius = info.TemperatureCelsius
end
end
来源:Document Chunk 参考 ID
1与3中的日志分析与代码截图
info.TemperatureCelsius 来自 obj:update_dynamic_drive_info(),即 NVMe 实例(例如 c_nvme)根据协议(如 NVMe-MI)从芯片读取的实际温度。common_def.INVALID_U8 通常是 255,用于表示无效或无法获取的温度。power_on == 1)时,才会将实际温度写入 self.TemperatureCelsius。完整的 TemperatureCelsius 赋值链路如下:
1. Hardware → SSDChip
- 实际温度数据由 NVMe SSD 提供,通过 I²C/SMBus 接口由 Chip_Temp 或 SSDChip 读取。
2. SSDChip → c_nvme:update_dynamic_drive_info()
- 在 NVMe 设备对象(`c_nvme`)中,调用其 `update_dynamic_drive_info()` 方法。
- 该方法使用 `GetSmartInfo` 或 NVMe-MI 协议命令读取 SMART 信息,其中包含当前温度。
3. c_nvme:update_dynamic_drive_info() → 返回 info.TemperatureCelsius
- 解析响应数据后填充 `subsystem_mgmt_data`,最终提取出 `ctemp` 字段作为温度。
4. c_drive:update_dynamic_info() → self.TemperatureCelsius
- 顶层 drive 对象调用 `update_dynamic_info()`,将 `info.TemperatureCelsius` 赋值给自身属性。
- 前提:`c_storageconfig.get_instance().power_on == 1`
5. D-Bus → Web UI / Sensor Display
- 最终该值通过 D-Bus 接口(如 `bmc.dev.NVMe.Cooling.TemperatureCelsius`)暴露给系统监控模块和前端。
从文档 reference_id 1 的分析可知:
只有当
c_storageconfig.get_instance().power_on == 0时,TemperatureCelsius = 255
power_on == 0 的典型原因:BIOS SmBiosStatus 未正确更新
SmBiosStatus == 3 表示系统已启动。power_on 永远不会置为 1。带内通信问题
smbios_write_data 数据偏移错误,导致 BMC 无法接收 OS 启动状态。CPLD 版本过旧
SSDChip 或 Chip_Temp 通信,导致获取不到有效数据。
因此,即使 NVMe 硬盘本身有温度,只要 OS 未“声明”已启动,TemperatureCelsius 就会被强制设为 255(无效值)
| 组件 | 作用 |
|---|---|
bmc.dev.NVMe.Cooling.TemperatureCelsius |
D-Bus 接口中的公开属性,Web UI 显示来源 |
c_nvme |
Lua 类,代表一个 NVMe 设备实例,负责与硬件通信 |
SSDChip / Chip_Temp |
指向 I²C 上用于读取 NVMe 温度的芯片对象 |
GetSmartInfo 方法 |
通过 NVMe-MI 协议获取 SMART 信息(含温度) |
mdb_interface |
定义模型接口,确保 TemperatureCelsius 可被 D-Bus 外部消费 |
若您遇到 “NVMe盘有温度但TemperatureCelsius=255” 的问题,可按以下步骤排查:
SmBiosStatus 是否达到 3busctl get-property bcm.kepler.sm_bios /bmc/kepler/smbios SmBios SmBiosStatus
SSDChip 能正常通信call Chip_SSD_01010C0103 bmc.kepler.Chip.BlockIO Read 0 0x0b 8
Chip_Temp 和偏移地址是否正确| 项目 | 内容 |
|---|---|
TemperatureCelsius 赋值位置 |
c_drive:update_dynamic_info() 函数中 |
| 实际数据来源 | obj:update_dynamic_drive_info() 从 SSDChip/NVMe-MI 读取 |
| 赋值前提是 | 系统已上电(power_on == 1) |
| 值为 255 的原因 | power_on == 0 或 SSDChip 读取失败 |
| 依赖模块 | SmBiosStatus、IPMI、CPLD、Chip_Temp、CSR 配置 |
提示:get_status_flags() 主要用于读取 drive_functional、link_active 等状态位,并不包含温度赋值逻辑。温度更新是一个独立且延后的过程,需结合系统状态综合判断。
如果您希望定位该代码的具体文件路径,建议在项目中搜索:
function c_drive:update_dynamic_info
通常位于 storage 或 drive_manager 模块的 Lua 实现文件中。