ipmi_core
版本信息
| 项目 | 内容 |
|---|---|
| 组件版本 | 1.100.45 |
| 文档作者 | mkdlf |
| 最后更新 | 2026-04-30 |
1. 组件概述
1.1 组件简介
ipmi_core 组件是遵循IPMI 2.0协议,实现基于IPMI规范的各种通道的通信协议管理、以及各个BMC组件的IPMI命令路由以及转发功能。
IPMI是智能型平台管理接口(Intelligent Platform Management Interface)的缩写,原本是一种Intel架构的企业系统的周边设备所采用的一种工业标准。IPMI亦是一个开放的免费标准,用户无需支付额外的费用即可使用此标准。
1.2 解决什么问题
IPMI 能够横跨不同的操作系统、固件和硬件平台,可以智能的监视、控制和自动回报大量服务器的运作状况,以降低服务器系统成本。IPMI依附于BMC,不依赖于服务器的处理器、BIOS或操作系统来工作,非常地独立,是一个单独在系统内运行的无代理管理子系统,只要有BMC与IPMI固件其便可开始工作。IPMI良好的自治特性便克服了以往基于操作系统的管理方式所受的限制,例如操作系统不响应或未加载的情况下其仍然可以进行开关机、信息提取等操作。
在工作时,所有的IPMI功能都是向BMC发送命令来完成的,命令使用IPMI规范中规定的指令,BMC接收并在系统事件日志中记录事件消息,维护描述系统中传感器情况的传感器数据记录。
常用的ipmicmd和ipmitool工具对比:
- 命令格式:
ipmicmd -k "0f 00 MM NN" smi 0等价于ipmitool raw 0xMM 0xNN; - ipmicmd和ipmitool是两个不同的工具,都可以发送原始命令数据;
- ipmicmd命令返回的数据长度最大为36字节,如果返回的数据长度超过36个字节,建议使用ipmitool命令;
- ipmicmd里面的数字只能十六进制,不用加前缀“0x”,ipmitool raw后面的十六进制数字必须加前缀“0x”。
1.3 核心功能
- 黑白名单:限制不需要转发的IPMI命令
开启功能后限制哪些命令不需要转发,核心是4条IPMI命令和2棵AVL树。规则如下:
- 黑名单最多支持255条IPMI命令,白名单最多支持255条IPMI命令,存入数据库时黑白名单上限阈值为512;
- 向黑名单中添加/删除IPMI命令的IPMI命令不能添加到黑名单中;
- 所有和黑白名单功能相关的IPMI命令,不能通过BT通道执行,只能通过网络通道执行;
- 白名单只能限制BT通道发送的IPMI命令,不能限制网络通道发送的IPMI命令;
- 黑名单既能限制BT通道发送的IPMI命令,也能限制网络通道发送的IPMI命令;
- 黑白名单要掉电持久化;
- 两个名单相互独立,只能开启一种;
- 往名单里添加已存在的命令时,操作日志会记录“已存在该命令”和“添加成功”2条日志;
- 防火墙功能开启需要清空名单时,要同时清空黑白名单;
- 非装备模式下才判断黑白名单。
CSR配置举例:
"RestrictedIPMICmdList_SetSerialConnectionCommand": {
"ReadWrite": "0x01",
"NetFunction": "0x30",
"Command": "0x91",
"ChanProtocol": "0xff", // 受限通道,0xff表示所有通道,0x08表示带内(bt)通道,0x01表示带外通道
"Data": ["0xdb", "0x07", "0x00", "0x17", "0xff", "0x07"], // ipmi命令data部分,0xff表示全匹配
"ShiedFlag": 0 // 表示是否支持命令,0表示默认不支持命令,1表示默认支持命令
}IPMI桥接转发:可以简单理解为涉及两种通道的交互方式,如OS通过ipmi_core获取IMU的信息。实现方式有两种,一种是ipmitool的标准命令,另一种是BMC自定义
南向追踪:通过南向追踪命令追踪南向通道上的具体数据交互
看门狗:与BIOS/OS强相关的功能,用于在CPU启动失败或故障时恢复系统
IPMI系统锁定:配置锁定功能可以帮助用户避免意外或者恶意修改系统配置
带内通道权限控制:通过控制带内通道的权限,防止带内攻击者基于各通道对BMC做操作
1.4 关键术语表
| 术语 | 解释 |
|---|---|
| ME | 管理引擎(Management Engine),提供CPU、内存、温度等硬件监控能力,通过IPMI接口与BMC交互 |
| SMM | 机框管理模块(Shelf Management Module),负责机框内所有刀片、风扇、电源的集中监控与管理 |
| LUN | 逻辑单元号(Logical Unit Number),是SCSI协议中标识存储单元的编号,用于区分同一SCSI目标(Target)下的多个存储逻辑单元 |
| IPMB | 智能平台管理总线(Intelligent Platform Management Bus),是IPMI协议的底层通信总线,基于I2C协议扩展,用于在机箱内不同板卡(如BMC、CPU、电源模块)之间传输管理信息 |
| ICMB | 智能机框管理总线(Intelligent Chassis Management Bus),用于服务器机框内各模块间标准化通信,是IPMI的扩展协议 |
2. API 使用说明与示例
2.1 Request
功能说明
用于处理APP向底层通道的IPMI请求,并返回响应。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.IpmiCore |
| 首发版本 | bmcsdk 25.03 |
| 废弃状态 | 正常可用 |
参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| ChanType | 输入 | U8 | IPMI消息的请求通道类型 | 1:IMU/ME 2:CT_SMM 3:CT_BMC |
| Instance | 输入 | U8 | IPMI消息的请求通道实例 | U8 |
| NetFn | 输入 | U8 | IPMI消息的网络码 | U8 |
| Lun | 输入 | U8 | IPMI消息的Lun号 | U8 |
| Cmd | 输入 | U8 | IPMI消息的命令字 | U8 |
| Payload | 输入 | U8[] | IPMI消息的请求数据 | 元素类型为U8的数组 |
| CompletionCode | 输出 | U8 | 响应码 | U8 |
| Payload | 输出 | U8[] | IPMI消息的响应数据 | 元素类型为U8的数组 |
返回值与异常
| 返回值 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| 0xC1, 0 | 失败 | 参数非法或内部错误 | 检查输入参数是否合法 |
| 0xC3, 0 | 失败 | 响应超时 | 检查输入参数是否合法 |
应用场景
处理APP向底层通道的IPMI请求,并返回响应
调试示例
命令行调试
busctl --user call bmc.kepler.ipmi_core /bmc/kepler/IpmiCore bmc.kepler.IpmiCore IpmiCore a{ss}yyyyyay 0 1 0 0x30 0 0x91 5 0xdb 0x07 0x00 0x24 0x00
响应:yay 193 02.2 Route
功能说明
处理APP向底层通道的IPMI请求,并返回响应。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.IpmiCore |
| 首发版本 | bmcsdk 25.03 |
| 废弃状态 | 正常可用 |
参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| Req | 输入 | U8[] | 请求数据 | 元素类型为U8的数组 |
| Ctx | 输入 | U8[] | 请求上下文的json字符串,包括通道类型、会话信息、客户端信息 | 元素类型为U8的数组 |
| Rsp | 输出 | U8[] | 响应数据 | 元素类型为U8的数组 |
应用场景
处理APP向底层通道的IPMI请求,并返回响应。
限制条件
无
2.3 SetHostPrivilegeLimited
功能说明
设置host侧发送到BMC的ipmi命令权限限制集合。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.IpmiCore |
| 首发版本 | bmcsdk 25.03 |
| 废弃状态 | 正常可用 |
参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| SystemId | 输入 | String | 设置权限的host标识 | String |
| Privileges | 输入 | String[] | 设置的权限集合,如果是nil或者空表则认为是清空权限集合 | 设置的权限字符串集合 |
| Ret | 输出 | Boolean | 返回值 | true:设置成功 false:设置失败 |
| Reason | 输出 | String | 设置权限失败的原因 | 字符串 |
返回值与异常
| 返回值 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| Ret为true | 设置权限成功,此时Reason为"" | 设置权限成功 | 无 |
| Ret为false | 设置权限失败 | 输入参数不合法 | 可通过Reason查看设置权限失败的原因,从而修改输入参数 |
应用场景
设置host侧发送到BMC的ipmi命令权限限制集合。
调试示例
命令行调试
- 设置的权限列表为空
busctl --user call bmc.kepler.ipmi_core /bmc/kepler/IpmiCore bmc.kepler.IpmiCore SetHostPrivilegeLimited a{ss}sas 0 '1' 0
响应:bs true ""- 设置的权限列表不为空,且权限合法
busctl --user call bmc.kepler.ipmi_core /bmc/kepler/IpmiCore bmc.kepler.IpmiCore SetHostPrivilegeLimited a{ss}sas 0 '1' 1 'BasicSetting'
响应:bs true ""- 设置的权限列表不为空,且权限合法
busctl --user call bmc.kepler.ipmi_core /bmc/kepler/IpmiCore bmc.kepler.IpmiCore SetHostPrivilegeLimited a{ss}sas 0 '1' 1 'xxx'
响应:bs false "xxx is invalid privilege"2.4 SetChannelAccesses
功能说明
根据通道类型设置IPMI通道访问权限。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.IpmiCore |
| 首发版本 | bmcsdk 25.03 |
| 废弃状态 | 正常可用 |
参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| ChannelType | 输入 | String | 通道类型 | “IPMB”、“SMS”、“ICMB” |
| AccessRole | 输入 | String | 访问角色 | “NoAccess”、“User”、“Operator”、“Administrator” |
返回值与异常
| 返回值 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| 抛错“The value %s for the property %s is not in the list of acceptable values.” | 设置失败 | 输入参数不合法 | 根据报错信息修改不合法的参数 |
| 空 | 设置成功 | 输入参数合法 | 无 |
应用场景
根据通道类型设置IPMI通道访问权限。
调试示例
命令行调试
- 输入参数合法,设置成功
busctl --user call bmc.kepler.ipmi_core /bmc/kepler/IpmiCore bmc.kepler.IpmiCore SetChannelAccesses a{ss}ss 0 'IPMB' 'Operator'
响应:- 通道类型不合法,设置失败
busctl --user call bmc.kepler.ipmi_core /bmc/kepler/IpmiCore bmc.kepler.IpmiCore SetChannelAccesses a{ss}ss 0 'IPMBB' 'Operator'
响应:Call failed: {"format":"The value %s for the property %s is not in the list of acceptable values.","registry_prefix":"Base","name":"PropertyValueNotInList","params":["IPMBB","%ChanType"]}2.5 GetIPMIChannel
功能说明
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.IpmiCore |
| 首发版本 | bmcsdk 25.03 |
| 废弃状态 | 正常可用 |
参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| ChannelNumber | 输入 | U8 | 通道编号 | 255:获取所有通道信息 其他:获取某个编号对应的通道信息 |
| Channels | 输出 | Array | 通道信息字典 | 包括: InternalNumber:对内通道编号; ExternalNumber:对外通道编号; ProtocolType:协议类型; MediumType:媒体类型; ChannelType:通道类型; Instance:通道实例 |
返回值与异常
| 返回值 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| InternalNumber、ProtocolType、Instance、ChannelType、MediumType、ExternalNumber均为0 | 未查找到编号为目标值的通道 | 不存在编号为目标值的通道 | 检查入参InternalNumber是否有效 |
| 返回通道信息数组 | 设置成功 | 正常执行完成 | 无 |
应用场景
根据通道编号获取IPMI通道信息。
调试示例
命令行调试
- 获取所有通道信息(假设共有两个通道,编号分别为22和15)
busctl --user call bmc.kepler.ipmi_core /bmc/kepler/IpmiCore bmc.kepler.IpmiCore GetIPMIChannel a{ss}y 0 255
响应:aa{sy} 2 6 "InternalNumber" 22 "ProtocolType" 8 "Instance" 1 "ChannelType" 10 "MediumType" 7 "ExternalNumber" 22 6 "InternalNumber" 15 "ProtocolType" 8 "Instance" 0 "ChannelType" 3 "MediumType" 12 "ExternalNumber" 15- 获取编号为22的通道信息
busctl --user call bmc.kepler.ipmi_core /bmc/kepler/IpmiCore bmc.kepler.IpmiCore GetIPMIChannel a{ss}y 0 22
响应:aa{sy} 1 6 "InternalNumber" 22 "ProtocolType" 8 "Instance" 1 "ChannelType" 10 "MediumType" 7 "ExternalNumber" 22- 获取编号不存在的通道信息
busctl --user call bmc.kepler.ipmi_core /bmc/kepler/IpmiCore bmc.kepler.IpmiCore GetIPMIChannel a{ss}y 0 254
响应:aa{sy} 1 6 "InternalNumber" 0 "ProtocolType" 0 "Instance" 0 "ChannelType" 0 "MediumType" 0 "ExternalNumber" 02.6 Trace
功能说明
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.Debug.IpmiCore.TraceIpmi |
| 首发版本 | bmcsdk 25.03 |
| 废弃状态 | 正常可用 |
参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| EnableTrace | 输入 | Boolean | 南向追踪使能状态 | true或false |
| Channel | 输入 | String | 南向追踪的通道 | "bt"、"ipmb"、"edma"、"ipmbeth" |
| NetFn | 输入 | U8 | 南向追踪的IPMI网络字节功能码 | U8 |
| Cmd | 输入 | U8 | 南向追踪的IPMI命令字 | U8 |
| Filter | 输入 | String | 南向追踪的IPMI过滤字段 | String |
| LogType | 输入 | String | 南向追踪的记录方式 | "file"、"local" |
应用场景
南向追踪接口。
3. 组件扩展案例
3.1 扩展能力概述
不适用
4. 日志说明
4.1 一键日志收集
| 文件路径 | 内容说明 |
|---|---|
| AppDump/ipmi_core/ipmbeth_info.txt | 收集所有IPMI通道信息,包括IPMI通道类型、通道实例、通道协议、通道目的地址、通道源地址、通道媒介类型 |
| AppDump/ipmi_core/route_table.txt | 收集路由表信息 |
4.2 关键日志信息
| 日志片段 | 日志级别 | 含义解读 | 建议处理动作 |
|---|---|---|---|
| Startup status has changed, ==> Starting, uptime:xxxs, cost xxxms | NOTICE | 组件起来 | 无 |
| ipmi load bt driver [bt over localbus] failed, ret %s | ERROR | 加载默认驱动localbus失败 | 检查加载默认驱动localbus失败原因 |
| Cannot find service_name, medtype=xx | ERROR | 加载驱动后,无法找到通道媒介类型xx对应的服务 | 检查是否支持通道媒介类型xx对应的服务 |
5. 问题定界指南
5.1 调试方法
开启调试日志
busctl调试日志见第二章节。
6. 常见问题解答
常见问题解答请查阅《IPMI管理定位问题》。
附录
附录A 参考资料
附录B 修订记录
| 版本 | 日期 | 修订人 | 修订内容 |
|---|---|---|---|
| v1.0 | 2026-04-30 | mkdlf | 补充文档说明 |