busctl 设置风扇返回方法没有实现

问题描述

dbusctl 设置手动模式风扇转速 30,有一些机器报错,有一些机器是没报错。
一台机器设置如下:

~ ~ $ busctl --user --no-pager introspect bmc.kepler.thermal_mgmt /bmc/kepler/Systems/1/CoolingConfig
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
bmc.kepler.Object.Properties interface - - -
.GetAllWithContext method a{ss}s a{sv} -
.GetOptions method a{ss}ss a{ss} -
.GetPrivateProperties method a{ss} s -
.GetPropertiesByNames method a{ss}sas a{sv}a{sv} -
.GetPropertiesByOptions method a{ss}sa{ss} as -
.GetPropertyDetail method a{ss}ss s -
.GetWithContext method a{ss}ss v -
.SetWithContext method a{ss}ssv - -
.ClassName property s “CoolingConfig” emits-change
.ObjectIdentifier property (ysss) 1 “1” “1” “0101” emits-change
.ObjectName property s “CoolingConfig_1_0101” emits-change
.TraceSamplingRate property d 0 emits-change
bmc.kepler.Systems.CoolingConfig interface - - -
.GetAbnormalPolicyEffectiveStatus method a{ss}s b -
.GetComponentThermalZone method a{ss}s a(yayay) -
.GetCustomTargetTemperatures method a{ss} a(uyyy) -
.SetCtrlMode method a{ss}su - -
.SetManualLevel method a{ss}yy - -
.SetMedium method a{ss}s - -
.SetMinAllowedFanSpeedEnabled method a{ss}b - -
.SetMinPWM method a{ss}sayay - -
.SetSmartCoolingMode method a{ss}s - -
.CtrlMode property s “Auto” emits-change
.LevelPercentRange property ay 2 20 100 const
.ManualLevel property y 10 emits-change
.Medium property s “Air” emits-change
.MinAllowedFanSpeedEnabled property b false -
.MinAllowedFanSpeedPercent property y 255 emits-change writable
.MixedModeSupported property b false -
.SensorLocationSupported property b false const
.SmartCoolingMode property s “EnergySaving” emits-change
.SmartCoolingState property s “Enabled” -
.TimeOut property u 30 -
bmc.kepler.Systems.DiskCoolingConfig interface - - -
.DiskRowTemperatureAvailable property b true emits-change
.FrontHddMaxTemperatureCelsius property d 0 emits-change
.FrontNVMeSSDMaxTemperatureCelsius property d 29 emits-change
.RearHddMaxTemperatureCelsius property d 0 emits-change
.RearNVMeSSDMaxTemperatureCelsius property d 0 emits-change
.SysAllSSDsMaxTemperature property d 36 emits-change
.SysHDDsMaxTemperature property d 0 emits-change
.SysM2sMaxTemperature property d 32768 emits-change
.SysSSDsMaxTemperature property d 36 emits-change
org.freedesktop.DBus.Introspectable interface - - -
.Introspect method - s -
org.freedesktop.DBus.ObjectManager interface - - -
.GetManagedObjects method - a{oa{sa{sv}}} -
org.freedesktop.DBus.Peer interface - - -
.GetMachineId method - s -
.Ping method - - -
org.freedesktop.DBus.Properties interface - - -
.Get method ss v -
.GetAll method s a{sv} -
.Set method ssv - -
.PropertiesChanged signal sa{sv}as - -
~ ~ $ busctl --user --no-pager call bmc.kepler.thermal_mgmt /bmc/kepler/Systems/1/CoolingConfig bmc.kepler.Systems.CoolingConfig SetCtrlMode a{ss}su 0 “Manual” 30
Call failed: {“name”:“BMC.Error.Unknow”,“format”:“./opt/bmc/libmc/lualib/mc/context.lua:203: ./opt/bmc/libmc/lualib/sd_bus/object.lua:317: ./opt/bmc/libmc/lualib/sd_bus/object.lua:307: method SetCtrlMode not implemented”}

另一台机器设置,没有错误返回。

~ ~ $ busctl --user --no-pager call bmc.kepler.thermal_mgmt /bmc/kepler/Systems/1/CoolingConfig bmc.kepler.Systems.CoolingConfig SetCtrlMode a{ss}su 0 “Manual” 30
~ ~ $

环境信息

散热组件都是2512LTS

重现步骤

这个不是很清晰怎么出现条件

期望结果

手动模式风扇设置都可以成功。

实际结果

~ ~ $ busctl --user --no-pager call bmc.kepler.thermal_mgmt /bmc/kepler/Systems/1/CoolingConfig bmc.kepler.Systems.CoolingConfig SetCtrlMode a{ss}su 0 “Manual” 30
Call failed: {“name”:“BMC.Error.Unknow”,“format”:“./opt/bmc/libmc/lualib/mc/context.lua:203: ./opt/bmc/libmc/lualib/sd_bus/object.lua:317: ./opt/bmc/libmc/lualib/sd_bus/object.lua:307: method SetCtrlMode not implemented”}

服务失败的有这些,不知道是否有影响

尝试过的解决方案

升级2512 LTS 到2512LTS SP1

分析结论

有些机器前端设置报错,dbusctl 也是会报错如上。如果机器前端没有报错,dbusctl 接口也可以设置。

答案内容由AI生成,仅供参考:

结论

该问题大概率是 CoolingConfig 对象加载失败D-Bus 接口注册不完整 导致的,与散热组件版本无关。建议优先检查 PSR 启动状态和风扇板配置,并对比正常与故障机器的 systemd 服务状态。论坛中类似的案例(topic 6060)最终通过修复 PSR 加载和调整 FanBoardNum 得以解决,可作参考。

点击此处查看详细分析解答

根据提供的知识库信息,该问题的核心在于 SetCtrlMode 方法在部分机器上报 method not implemented,而另一些机器正常。这可能与 CoolingConfig 对象加载失败D-Bus 接口注册不完整 有关。

可能原因分析

  1. CoolingConfig 对象未被正确加载

    • 在论坛讨论(topic_id 6060)中,有类似案例:设置手动模式失败,最终定位是 CoolingConfig 对象加载失败,根本原因是 PSR(电源与调节模块)未正常启动。
    • CoolingConfig 对象不存在时,D-Bus 接口中的方法(如 SetCtrlMode)可能无法注册,导致调用时报 method not implemented
  2. 多风扇板配置问题

    • 论坛回复提到:“两个风扇板的话,CoolingConfig中的FanBoardNum是否正确配置”。如果机器实际有两个风扇板,但配置文件中 FanBoardNum 未正确设置,可能导致 CoolingConfig 加载异常。
    • 用户环境中的“散热组件都是2512LTS”可能掩盖了硬件差异(单/双风扇板、不同 PSR 版本等),导致部分机器正常、部分异常。
  3. D-Bus 服务注册不完整

    • bmc.kepler.thermal_mgmt 服务通过 bmc.kepler.Systems.CoolingConfig 接口暴露方法。若服务启动时缺少必要的 .service 文件或依赖冲突(如知识库中提到的 bmc.kepler.cooling 因缺少 .service 文件启动失败),则接口可能部分注册。
    • 错误堆栈中的 sd_bus/object.lua:307 表明该 Lua 脚本在尝试查找方法时失败,对应接口可能未被完整添加到对象。
  4. CSR 文件中的 SMC 命令字配置

    • 论坛讨论中,当通过 SMC 命令字能成功设置时,排查方向指向 CSR 文件中的 SMC 命令字配置是否正确。虽然用户提到“直接用配置的 offset 作为参数下发都可以使用”,但 SetCtrlMode 方法内部可能依赖特定的命令字映射,配置错误会导致调用失败。

排查建议

  • 检查 CoolingConfig 对象是否存在
    使用 busctl --user introspect bmc.kepler.thermal_mgmt /bmc/kepler/Systems/1/CoolingConfig 确认该对象是否返回完整接口列表(与正常机器对比)。若对象缺失,则需检查 PSR 模块日志(如 psr.log)或 BMC 启动日志。

  • 确认风扇板数量配置
    查看 CoolingConfig 中的 FanBoardNum 属性(通过 busctl get-propertybmc_cli_get_ls_obj_info 命令)。确认其值与实际硬件一致。若不一致,需修改配置文件并重启相关服务。

  • 检查服务文件完整性
    登录故障机器,确认 /opt/bmc/libmc/lualib/sd_bus/ 下相关脚本是否存在,以及是否所有依赖的 .service 文件(如 bmc.kepler.thermal_mgmt.service)已正确生成并启用。

  • 对比正常机器与故障机器的差异
    收集两台的 busctl tree bmc.kepler.thermal_mgmt 输出、CoolingConfig 的所有属性值,以及 psr 启动日志,定位配置或初始化阶段的不同。

  • 临时绕过方案
    通过命令 busctl call bmc.kepler.thermal_mgmt /bmc/kepler/Systems/1/CoolingConfig bmc.kepler.Systems.CoolingConfig SetManualLevel a{ss}yy 0 <fan_level> 直接设置手动等级(SetManualLevel 方法在接口中列出,应未被报错未实现),绕开 SetCtrlMode 的缺失问题。

结论

该问题大概率是 CoolingConfig 对象加载失败D-Bus 接口注册不完整 导致的,与散热组件版本无关。建议优先检查 PSR 启动状态和风扇板配置,并对比正常与故障机器的 systemd 服务状态。论坛中类似的案例(topic 6060)最终通过修复 PSR 加载和调整 FanBoardNum 得以解决,可作参考。

  1. 提供对应日志;
  2. 从当前提供来看,没有对应的资源协作接口,需确认环境是否正常

请审批一下

我这边无法审批

看着是调速依赖的配置校验失败了,拦截了调速管理启动,不会注册这些资源树方法。
依赖PSR中CoolingConfig对象,风扇id不重复
多风扇板强依赖FanBoardNum属性,及ThermalConfiguration中FanStartSlot属性,配置了Fan对象的板子得都插入
带泵的机型,依赖MaxPumpNum是否配置

1.看app.log日志
如果有basic cooling initializing,但是没有basic cooling starting,那就是上面的原因
看下 FanBoardNum 配置是否正确,以及环境上的配置了Fan对象的板子是否都插了

2.如果涉及泵,看下MaxPumpNum是否配置正确

3.确认csr版本是否正确,主要是PSR

特别关注下thermal_mgmt组件的日志,cooling_fans.lua, cooling_pumps.lua, base.lua的日志打印

既然说部分机器不行,盲猜是配置了Fan对象的板子有的没插

@wwhh

Atlas800IA3_2102315QYP10RC100017_20260602-0729.tar.zip.001.txt (8 MB)

Atlas800IA3_2102315QYP10RC100017_20260602-0729.tar.zip.002.txt (2.8 MB)

可参考上面华坤的兄弟的答复
是否存在配置错误,从日志名称来开,Atlas800IA3应该是涉及液冷泵的

日志中出现 2026-06-02 03:23:33.051851 thermal_mgmt ERROR: object_manage.lua(283): AddObject CoolingFan_2_01010305 failed, life_cycle_id:1, error:./opt/bmc/libmc/lualib/mc/context.lua:203: ./opt/bmc/libmc/lualib/mc/signal.lua:310: ./opt/bmc/libmc/lualib/mc/orm/object.lua:312: primary key conflict: FanId, table: t_cooling_fan 且并未在日志中发现配置CoolingFan的CSR

1 个赞

CoolingFan对象的primaryKey字段选取不合理,建议可以用ObjectName字段做主键

在多风扇板机型中,会出现多块风扇板对象先于PSR分发,风扇id的重组依赖PSR中ThermalConfiguration对象的FanStartSlot属性,AddObject CoolingFan_2_01010305 failed日志表示CoolingFan对象存在相同的主键而冲突

修改方案1:主键从FanId 修改为 CoolingFanObjectName
老机型中已经有t_cooling_fan,修改后主键字段变化,需要确认框架是否支持当前写法。同时会带来兼容性问题,已经做过手动调速持久化的机型,会丢失持久化数据

修改方案2:新增双主键属性 CoolingFanObjectName
会带来兼容性问题。已经做过手动调速持久化的机型,会丢失持久化数据。但是能解决CoolingFan主键冲突问题
cooling_mgmt:init()
cooling_global_init
set_manual_level_start
set_all_cooling_device_manual_level_persist_start
初始化时候会重新对CoolingFan持久化赋值,初步看是没啥问题



这里双主键的话,在FanId重分配之前,从数据库获取数据会有问题吧

确实,FanId无法做主键,必须删除