深入理解ipmitool:揭秘BMC与IPMI的智能服务器管理(带外管理)

2024-01-03 16:35:02 浏览数 (2)

一、前言

1.BMC和IPMI

BMC全称为Baseboard Management Controller,基板管理控制器,是用于监控和管理服务器的专用控器,普通PC没有,服务器产品必配,相比于普通PC,服务器在稳定性、可靠性、安全性、性能、可管理性等方面都要求更高更严酷,这时候就需要BMC来管控服务器。

BMC的主要功能包括:

  • 设备信息管理:记录服务器型号、制造商、日期、各部件生产和技术信息、机箱信息、主板信息等、BMC信息(服务器主机名、IP、BMC固件版本等信息);
  • 服务器状态监控管理:对服务器各个部件(CPU、内存、硬盘、风扇、机框等)的温度、电压等健康状态进行检测;
  • 服务器的远程控制管理:服务器的开关机、重启、维护、固件更新、系统安装等;
  • 维护管理:日志管理、用户管理、BIOS管理、告警管理等。

IPMI全称是Intelligent Platform Management Interface,智能平台管理接口。它是由Intel、DELL、HP及NEC于1998年共同提出,同时,由IPMI论坛创建了IPMI标准依赖。各大厂商的IPMI接口叫法不一样:

厂商

IPMI的不同叫法

戴尔

iDRAC

浪潮

IPMI

惠普

iLO

H3C

HDM

超微

HPMI

联想

XCC

华为

iBMC

IBM

IMM

2.BMC和IPMI的关系

IPMI包含了一个以BMC为主的控制器和其他分布在不同系统模块(被称为“卫星”控制器)的管理控制器,卫星控制器包含了相同的架构透过IPMB(Intelligent Platform Management Bus/Bridge) - 一个I²C(Inter-Integrated Circuit)加强实现的系统接口链接到基板管理控制器(BMC),基板管理控制器(BMC) 也能与远程管理控制协议(RMCP) , 一个在此规格内的特殊有线协议一同被管理,实现带外管理。

一个实地替换单元FRU拥有可替换设备的详细清单(如:供应者ID、制造商),一个感应器资料记录(SDR) 则记录了板上个别感应器提供的属性资料,例如:板上可能包含了感应温度、风扇速、电流的感应器。

如上图,通过IPMI接口发送信号给BMC芯片,达到控制和管理BMC芯片的目的。

3.BMC芯片图

讲了这么多BMC的概念,那么它实际长啥样呢?以笔者正在使用的超微X12-SPL-F主板为例:

在主板的最左上方有一块黑色芯片,这就是BMC芯片,可以看到上面刻着ASPEED厂商名字,型号为AST2600,它是ASPEED的第7代服务器管理处理器。

4.BMC Web管理后台

以超微为例,BMC后台管理视图长这样:

可以在这里远程管理服务器的启停,查看CPU温度、主板温度、风扇转速等:

5.IPMI管理工具

介绍完BMC和IPMI后,接下来介绍如何使用IPMI工具进行远程(带外)管理。IPMI的管理工具有很多,比如IPMITool、IPMICFG、OpenIPMI、FreeIPMI,本文将讲述目前最为主流的IPMITOOL。

二、安装IPMITool

1.各大Linux发行版上安装

发行版

安装命令

Arch Linux

pacman -Sy ipmitool

CentOS/RHEL

yum install ipmitool

Debian/Ubuntu

apt install ipmitool

Gentoo

emerge --ask ipmitool

2.Windows安装

Windows版本点此下载,解压到环境变量路径后在cmd窗口下使用。

MD5 checksums:

代码语言:bash复制
61e7f8f84df38b62fd167f408673b35f  ipmitool.zip

3.ESXi安装

如果ESXi作为物理机上的宿主机系统,在上面安装ipmitool后在使用ipmitool时无需键入用户名和密码即可系统内直接调用,其它宿主机同理,非宿主机的情况下,则需要键入用户名密码来连接。

点此下载安装包

MD5 checksums:

代码语言:bash复制
444af4ce1dc68418583dba2926093980 ipmitool-esxi-vib-1.8.11-2.zip
44cb77cc8bd7f969b8e74eb33aec8d71 ipmitool-1.8.11-2-offline_bundle.zip #解压后的内容
173db5b9f205d9c10d9458ff76d8954b  ipmitool-1.8.11-2.x86_64.vib # 解压后的内容

将安装包wget下来,或者scp到ESXi后进行下面的安装步骤。

1)设置软件安装等级

代码语言:bash复制
esxcli software acceptance set --level=CommunitySupported

2)安装VIB文件

将安装包解压缩到/tmp目录后:

代码语言:bash复制
esxcli software vib install -v /tmp/ipmitool-1.8.11-2.x86_64.vib #注意这里vib文件要接绝对路径

如果安装失败,加上--no-sig-check选项。

代码语言:bash复制
esxcli software vib install -v /tmp/ipmitool-1.8.11-2.x86_64.vib --no-sig-check

3)获取安装包信息

代码语言:bash复制
esxcli software vib get -n ipmitool

4)创建软链接

二进制文件默认安装在/opt/ipmitool/路径,把它软链接到PATH路径下:

代码语言:bash复制
ln -sf /opt/ipmitool/ipmitool /sbin/ipmitool

-h参数查看帮助:

代码语言:bash复制
ipmitool -h

5)卸载

如需卸载,执行以下命令:

代码语言:bash复制
esxcli software vib remove -n ipmitool

三、IPMI用法指南

0.写在前面

以下命令都是在非IPMI所在物理机器上运行,因此需要携带-H、-U、-P参数来指定远程地址和用户名密码;

如果在IPMI物理机的宿主机系统本身运行,这些参数可以省略,比如宿主机是ESXi,后面直接跟命令参数即可:

代码语言:bash复制
ipmitool sensor

截图中的密码作为临时使用,在你看到这篇文章后已经被删除,因此没有打码用户名密码部分。

作为远程调用过程中,你不想直接在命令行上体现密码,把-P删掉即可,后面不接密码内容,将会在交互中shell中输入密码:

同时,也并不是所有主板都支持BMC管理,是否有BMC芯片,请自行查询主板厂商和型号支持情况,一般在服务器主板常用。ipmitool理解为一个客户端工具就行,不要误解为ipmitool装上后就能控制任意服务器,BMC才是大前提。

比如不支持BMC的主板,使用IPMITool的报错:

1.读取传感器监测值(sensor list)

ipmitool发送信号给BMC芯片,读取主板上的硬件传感器当前值:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sensor list

2.获取指定ID的监测值(sensor get)

1)读取CPU温度

sensor get后面接过滤的id名,比如,只读取CPU温度,可以是:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sensor get "CPU Temp"

2)读取风扇转速

同理,读取风扇转速,接风扇的ID即可,譬如读取风扇1的转速:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sensor get "FAN1"

3)读取内存温度

其中ABCD插槽为一个传感器,可以是:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sensor get "DIMMABCD Temp"

EFGH插槽为一个传感器,可以是:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sensor get "DIMMEFGH Temp"

3.查看底盘状态(chassis status)

使用chassis status来查看底盘状态,其中包括了底盘电源信息,底盘工作状态等:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> chassis status

4.启停服务器(chassis power on/off)

使用此命令,实现真正意义上的远程开关机,开机(硬开机):

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> power on

远程关机(硬关机,直接切断电源):

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> power off

同时还有power soft (软关机,即如同轻按一下开机扭)、power reset (硬重启)、power status (获取当前电源状态)。

5.指定IPMI接口(-I)

涉及到远程连接-H参数时不指定-I的情况下默认使用lan,其中lan对应ipmi 1.5版本,lanplus对应ipmi 2.0版本,当你的密码长度大于16位的时候,请指定2.0版本使用:

代码语言:bash复制
ipmitool -I lanplus -H <bmc远程服务地址> -U <用户名> -P <密码> <命令参数>

通过wireshark抓包可以看到,使用-H远程连接时,不指定-I或者指定-I lan,都是使用IPMI 1.5版本:

通过RMCP协议传输,UDP端口623。

指定-I lanplus则使用IPMI 2.0版本:

6.查看BMC硬件信息(mc info)

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> mc info

7.显示BMC当前已启用选项的列表(mc getenables)

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> mc getenables

8.启用/禁用BMC选项(mc setenables)

以AST2600的BMC为例,可接的选项如下:

选项

含义

recv_msg_intr

接收消息队列中断

event_msg_intr

事件消息缓冲区完全中断

event_msg

事件消息缓冲区

system_event_log

系统事件日志

oem0

OEM 0

oem1

OEM 1

oem2

OEM 2

启用事件信息缓冲区可以是:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> mc setenables event_msg=on

那么禁用OEM 0可以是:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> mc setenables oem0=off

9.查看/删除系统日志(sel)

1)查看系统日志(sel list/elist)

sel即Sytem Event Log,系统事件日志,set list列举日志内容,按时间顺序从上到下排序:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sel list

elist可以获取更详细的扩展日志信息:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sel elist

同时也可以通过first、last,来指定最前面N条,或最近N条。比如指定最近10条和最早10条,可以是:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sel elist first 10
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sel elist last 10

2)删除所有系统日志(sel clear)

清除所有系统日志,通过sel clear来实现清理:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sel clear

10.查看/设置BMC时间(sel time)

1)显示当前BMC的时间(sel time get)

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sel time get

2)设置BMC的时间(sel time set)

设置的时间格式为:MM/DD/YYYY HH:MM:SS,即月/天/年 时:分:秒,24小时制:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sel time set "MM/DD/YYYY HH:MM:SS"

11.发送事件消息到系统消息日志(event)

可接的选项有:

选项id

含义

日志内容

1

温度过高

Temperature - Upper Critical - Going High

2

电压过低

Voltage Threshold - Lower Critical - Going Low

3

内存ECC错误

Memory - Correctable ECC

发送事件一,可以是:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> event 1

进入BMC Web管理后台,可以看到我们刚刚发送的事件:

通过sel命令也可以获取到日志:

12.打印lan channel信息(lan print)

在IPMI 1.5版本后提出了“Channel Model”的概念,通道分为基于会话和无会话,基于会话的通道在路由IPMI消息之前要先激活会话。

我们是基于局域网来远程管理的,打印lan channel信息可以是:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> lan print

13.设置lan channel的IP地址和掩码(lan set)

首先将IP类型改成静态:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> lan set 1 ipsrc static

再将lan channel 1的IP地址设置为某个IP:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> lan set 1 ipaddr <IP地址>

同理,lan set命令下的参数还有netmask、macaddr、alert、vlan id等,设置掩码、mac地址、告警、vlan等,使用lan set即可查看:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> lan set

以设置24位掩码为例,可以是:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> lan set 1 netmask 255.255.255.0

设置IPv6地址,可通过lan6 set实现:

14.BMC用户管理(user )

1)列举BMC的用户列表(user list)

显示BMC的账号信息,通过user list实现:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> user list

2)修改BMC的用户密码(user set password)

修改用户密码首先要知道用户的数字id是多少,上面的user list即可拿到用户id,之后修改密码,比如Rokas用户的id为3,修改密码则是:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> user set password <用户ID>

键入两次密码后,则修改成功,使用新密码连接成功。

如果不想在交互shell下设置密码,直接在命令行设置,后面接密码即可:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> user set password <用户ID> <密码>

user命令下面还提供设置用户权限、账户名、密码的能力:

3)统计当前用户数量(user summary)

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> user summary

15.设置风扇转速(raw)

超微的风扇模式默认有四种:

这四种模式无法更精细化控制风扇转速,我们可以通过raw命令向bmc发送raw格式的控制命令,从而实现相对精细化的控制风扇。

以下面这个命令为例:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> raw 0x30 0x70 0x66 0x01 0x01 0x02

倒数第二个参数,0x00表示控制CPU ZONE,0x01表示控制IO ZONE;0x00代表系统区域,这个区域一般为负责CPU、GPU的风扇,对应风扇编号为FAN1,FAN2。0x00代表周边设备区域,对应风扇编号为FANA,FANB之类;倒数第一个参数0x02是转速百分比,范围在0x01 - 0x64之间,0x00表示最低转速,0x64表示最高转速。

首先需要把风扇模式调成FULL,如果不设置FULL模式,自定义的转速会被自动转速刷新覆盖,让我们的配置失效。

将风扇模式调成FULL:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> raw 0x30 0x45 0x01 0x01

倒是第一个参数表示FULL模式,模式的取值参考下表:

模式

十六进制取值

Standard Speed

0x00

Full Speed

0x01

Optimal Speed

0x02

Heavy IO

0x03

此时风扇已经全速运行:

或者也可以直接在BMC Web后台管理修改为FULL模式:

通过grafana可以看到风扇转速有了明显的变化趋势:

CPU、内存温度等也有了降低趋势:

接下来设置转速百分比,前面说过,最后一个参数表示风扇转速,范围在0x01 - 0x64之间,那么0x20表示转速百分比为32%:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> raw 0x30 0x70 0x66 0x01 0x00 0x20
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> raw 0x30 0x70 0x66 0x01 0x01 0x20

可以明显看到风扇转速已经下来,BMC web后台依然为FULL模式:

16.读取传感器仓库条目(sdr)

0)和sensor的区别

sdr用于打印传感器仓库中的所有监控项和从传感器读取到的值,sensor用于打印传感器信息。

1)读取CPU温度/风扇转速(sdr get)

通过sdr get 可以读取指定sensor id的传感器数据,比如读取CPU温度:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sdr get "CPU Temp"

同理,读取风扇转速,可以是:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sdr get "FAN1" "FAN2"

2)按照Sensor类型读取(sdr type)

sensor类型可以通过sdr type list命令来列举:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sdr type list

比如读取温度相关的传感器数据:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sdr type Temperature

读取电压相关的传感器数据:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sdr type Voltage

同理,读取风扇相关的传感器数据:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sdr type Fan

其它类型不一一列举。

3)打印sdr信息(sdr info)

输出sdr数据的详细信息:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sdr info

17.读取会话信息(session info)

打印会话的所有信息:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> session info all

将会打印当前会话的权限、用户id、channel、会话类型等。

18.从文件执行命令(exec)

类似于批处理文件或脚本,但是没有逻辑判断,只是从上到下按照顺序执行文件里面的内容。

比如commandlist文件写入三条命令:

代码语言:bash复制
session info all   # print sessin info
sdr info           # print sdr info
sdr type fan       # print fan speed

'#'号表示注释

使用exec来批量一次性执行:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> exec commandlist

19.提升输出的详细级别(-v)

通过sel elist输出最近一条日志为例,不加-v参数的情况和-v参数的情况:

代码语言:bash复制
ipmitool -H <bmc远程服务地址> -U <用户名> -P <密码> sel elist last 1
ipmitool -v -H <bmc远程服务地址> -U <用户名> -P <密码> sel elist last 1

可以是-v也可以是-vv、-vvv,5个v都没问题,v越多越详细,甚至可以把整个报文交互的16进制数据显示出来:

20.以逗号分割输出字段(-c)

默认情况下会使用空格或者'|'作为分隔符,-c参数则通过使用逗号(CSV)进行结果分割,以最近一条日志为例:

代码语言:bash复制
ipmitool -c -H <bmc远程服务地址> -U <用户名> -P <密码> sel elist last 1

这并不会适用于所有命令,比如以表格形式输出的sdr info,-c是没效果的:

四、总结

在本文中,我们深入探讨了 ipmitool 的重要性以及其在服务器管理中的关键作用。我们首先剖析了基板管理控制器(BMC)和 Intelligent Platform Management Interface(IPMI)的关系以及各平台如何正确安装ipmitool

同时,详细介绍了ipmitool的用法,从监控传感器数据、系统日志管理、用户管理、控制风扇转速到远程启停服务器等,使其适用于不同硬件供应商和系统架构,从而为管理员提供了广泛的管理选择,实现真正意义上的带外管理。

总的来说,ipmitool 不仅是一种功能强大的工具,还是服务器管理中不可或缺的一部分。通过本文的介绍,读者可以更全面地理解和运用 ipmitool,提高系统管理的效率和可靠性。

0 人点赞