IPMI LAN接口常见问题定位方法和工具使用指导

一、IPMI 工具概述

IPMI(Intelligent Platform Management Interface)是用于服务器管理的标准接口。本文介绍IPMITOOL工具使用及其在故障定位中的常用方法。


二、ipmitool 工具详解

1.1 安装

bash
# RHEL/CentOS
yum install ipmitool -y

# Ubuntu/Debian
apt-get install ipmitool -y

# 检查是否安装成功
which ipmitool

2.2 常用命令

bash
# 查看 BMC 版本信息
ipmitool mc info

# 查看 BMC 设备 ID
ipmitool bmc info

# 列出所有传感器
ipmitool sensor list

# 列出所有事件
ipmitool sel list

# 注:命令支持列表可以查看IPMI接口说明,此处不展开介绍。

2.3 ipmitool常用参数

bash
# 此处参考 ipmitool version 1.8.18
    -h           显示此帮助列表
    -V           查看ipmitool版本
    -vvv         查看命令执行过程中请求和响应的详细信息
    -I           lan/lanplus,默认lan
    -p port      端口号,默认623
    -C           指定加密套件,其中可用套件为1、2、3、17
    -L           指定会话权限
    -4           Use only IPv4
    -6           Use only IPv6
    -b           指定目标channel,例如8对应BT
    -t           指定IPMB地址,一般为0x20或0x8c
    -N           指定超时时间lan[默认2] / lanplus[默认1],单位:秒
    -R           指定重试次数

举例说明: 假设-R指定重试次数为3, -N指定超时时间为2,那么总共会发3次请求,第一次发送请求的超时时间为2s,第二次是3秒,第三次是4秒。并且这两个参数只在带外生效,带内和带外的重试机制不一样,带内只会重试两次。


三、ipmitool在故障定位中的常用方法

3.1 ipmitool命令处理流程


正常情况下,通过ipmitool工具发送ipmi命令,会通过rmcpd(提供带外ipmi命令支持)或ipmi_core(提供带内ipmi命令支持)将请求转发到其他模块的app,其他模块的app接口函数执行完,返回响应,响应包含相应的完成码。


3.2 命令处理流程图

3.3 完成码说明

完成码说明
0x00命令执行成功
0xC0节点忙。命令不能完成,所需资源短暂不可用
0xC1非法命令,通常指不能识别或者不支持的命令
0xC2对某个特定LUN来说是非法命令
0xC3执行命令超时
0xC4空间不够。由于存储空间不够导致命令不能执行
0xC5存储操作被取消或者存储操作非法
0xC6请求数据不完整,被截断
0xC7请求数据长度非法
0xC8请求数据长度超上限
0xC9请求中某些参数越界
0xCA不能返回请求所需长度的数据
0xCB所涉及的传感器、数据、记录不存在
0xCC请求数据字段非法
0xCD对特定传感器或者记录所发送的命令非法
0xCE无法提供响应
0xCF不能执行重复命令。不能返回已经返回过的响应数据。事件接收器不使用此完成码
0xD0SDR传感器正处在更新状态,不能提供响应数据
0xD1Firmware中的设备正处在更新状态,不能提供响应数据
0xD2BMC正在初始化或者初始化代理正在处理初始化任务,不能提供响应数据
0xD3目的地不可达。例如缓冲区满的时候,请求不能发送到目的地址
0xD4命令不能执行,权限不够
0xD5命令不能执行,当前状态不支持该命令或者参数
0xD6参数非法。命令子函数已经禁用或非法
0xFF未明错误
0x01~7E自定义完成码
其他保留

ipmitool的报错简单地分为四类

  • 打不开会话(请求发送失败)
  • 请求发送给 rmcpd 或 ipmi_core,命令校验失败,直接返回完成码
  • 其他app执行失败,返回相应完成码
  • 命令执行成功但ipmitool报错

3.3.1 打不开会话

排查步骤:

  1. 检查BMC的IP是否能ping通。

  2. 现在net_stream.log里会记录ipmi命令是否到达bmc,会话发不通先确认日志里是否有记录ipmi命令,排除网络因素。

  3. 检查用户名、密码是否正确。

    • 用户名或者密码看上去没问题,但是存在全角和半角字符混合的情况。
    • 用户名或者密码中存在windows命令行的特殊字符,如&等,这种情况需要用双引号。
  4. lan检查rmcp服务是否打开,lanplus检查rmcpplus服务是否打开。

  5. 未指定-p参数时,默认端口号是 623,检查rmcp或者rmcpplus服务端口是否为默认端口号 623,或者是否与-p指定的端口号一致。

  6. 信息都正确,但是认证失败。执行ipmitool的时候加-vvv,发现认证失败。有可能是用户被锁定导致

shell
RAKP 2 message indicates an error : invalid role
Error: Unable to establish IPMI v2 / RMCP+ session
3.3.2 请求发送给 rmcpd 或 ipmi_core,命令校验失败,直接返回完成码

请求发送给 rmcpd 或 ipmi_core 后,会做一系列校验,然后再转发给其他模块app。校验失败的可能完成码如下:

  1. 0xD6(COMP_CODE_SUBFUNC_INVALID)或0xC1(COMP_CODE_INVALID_CMD) 命令不支持。确认命令无误的话,找到相应功能的看护人确认是否命令删减或修改。

  2. 0xC7(COMP_CODE_LEN_INVALID) 命令长度不对。注册IPMI命令时会定义数据区的最大长度和最小长度。

  3. 0xD5(COMP_CODE_STATUS_INVALID) 系统锁定。

  4. 0xD4(COMP_CODE_PRIVILEGE_LIMITED) 权限不够。可能是用户权限或会话权限不够,也可能是命令受限(如黑名单)导致的。

    注:其他模块app也可能失败返回以上完成码。

3.3.3 其他模块app执行失败,返回相应完成码

通常来说,其他模块app在异常场景会有相应的错误记录。所以定位问题时,建议查看debug级别的运行日志或者操作日志,是否有相应的报错记录。

  1. 操作日志:

    • ipmcget -d op
  2. debug级别的运行日志:

    shell
    mdbctl
    attach xxx<对应组件>
    dloglevel debug
    dlogtype local
  3. 升级telnet包,在bmc环境查看对应的运行日志和操作日志。

3.3.4 命令执行成功但IPMITOOL报错

ipmitool 为开源工具。如因版本更新导致报错,建议优先升级至最新稳定版本进行验证。若问题在最新版本中仍存在,可能源于 ipmitool 引入的新特性与当前 IPMI 协议栈的兼容性适配尚未完成。请自行定位问题或到 bmc_core SIG进行技术讨论。

此时可以自行定位或联系 rmcpd 或 ipmi_core 看护人咨询交流。

四、 FAQ

4.1 打开会话请求失败

4.1.1 问题现象

输入命令: ipmitool -h bmc_ip -I lanplus -p 623 -U user_name -P user_psw -C 17 your_command

shell
# 响应信息如下

Error in open session response message : insufficient resource for session

Error: Unable to establish IPMI v2 / RMCP+ session

4.1.2 问题分析

使用-vvv命令,可以看到以下信息: 命令返回完成码0x00,说明命令成功,但是在OPEN SESSION RESPONE下面有RMCP+ status有错误信息。

打开运行日志app.log,有如下日志信息:

shell
om ERROR: rmcpplus_protocol.c(482): rc = -3
  1. 这是常见问题,原因是带外命令最大支持 5 ~ 15 个会话并发处理,一旦超过,则拦截后续命令请求。

  2. 用户应该控制自己的请求不要超过最大会话数,避免遇到此问题。

  3. 过往有案例,某开发者在代码中一个循环里面一直发送带外ipmi命令,造成并发数超过15个,部分命令无法处理的情况。

  4. 无论用户还是开发者,应正确控制并发请求数,等待前面的命令完成后再发送新命令。


4.2 超时问题

4.2.1 问题现象

命令超时可能会出现如下情况的报错(有Unabled to send RAW command的报错,但没有完成码,也就是没有收到响应)。

shell
Unable to send RAW command ([括号里面是发送的命令信息])

4.2.2 问题分析

  1. ipmi命令的请求和响应都可能超时。可通过trace来初步判断。
  2. 建议执行命令时,加上-R 1的参数,这样设置重试次数为1,方便查看trace信息。
  3. 再通过参数-N设置超时时间,可以粗略确认下命令执行的大概时间。
  4. 如果发送命令后,BMC长时间没有收到请求,如果命令无误,请检查网络是否正常。
  5. 如果收到请求后,BMC长时间没有发送响应。这种情况下,首先确认当前cpu占用率是否过高。
  6. 如果cpu占用率正常,和对应功能的看护人确认,是否接口函数执行时间比较长。如果无需优化,可修改-N -R参数,确保时间够用。

4.2.3 超时问题排查流程图

排查要点说明

阶段检查项排查方法
参数设置重试次数执行时加 -R 1 参数,避免重试干扰trace分析
超时时间通过 -N 参数设置,可测试命令实际执行时长
请求超时命令正确性检查命令格式、参数是否正确
网络连通性ping BMC IP,检查网络延迟和丢包
防火墙检查端口 623 是否被拦截
响应超时CPU占用率使用 top 命令查看 BMC CPU 使用率
接口执行时间查看日志,确认是否函数执行时间过长
并发会话检查是否超过最大并发数(5-15个)

五、参考资料