一、IPMI介绍
1、平台管理
平台管理表示的是一系列的监视和控制功能,操作的对象是系统硬件。比如通过监视系统的温度,电压,风扇、电源等等,并做相应的调节工作,以保证系统处于健康的状态。
当系统不正常时,可以选择复位来重启系统。
同时平台管理还负责记录各种硬件的信息和日志记录,用于提示用户和后续问题的定位。
以上的这些功能可以集成到一个控制器上来实现,这个控制器被称为基板管理控制器(Baseboard Manager Controller,简称BMC)。
一般服务器中会用到BMC。
注:IPMI,它是与BMC匹配的接口,所有的BMC都需要实现这种接口。
2、IPMI
IPMI的全称是Intelligent Platform Management Interface,智能平台管理接口。
IPMI就是对“平台管理”这个概念的具体的规范定义,该规范定义了“平台管理”的软硬件架构,交互指令,事件格式,数据记录,能力集等。而BMC是IPMI中的一个核心部分,属于IPMI硬件架构。
主要用于服务器各个部件(CPU、内存、硬盘、风扇、机框等)的温度、电压等健康状态进行检测,
同时根据各个温度采集点情况实时调整风扇转速保证服务器不产生过温、而且控制总体功耗又不能过高,如果单板部件出现任何异常则通过SNMP协议、SMTP协议、Redfish协议等多种业界通用规范讲信息及时上报给上层网管,以便运维人员及时处理,保证业务无损。
BMC主要用于采集单个服务器上各种信息,同时提供给上层运维网管软件。主要有两种手段:
第一种BMC会提供各种各样的接口供上层网管查询,如web、命令行等人机接口、SNMP、IPMI、Restful等机机接口;
第二种是主动上报,当检测到有故障产生时,BMC可以通过SNMP trap消息、SMTP 邮件消息、Redfish http json报文等手段上报给上层网管软件的服务端,以便运维人员及时识别处理故障。一般情况下,BMC软件上报的消息中都会明确的指明具体是哪个部件产生了故障、处理建议是怎样的等等。
在IPMB(Intelligent Platform Management Bus)总线上连接着各个管理控制器,分别执行不同功能。IPMB总线上还连接着一些I2C器件,用来作为传感器的接口,让系统管理软件能够通过IPMB来读取传感器的数据。同时,这些传感器的具体配置信息,
告警门限、事件触发是否允许等配置都保存在一组名为SDR(Sensor Data Record)的数据里面。
传感器产生的告警事件则保存在一组叫做SEL(Sensor Event Log)的数据里面。在IPMB总线上,连接着一个ICMB(Intelligent Chassis Management Bus)桥,通过ICMB可以和远程的另一个管理平台通信。此外,在IPMB总线上,还可以外接其他的用户板,用来扩展IPMI管理平台的功能。
管理系统的核心——BMC芯片就相当于计算机中的中央处理器,通过BMC芯片上一对SMBus接口连接网络,用户可通过网络访问实现对远程服务器接管的带外管理(Out-of-band)功能,例如远程接管服务器(Pre-OS),在客户端实现对远程服务器的完全接管;通过RS-232接口连接Modem,
在远程服务器宕机情况下,用户可以通过拨号访问获取SDR、SEL数据,分析诊断故障原因;BMC通过IPMB接口访问模组风扇背板、电源背板等上的SMC,实现对各种背板的温度电压风扇转速等关键参数管理;BMC通过系统接口(多用SMIC:Server Management Interface Chip),实现IPMI消息传输机制,控制LCD显示和实现上层软件与底层F/W通信,实现告警、数据采集。SDR、SEL、FRU(Field Replacement Unit)物理实体可以是做在芯片内的存储体,也可以是外挂的E2PROM。所有IPMI功能通过向BMC发送命令来完成,命令使用IPMI规范中规定的指令,BMC接收并在系统事件日志中记录事件消息,维护描述系统中传感器情况的传感器数据记录。
通过网络监控远程服务器。
被监控服务器需要硬件和操作系统接口驱动的支持,可以无需安装应用软件。
监控客户端需要应用软件如ipmitool工具,可以无需硬件和操作系统接口驱动的支持。
ipmi的远程监控是通过向与BMC相连的网络接口发送udp数据包实现的,udp数据包的定位是通过把ip地址写BMC芯片来实现,而这需要本地的Ipmi系统接口来完成连接。Ipmitool可以通过LAN远程监控系统,同时BMC中保存有一序列用户名和密码,通过LAN进行远端访问需要用户名和密码。
2.1接口说明
KCS:最常用的接口 ,物理层基于LPC协议,实现了 8742 KCS interface,其中System interface默认就是LPC接口
SMIC (system management interface chip):用在没有内建的KCS/LPC控制器的BMC上,有三个IO Port,可基于ASIC/FPGA实现。
BT接口: 速度和性能最好的接口,需要握手,同样可基于ASIC/FPGA实现3个IO port,可用于定制化的BMC上。
3、驱动的实现
内核中IPMI驱动是分层实现的,最底层分别实现了基于Smbus、LPC的自动检测、事物处理、结果读取和清除的操作,并用这些函数初始化了抽象的system interface的对应的函数,从而屏蔽了底层硬件接口的区别。更上层的设备抽象和协议实现都是直接和抽象的system interface直接交互的。具体的说明可以参考内核中的Documentation/IPMI.txt文档,简要的归纳如下:
ipmi_smbus.ko: 实现对 IPMI management controller基于Smbus直接访问的接口驱动;
ipmi_ssif.ko: 在更早的内核版本里对应的名字就是 ipmi_smbus.ko,支持通过Smbus接口发送、接受信息;
ipmi_si.ko: 屏蔽了不同系统接口的驱动,支持KCS/SMIC/BT,除非host 和BMC之间使用Smbus或者其他定制化的接口,否则都需要这一标准驱动;定义了probe BMC的三种方法:ACPI/SMBIOS(DMI)/PCI (class type);
ipmi_msghandler.ko: 内核用它来实现IPMI协议规范 ,它注册了 IPMI驱动;
ipmi_devintf.ko: provides a user land IOCTL interface for the IPMI driver,每一个打开的文件都都对应到一个消息处理句柄。定义了 /dev/ipmi0对应的ioctl/open/release/fasync/poll/llseek的操作,给应用层程序提供了fs接口。其中ioctl的操作类型包括:IPMICTL_SEND_COMMAND,IPMICTL_SEND_COMMAND,IPMICTL_RECEIVE_MSG和 IPMICTL_RECEIVE_MSG_TRUNC。应用程序就是通过打开/dev/ipmi0或者/dev/ipmi0并调用各种IOCTL来实现和BMC的通信的;
ipmi_watchdog.ko:向上层用户提供一个标准的linux 看门狗计时器;
ipmi_poweroff.ko: 支持通过ipmi命令开关机的内核驱动。
二、BMC在ACPI规范中的说明
- acpi表及对象
1.1 SPMI
SPMI描述表是一个可选表,它描述了在系统引导时IPMI系统接口的与处理器相关的、转换的固定资源。SPMI表的目的是提供一种机制,该机制可以通过OSPM 很早就在引导过程中。
SPMI描述表可以用来描述固定资源或系统接口的PCI实现的位置。对于PCI上的系统接口,表只能描述启动引导进程时系统接口的位置。操作系统可以重新分配这些资源。因此,基于pci的系统接口是否保留在SPMI地址取决于操作系统。在正常运行时操作期间,软件应该直接在PCI上找到系统接口,并且/或使用OS对PCI的支持,而不是使用SPMI表。
管理控制器设备可以为向BMC发送IPMI消息提供多个系统接口。例如,一个BMC可以同时支持KCS和BT接口。应该为每个接口提供一个惟一的SPMI表。这允许OSPM选择一个它能够通信的接口,从而最大化可移植性。
1.2 控制方法
SPMI描述表提供了一种机制,可以在操作系统中执行ACPI控制方法之前使用。然而,OSPM内部并不支持这个表作为发现和报告系统资源的方法。因此,建议在ACPI名称空间中描述底板上的非pci IPMI系统接口。这使得OSPM可以将IPMI系统接口枚举为一个设备。此外,ACPI名称空间描述在热插拔场景中更加灵活和友好。
请注意,要与ACPI兼容,IPMI系统接口的固定资源仍然必须按照ACPI规范计算。如果设备没有在ACPI名称空间中正式描述,它的资源必须被描述为固定系统资源或附加到其他固定资源系统设备的资源,以确保OSPM不会试图将这些资源分配到其他设备。
为了在ACPI名称空间中正式描述IPMI系统接口,使用命名的设备对象创建IPMI设备。IPMI设备对象可以有以下元素:
控制方法 | 描述 |
_ADR | 接口在其父总线上的地址的已命名对象 |
_HID | 命名对象,提供接口的即插即用标识符。此值可以是特定于供应商的,但如果没有提供CID对象,则必须设置为IPI0001。 |
_CID | 提供接口兼容的即插即用标识符的已命名对象。如果_HID包含供应商特定的标识符,则该对象是必需的,并包含IPI0001的值。否则,此对象是可选 |
_STR | 指定对象,计算为一个Unicode字符串,操作系统可以使用该字符串向描述设备的最终用户提供信息。 |
_CRS | 返回接口当前资源设置的命名对象。系统处理器管理接口被认为是静态资源;因此,只返回它们定义的资源。地址区域定义依赖于接口类型/子类型。 |
_STA | 返回设备状态的对象:启用、禁用或删除,如ACPI规范中定义的那样。如果不存在此方法,则假定该设备已启用。 |
_IFT | 指定在SPMI表中定义的接口类型的对象 |
_SRV | 指定规范修订的对象 |
_GPE | 为整数或包的已命名对象。如果_GPE计算为整数,则该值是FADT中描述的服务处理器管理接口将触发的GPE块的GPEx_STS寄存器中的SCI中断的位分配。 如果_GPE计算为一个包,则该包包含两个元素。第一个是对GPE块设备的对象引用,该设备包含将由接口触发的GPE寄存器。第二个元素是数值(整数),它指定包中第一个元素引用的GPE块设备的GPEx_STS寄存器中的SCI中断的位分配。(注意:只有在接口支持GPE时才提供该对象。) |
如果IPMI接口支持中断,则使用_CRS中的中断描述符,如果通过IO (S)APIC支持中断,则使用_GPE对象,如果通过GPE寄存器支持中断,则使用_GPE对象。这个规范不允许中断描述符在_CRS中,而_GPE对象在IPMI设备范围中。如果IPMI接口不支持中断,那么_CRS中的中断描述符和_GPE对象都不会出现。
在一个操作系统域中可能有多个IPMI设备的多节点系统中,强烈建议在ACPI名称空间中描述所有IPMI设备,并为活动的IPMI设备启用_STA 控制方法。
- IPMI空间
本节介绍智能平台管理接口(IPMI)地址空间,以及如何使用此地址空间与AML中的BMC(BMC)硬件进行通信。
类似于SMBus,IPMI操作区域是基于命令的,其中IPMI地址空间内的每个偏移都表示IPMI命令和响应对。鉴于这种独特性,IPMI操作区域包括对其字段定义的限制,并要求对所有事务使用特定于IPMI的数据缓冲区。
兼容ACPI的操作系统对IPMI通用地址空间的支持是可选的,并且视是否存在ACPI IPMI设备(即具有“ IPI0001”即插即用ID的设备)而定。如果存在,则OSPM应根据设备下_IFT(IPMI接口类型)控制方法所指定的系统接口类型来加载必要的驱动程序软件,并注册用于访问IPMI操作区域空间的处理程序。
每个IPMI操作区域定义都标识单个IPMI网络功能。仅为需要从AML访问的IPMI网络功能定义了操作区域。与其他区域一样,只能通过Field术语访问IPMI操作区域。
该接口将每个IPMI网络功能建模为具有256字节的线性地址范围。此范围内的每个字节偏移都对应一个命令值(例如,字节偏移0xC1等于命令值0xC1),最多包含256个命令值。这样,IPMI地址空间看起来是线性的,并且可以按照与其他地址空间类型类似的方式进行处理。OperationRegion术语的语法(来自第19.6.99节“ OperationRegion(声明操作区域)”)如下所述。
OperationRegion (
RegionName, // NameString
RegionSpace, // RegionSpaceKeyword
Offset, // TermArg=>Integer
Length // TermArg=>Integer
)
•RegionName指定此IPMI网络功能的名称(例如,“ POWR”)。
•RegionSpace必须设置为IPMI(操作区域类型值为0x07)。
•偏移量是一个字长的值,它指定目标设备的网络功能和初始命令值偏移量。网络功能地址存储在高字节中,命令值偏移量存储在低字节中。例如,值0x3000将用于网络功能为0x06,初始命令值偏移为零(0)的设备。
•对于初始命令值偏移为零(0)的区域,长度设置为0x100(256),代表可能的命令值的最大数目。这两个值的差用于具有非零偏移的区域。例如,偏移值为0x3010的区域将具有相应的长度0xF0(0x100减去0x10)。
例如,BMC将在网络功能0x30处支持功率计量功能,并通过IPMI命令在网络功能0x06处查询BMC设备信息。
以下ASL代码显示了OperationRegion术语的使用,以描述这些IPMI功能:
Device (IPMI)
{
Name(_HID, "IPI0001") //IPMI device
Name(_IFT, 0x1) //KCS system interface type
OperationRegion(DEVC, IPMI, 0x0600, 0x100) //Device info network function
OperationRegion(POWR, IPMI, 0x3000, 0x100) //Power network function
}
请注意,此示例中的这些操作区域是在“拥有” IPMI设备的直接上下文中定义的。 这样可以确保根据_IFT对象返回的值使用正确的操作区域处理程序。 每个定义对应一个单独的网络功能,并且碰巧使用的初始命令值偏移为零(0)。
三、IPMITOOL工具
安装OpenIPMI ipmitool:yum install -y OpenIPMI ipmitool
- ipmitool shell --- 进入命令shell
- sensor list --- 命令可以获取传感器中的各种监测值和该值的监测阈值,包括(CPU温度,电压,风扇转速,电源调制模块温度,电源电压等信息)
- sensor get
sensor get “7A1000_temperatu”可以获取ID为7A1000_temperatu监测值,7A1000_temperatu是sensor的ID,服务器不同,ID表示也不同。
- sensor thresh <id> <threshold> <setting>设置ID值等于id的监测项的各种限制值。
例:sensor thresh HDD1 unr/ucr/unc XXX
unr = upper non-recoverable 传感器的紧急上门限
ucr = upper critical 上临界
unc = upper non-critical 非上临界
同样存在最低限制值。
- chassis status查看底盘状态,其中包括了底盘电源信息,底盘工作状态等
- chassis policy list 查看支持的底盘电源相关策略。
- chassis power on/off/reset启动/关闭/重启底盘,用此命令可以远程开机
- mc reset 使BMC重新硬启动
- mc info 查看BMC硬件信息
- mc getenables 列出BMC所有允许的选项
- mc setenables <option>=[on|off],设置bmc相应的允许/禁止选项。
- event 1 发送一个温度过高的消息到System Event Log中,可以发送的Event有:
(1) Temperature: Upper Critical: Going High
(2) Voltage Threshold: Lower Critical: Going Low
(3) Memory: Correctable ECC Error Detected
event命令可以用测试配置的IPMI中的snmp功能是否成功。
- sel save 文件名 显示日志SEL(Sensor Event Log)到文件。
- sel list 列出日志
- lan print 1 打印现在channel 1的信息 。
- lan set 1 ipaddr 10.10.113.95设置channel 1 的地址为10.10.113.95
- lan set 1 snmp public设置channel 1 上snmp的community为public。
- lan set 1 access on设置channel 1允许访问。
- pef info打印Platform Event Filtering (pef)信息
- pef status查看Platform Event Filtering (pef)状态
- pef policy查看Platform Event Filtering (pef)策略设置
- sdr list fru 读取fru信息并显示。
被监控服务器使用ipmitool更改ip,查看ip
root@linux:~# ipmitool lan set 1 ipaddr 172.16.6.222
Setting LAN IP Address to 172.16.6.222
root@linux:~# ipmitool lan print 1
监控客户端Ipmi ip地址也必须和被监控服务端在同一网段
远程获取服务器监控信息时,需要加上远程服务器的地址。使用以下的命令格式:
ipmitool -H 10.40.40.106 -U root -P 0penBmc -I lan command
其中-H表示后面跟的是服务器的地址,-U表示后面跟着用户名,-P表示后面跟着用户密码,command与本地获取信息相同。