rmcpd

版本信息

项目内容
组件版本1.140.14
首发版本1.140.11
文档作者openUBMC 社区
最后更新2026-09-13

1. 组件概述

1.1 组件简介

rmcpd 是 openUBMC 平台的带外 IPMI 通信管理组件,负责 RMCP/RMCP+(IPMI over LAN)协议收发与会话管理,以及 SOL(Serial Over LAN,串口重定向)会话管理。

1.2 解决什么问题

rmcpd 提供通过带外管理通道的底层协议能力,使管理员能够通过局域网以 IPMI 协议远程访问服务器串口,以实现调试、维护等操作。包含:

  • RMCP(IPMI v1.5):基于 UDP 的远程管理控制协议。
  • RMCP+(IPMI v2.0):增加会话认证(RAKP)、完整性校验与加密(AES-CBC-128)。
  • SOL:IPMI SOL 与本地 CLI SOL(TCP 8210)两种模式的串口控制台会话管理。

1.3 核心功能

  • 核心功能一:带外IPMI通信管理

    支持 RMCP 和 RMCP+ 协议,处理 IPMI 消息传递,实现 IPMI 命令的解析与执行,支持加密算法套件的选择与鉴权过程。

  • 核心功能二:SOL(Serial Over Lan)会话管理

    提供串口重定向功能,允许用户通过网络访问 BMC 管理的串口;支持通过 CLI 或资源协作接口启动和管理 SOL 会话;实现 SOL 流程,包括串口数据的读写和会话的状态管理。

1.4 关键术语表

术语解释
RMCPIPMI v1.5 使用的远程管理控制协议。
RMCP+IPMI v2.0 协议,提供认证、完整性校验和加密。
SOLSerial Over LAN,串口重定向。
Cipher SuiteRMCP+ 使用的认证、完整性和加密算法组合。
payloadIPMI 会话承载的功能数据,例如 SOL 和用户配置。

1.5 外部交互边界图

rmcpd 通过资源协作接口与其他组件协作,对外发布 4 个接口,同时依赖其他组件的资源。

组件仓使用协议类 protocol,该类可以添加子协议,不同的协议通过 pop 方法往子协议抛数据,由 IPMI 协议处理,之后再通过 push 方法向下传递,向客户端响应数据。


2. API 使用说明与示例

对外发布的 API 为资源协作接口,服务名 bmc.kepler.rmcpd,ManagerId 默认为 1,均可通过 busctl/mdbctl 调试。

bash
# 查看资源协作接口
busctl --user tree bmc.kepler.rmcpd

2.1 bmc.kepler.Managers.Rmcp.SessionService

功能说明

配置 RMCP 最大并发会话数。

路径/bmc/kepler/Managers/${ManagerId}/Rmcp

参数说明

属性类型读写默认值范围说明
MaxConcurrentSessionsy可读写155~15RMCP 最大并发会话数

返回值与异常

设置越界时抛 PropertyValueOutOfRange

应用场景

用于限制同时建立的 RMCP/RMCP+ 会话数量。

限制条件

取值必须在 5~15 范围内,写入后立即影响新会话。

调试示例

bash
busctl --user get-property bmc.kepler.rmcpd /bmc/kepler/Managers/1/Rmcp \
    bmc.kepler.Managers.Rmcp.SessionService MaxConcurrentSessions   # 响应 y 5

busctl --user set-property bmc.kepler.rmcpd /bmc/kepler/Managers/1/Rmcp \
    bmc.kepler.Managers.Rmcp.SessionService MaxConcurrentSessions y 10

2.2 bmc.kepler.Managers.SOL

功能说明

SOL 全局配置(使能/模式/串口/超时/payload 端口)与会话初始化。

路径/bmc/kepler/Managers/${ManagerId}/SOL

参数说明

属性类型读写说明
Enabledb只读SOL 是否使能
Modey只读会话模式(0=共享,1=独占)
SerialDirecty只读串口直连标识
Timeoutq只读会话超时(分钟)
PayloadPortq可读写SOL payload 端口
方法入参出参说明
InitSessiona{ss}y(上下文 + 模式)y初始化 SOL 会话
SetTimeouta{ss}q(上下文 + 超时分钟)y设置会话超时时间

入参 a{ss} 为上下文,含 InterfaceUserNameClientAddr 三个键值对。

返回值与异常

InitSession 返回码:0 成功;1 模式越界;2 IPMI_SOL 已激活,被 IPMI_SOL 占用;3 独占模式;4 模式不匹配;5 会话数满;6 SOL 被禁用;7 共享模式系统 ID 冲突。

SetTimeout 返回码:0 成功;1 超时时间越界(0~480 分钟)。

应用场景

用于配置 SOL 全局使能、模式、串口、超时和 payload 端口。

限制条件

部分属性只读;写入需要对应模型权限,并使当前配置满足 SOL 状态约束。

调试示例

bash
busctl --user get-property bmc.kepler.rmcpd /bmc/kepler/Managers/1/SOL \
    bmc.kepler.Managers.SOL Enabled

busctl --user call bmc.kepler.rmcpd /bmc/kepler/Managers/1/SOL \
    bmc.kepler.Managers.SOL InitSession a{ss}y \
    3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 0   # 返回 y 0

2.3 bmc.kepler.Managers.SOL.Session

功能说明

单个 SOL 会话状态信息与会话去激活。

路径/bmc/kepler/Managers/${ManagerId}/SOL/Session/${Id}

参数说明

属性类型读写描述
Activatedb只读会话的激活状态
Types只读SOL会话类型("CLI" 或 "IPMI")
ClientAddresss只读客户端会话地址,IP:端口
ActivatedTimes只读登录时间
UserNames只读登录用户名
方法入参出参说明
Deactivatea{ss}y去激活会话

返回值与异常

Deactivate 返回码:0 成功;1 会话 ID 越界(非 1~2);2 被 IPMI_SOL 占用;3 会话已关闭。

应用场景

用于初始化、监控和维护单个 SOL 会话。

限制条件

会话模式必须合法,且不能超过最大会话数;SOL 被禁用或串口被占用时初始化失败。

调试示例

bash
busctl --user get-property bmc.kepler.rmcpd /bmc/kepler/Managers/1/SOL/Session/1 \
    bmc.kepler.Managers.SOL.Session Activated

busctl --user call bmc.kepler.rmcpd /bmc/kepler/Managers/1/SOL/Session/1 \
    bmc.kepler.Managers.SOL.Session Deactivate a{ss} \
    3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1

2.4 bmc.kepler.Managers.RMCPCipherSuites

功能说明

RMCP+ 算法套件使能配置及套件算法查询。

路径/bmc/kepler/Managers/${ManagerId}/RMCPCipherSuites/${Id}

参数说明

属性类型读写说明
SuitIdy只读套件 ID,取值 {1,2,3,17}
Enabledb可读写是否使能
AuthenticationAlgorithms只读None/RAKP-HMAC-SHA1/RAKP-HMAC-SHA256
IntegrityAlgorithms只读None/HMAC-SHA1-96/HMAC-SHA256-128
ConfidentialityAlgorithms只读None/AES-CBC-128

返回值与异常

尝试禁用所有套件时抛 AllCipherSuitesDisabled

应用场景

用于查询或调整 RMCP+ Cipher Suite 的使能状态。

限制条件

不能禁用全部套件;启用或禁用不安全套件会触发安全告警。

调试示例

bash
busctl --user get-property bmc.kepler.rmcpd /bmc/kepler/Managers/1/RMCPCipherSuites/17 \
    bmc.kepler.Managers.RMCPCipherSuites Enabled

busctl --user set-property bmc.kepler.rmcpd /bmc/kepler/Managers/1/RMCPCipherSuites/1 \
    bmc.kepler.Managers.RMCPCipherSuites Enabled b false

2.5 IPMI 命令

功能说明

rmcpd 还通过 RMCP/RMCP+ 会话提供 IPMI 命令处理(定义见 mds/ipmi.json),主要类别:

  • 会话类:GetSessionChallenge、ActivateSession、SetSessionPrivilegeLevel、CloseSession、GetSessionInfo。
  • 通道类:Set/GetChannelAccess、GetChannelInfo、SetChannelSecurityKeys、GetChannelAuthCapabilities。
  • 算法套件类:GetChannelCipherSuites、Set/GetCipherSupport、Set/GetCiphers、Set/GetCipherSuitePriv。
  • SOL 负载类:ActivatePayload、DeactivatePayload、Set/GetSOLConfigurationParameters、GetPayloadActivationStatus、GetPayloadInstanceInfo、SuspendResumePayloadEncryption、GetSOLDestNumber/Name。

参数说明

命令、请求字段和权限来自 mds/ipmi.json,并按 IPMI 标准 NetFn/Cmd 编码传递。

返回值与异常

成功返回标准 IPMI 完成码 0x00;参数、权限和状态错误返回 5.2 节列出的完成码。

应用场景

用于远端客户端建立 IPMI 会话、管理通道和 Cipher Suite,以及控制 SOL/user payload。

限制条件

必须先建立合法 RMCP/RMCP+ 会话;系统 LockDown 时配置写命令被禁止。

调试示例

使用 ipmitool 或产品 IPMI 工具在隔离环境验证,禁止在生产设备执行未确认的配置命令。

会话类与 payload 激活/去激活命令的协议处理已下沉到 C 库(ipmi_rmcp_lib),Lua 侧仅保留权限校验与定制入口。


3. 组件扩展案例

3.1 扩展能力概述

项目采用了模块化的实现,支持插件机制、配置文件定制和代码级二次开发。

3.2 扩展点说明

  • IPMI 命令扩展src/lualib/commands/ 下新增命令模块
  • 定制化配置customize_config.luaBMCSet_RMCPCipherSuites_<id>BMCSet_RmcpMaxConcurrentSessions
  • 配置导入/导出回调mc.mdb.micro_component.config_manage 的 on_import/on_export
  • C 库扩展src/luaclib/ipmi_rmcp_libc_ipmi_lib 模块)

3.3 二次开发指导

3.3.1 新增 IPMI 命令

src/lualib/commands/ 新增一个 my_cmd 模块,并在 commands/init.lua 添加:

lua
-- src/lualib/commands/my_cmd.lua
local cmds = {}
function cmds.MyCustomCmd(req, ctx)
    -- 业务逻辑
    return ipmi_msg.MyCustomCmd.rsp.new()
end
return cmds
lua
-- commands/init.lua
local cmds_modules = {'ipmi_channel_info', 'lan_config', 'self_config', 'sol', 'user', 'my_cmd'}

验证方法:在 mds/ipmi.json 补充命令定义 → 重新生成代码(bingo gen)→ 通过 ipmitool 下发验证。

注意事项:函数名必须与 ipmi.jsoncmds 键名一致;已下沉到 C 库的命令在 Lua 侧仅做权限校验。

3.3.2 配置导入/导出回调

lua
mdb_config_manage.on_import(function(ctx, config_data, import_type)
    cfg_mgmt.import(ctx, self.suite_objs, config_data, import_type)
end)
mdb_config_manage.on_export(function(ctx, import_type)
    return cfg_mgmt.export(ctx, self.suite_objs, import_type)
end)

4. 日志说明

  • 组件使用 openUBMC 日志框架 mc.logging,模块名 MODULE_NAME = "rmcpd",日志路径 /var/log/app.log,级别含 debug/info/notice/warn/error 及审计日志 log:operation

4.1 一键日志收集

通过 dump.lua 注册 mc.mdb.micro_component.debug.on_dump 回调。执行一键收集时生成 rmcpd_dumpinfo 文件,内容为以下对象属性快照:

收集项属性
SOLId、AuthenWay、EncryWay、PrivilegeLevel、SendThreshold、SendInterval、RetryCount、RetryInterval、SetProgress、IPMISOLEnabled
UserPayloadId、StandardPayloadSupport、StandardPayloadEnable
ChannelConfigId、PrivilegeLimit、AccessSet、PEFEnable、AuthMethod、UserAuthEnable、AccessMode、PrivilegeSet、StandardPayloadSupport、SessionPayloadSupport、OEMPayloadSupport、KGValue

4.2 关键日志信息

级别典型日志含义
errorregister protocol(RMCP) failedRMCP 协议注册失败
errorrestart rmcp socket failedRMCP socket 重建失败
noticerestart rmcp socket successRMCP socket 重建成功
errorOut of sequence SOL packet - packet is droppedSOL 报文乱序丢弃
operationConnect SOL successfully / Disconnect SOL successfullySOL 会话建立/断开
operationEnable/Disable RMCP Cipher Suite(ID %d) successfully套件使能/禁用

5. 问题定界指南

5.1 典型问题定界

现象是否属于 rmcpd判断要点
ipmitool 无法建立 RMCP/RMCP+ 会话可能端口 623/664 监听、register protocol 日志、账户锁定
SOL 会话无法建立可能InitSession 返回码、串口资源就绪
配置类命令返回错误可能系统是否 LockDown
IPMI 返回 0xCC/0xC7/0xC9 等见 5.2 错误码表
串口无输出可能串口设备权限、UartPort 资源

5.2 最小化复现与证据收集

  1. 记录目标协议、端口、账号权限、系统 LockDown 状态和 IPMI 完成码。
  2. 抓取 UDP 623/664 会话握手,保留 RMCP/RMCP+ 日志。
  3. SOL 问题记录 InitSession 返回码、串口资源和 payload 占用状态。
  4. 执行一键日志收集并检查 rmcpd_dumpinfo

5.3 错误码速查表

IPMI 完成码(定义见 mds/errors.json):

完成码含义
0x00成功
0x80参数不支持
0x82只读参数
0xC1非法命令
0xC7请求数据长度非法
0xC9参数越界
0xCC字段非法

SOL 方法返回码:见 2.22.3

5.4 调试/复现方法

bash
busctl --user tree bmc.kepler.rmcpd   # 查看组件资源协作接口
busctl --user introspect bmc.kepler.rmcpd /bmc/kepler/Managers/1/SOL/Session/1
  • 执行一键日志收集,检查 rmcpd_dumpinfo 快照。
  • 客户端抓取 UDP 623/664 报文,确认 RMCP/RMCP+ 握手。

6. 常见问题解答

Q1:ipmitool 无法建立 RMCP/RMCP+ 会话?

  • 问题描述:客户端无法建立 IPMI over LAN 会话。
  • 一句话答案:检查 623/664 监听、协议注册和账号锁定状态。
  • 根因说明:协议注册失败、端口未监听或账号被锁定都会阻止会话建立。
  • 解决方案:查看 register protocol(RMCP) failed 日志,检查端口和账号状态,必要时抓包分析握手。
  • 规避方案:变更网络或账号配置前保留原配置和会话验证结果。
  • 适用版本:1.140.13。

Q2:SOL 会话建立失败,InitSession 返回非 0?

  • 问题描述:SOL 会话初始化失败。
  • 一句话答案:按返回码检查模式、占用、会话数和使能状态。
  • 根因说明:返回码 1/2/5/6 分别对应模式越界、被 IPMI SOL 占用、会话数满和 SOL 禁用。
  • 解决方案:断开冲突会话或清理空闲会话,确认 mode 参数与 Enabled 属性。
  • 规避方案:建立会话前检查当前 SOL 会话和配置状态。
  • 适用版本:1.140.13。

Q3:禁用算法套件报错或告警?

  • 问题描述:修改 Cipher Suite 使能状态失败或触发安全告警。
  • 一句话答案:不能禁用全部套件,不安全套件变化会产生告警。
  • 根因说明:组件要求至少保留一个可用套件,并审计安全性变化。
  • 解决方案:保留至少一个套件;安全加固时仅保留推荐套件。
  • 规避方案:变更前记录套件状态,在维护窗口逐项调整并复核客户端兼容性。
  • 适用版本:1.140.13。

Q4:配置类命令返回错误?

  • 问题描述:SetChannelAccess 等配置命令失败。
  • 一句话答案:检查系统 LockDown 状态、权限和参数范围。
  • 根因说明:锁定状态下写命令被禁止,权限或参数不满足模型约束时也会失败。
  • 解决方案:解除锁定后重试,并按 mds/ipmi.json 核对权限和参数。
  • 规避方案:批量配置前先做只读查询,并在隔离环境验证命令。
  • 适用版本:1.140.13。

Q5:串口无输出或 SOL 连接串口失败?

  • 问题描述:SOL 会话建立后没有数据,或连接串口失败。
  • 一句话答案:检查串口设备权限与 SerialManagement/UartPort 资源。
  • 根因说明:设备节点权限、串口资源或初始化流程异常会阻止数据转发。
  • 解决方案:确认 chmod/chown 已执行,检查 UartPort 对象,并检索 Init uart failed 日志。
  • 规避方案:不要在生产环境直接修改设备节点权限,应在产品配置中固化。
  • 适用版本:1.140.13。