一、前言
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
,提高系统管理的效率和可靠性。