BMC(Baseboard Management Controller) 即基板管理控制器,是IPMI(Intelligent Platform Management Interface) 协议即智能平台管理接口所定义的服务器管理体系中的核心组件
1.1 IMPI 简介
维基百科中IPMI 定义如下:
智能平台管理接口(IPMI)是一套为自主计算机子系统定义的计算机接口规范,用于提供独立于主机系统的 CPU,固件(BIOS 或 UEFI)和操作系统等软硬件的管理和监视功能。 IPMI 定义了一套系统管理员接口,用于计算机系统的带外管理和管理员操作监视。
简言之,IPMI 提供了一套基标准接口,通过嵌入到服务器主板上的 BMC、相关传感器及相应固件,提供独立于服务器 CPU、固件、和操作系统等软硬件的服务器检测管理功能,既不需要服务器操作系统支持,也不占用服务器操作系统资源。IPMI 接口提供的服务包括服务器物理健康状态检测,服务器软硬件信息和运行状态查询,开关机,察看和修改 BIOS 配置,远程安装操作系统等。被监控的主机可以断电,但是必须保持电源和局域网连接。
IMPI 接口基于命令 / 响应机制,通过网络功能码将机箱、传感器、固件、存储、应用等主机组件进行分类和传递消息,通过软件 ID 对 BIOS、系统管理软件、远程终端等传感器管理软件进行分类,在网络、串行 / Moderm 接口、IPMB(I2C)、KCS、SMIC、SMBus 等不同接口上传递使统一格式的 IPMI 消息。
IPMI1.5 允许 IPMI 系统通过串口,BMC 专用的带外网口,或者与主机共享的带内网口(NC-SI)与远程管理系统通讯。
IPMI2.0 增加了 SOL(serial over LAN)、群组管理系统、增强身份认证(RAKP+、SHA-1 等)、基于 OpenSSL/RCMP + 的安全增强网络接口、固件防火墙和 VLAN 支持等。其中, SOL 支持将 BIOS 输出和操作系统终端重定向到与 BMC 相连的串口,进而通过 IPMI 与远程系统管理软件连接。并且 IPMI2.0 兼容系统通常还提供 KVM over IP(基于 IP 的远程键盘鼠标显示器连接)、远程桌面和页面服务器等功能,虽然这些功能并不属于 IPMI 协议的一部分。
IMPI 规范主体架构如下:
IPMI 主体架构
此外,为了提供更多的功能和更好的安全性,DMTF(分布式管理任务组)制定了基于浏览器 RESTful 插件和 JSON 数据格式的的安全可扩展数据中心管理标准Redfish API。英特尔也实现了 IPMI 2.0 的大数据中心扩展DCMI(Data Center Manageability Interface),基于 IPMI 接口但是最小化可选接口数量,并包括功率上限控制等其他不同。
1.2 BMC 简介
维基百科中BMC 定义如下:
基板管理控制器(BMC)提供 IPMI 架构中的智能特性。它是嵌入在计算机(通常是服务器)主板上的专用微控制器。 BMC 负责管理系统管理软件和平台硬件之间的接口。
维基百科 BMC 框图
根据 IPMI 规范,BMC 需要满足如下条件:
- 实现 IMPI 必选命令;
- 提供任一 BMC 访问接口;
- 提供标准化的看门狗定时器接口和看门狗内部事件产生功能;
- 提供可被其他主机组件使用的事件接收功能;
- 提供可通过相应的 IPMI 必选命令访问的 SDR(传感器数据记录)仓库、SEL(系统事件记录)和 FRU(现场可替换单元)目录等功能;
- 提供初始化代理功能以初始化 BMC 和其他管理控制器的传感器和事件产生组件。
简而言之,BMC 就是嵌入到服务器主板上的一块独立处理器,通过 IPMB、LPC(low-pin-count-interface)、SMBus 等各种接口收集与主机内部的其他软硬件组件进行通信,并通过网络、串行 / Moderm、PCI 等接口传向本地主机 / 远程服务器提供查询和控制功能。
典型的 BMC 系统如下所示:
BMC 典型架构
BMC 系统通常由各个服务器厂商自主实现,开源框架较少。目前已知的开源方案有 OpenBMC、u-bmc 和 coreIPM。
2.1 OpenBMC
2.1.1 概述
根据维基百科的定义:
OpenBMC 项目是 Linux 基金会的开源项目,目的是提供一个 BMC(基板管理控制器)固件堆栈的开源实现。OpenBMC 是 BMC 的 Linux 发行版,旨在跨越异构系统,包括企业,高性能计算(HPC),电信和云规模数据中心。
OpenBMC 由微软,英特尔,IBM,谷歌和 Facebook 发起,使用 Yocto Project 作为底层构建和发布框架。OpenBMC 提供 REST API、Redfish、IPMIv2.0、D-BUS 等接口和自定义的 HOST 管理接口,支持常见的主机状态查看和控制、BMC 和在主机固件更新等功能。
目前 OpenBMC 支持的 Soc 如下所示:
- OpenBMC Github 官方仓库master 分支: | BSP 目录 | 单板 | SoC | ARCH | | —- | —- | —- | —- | | meta-hxt/meta-stardragon4800-rep2 | stardragon4800-rep2 | ASPEED AST2500 | arm1176jz-s | | meta-qualcomm/meta-centriq2400-rep | centriq2400-rep | ASPEED AST2500 | arm1176jz-s | | meta-inspur/meta-on5263m5 | on5263m5 | ASPEED AST2500 | arm1176jz-s | | meta-evb/meta-evb-enclustra/meta-evb-zx3-pm3 | evb-zx3-pm3 | Xilinx Zynq-7000 | arm Cortex-A9 | | meta-evb/meta-evb-aspeed/meta-evb-ast2500 | evb-ast2500 | ASPEED AST2500 | arm1176jz-s | | meta-evb/meta-evb-nuvoton/meta-evb-npcm750 | evb-npcm750 | Nuvoton NPCM7XX | arm7a-novfp | | meta-evb/meta-evb-raspberrypi | RaspberryPi | RaspberryPi | arm1176jzf-s | | meta-ibm/meta-z | ibm-z | fsp2 | PPC476 | | meta-ibm/meta-witherspoon | witherspoon | ASPEED AST2500 | arm1176jz-s | | meta-ibm/meta-palmetto | palmetto | ASPEED AST2400 | arm926ejs | | meta-ibm/meta-romulus | romulus | ASPEED AST2500 | arm1176jz-s | | poky/meta-poky | qemux86 | i586 | x86 | | meta-facebook/meta-tiogapass | tiogapass | ASPEED AST2500 | arm1176jz-s | | meta-inventec/meta-lanyang | lanyang | ASPEED AST2500 | arm1176jz-s | | meta-quanta/meta-gsj | gsj | Nuvoton NPCM7XX | arm7a-novfp | | meta-quanta/meta-f0b | f0b | ASPEED AST2500 | arm1176jz-s | | meta-quanta/meta-q71l | quanta-q71l | ASPEED AST2400 | arm926ejs | | meta-quanta/meta-runbmc-nuvoton | runbmc-nuvoton | Nuvoton NPCM7XX | arm7a-novfp | | meta-intel/meta-s2600wf | s2600wf | ASPEED AST2500 | arm1176jz-s | | meta-mellanox/meta-msn | msn | ASPEED AST2500 | arm1176jz-s | | meta-ingrasys/meta-zaius | zaius | ASPEED AST2500 | arm1176jz-s | | meta-phosphor | qemuarm | arm versatile 926ejs | arm926ejs | | meta-portwell/meta-neptune | neptune | ASPEED AST2500 | arm1176jz-s |
- Facebook OpenBMC 仓库helium 分支: | BSP 目录 | 单板 | SoC | ARCH | | —- | —- | —- | —- | | meta-bf/meta-mavericks | mavericks | ASPEED AST1250 | arm926ejs | | meta-facebook/meta-fby2/meta-fby2-gpv2 | fby2 | ASPEED AST2520 | arm1136jf | | meta-facebook/meta-fby2/meta-fby2-ep | fby2 | ASPEED AST2520 | arm1136jf | | meta-facebook/meta-fby2 | fby2 | ASPEED AST2520 | arm1136jf | | meta-facebook/meta-fby2/meta-fby2-tl | fby2 | ASPEED AST2520 | arm1136jf | | meta-facebook/meta-fby2/meta-fby2-rc | fby2 | ASPEED AST2520 | arm1136jf | | meta-facebook/meta-yamp | yamp | ASPEED AST2520 | arm1136jf | | meta-facebook/meta-fbtp | fbtp | ASPEED AST2520 | arm1136jf | | meta-facebook/meta-fbttn | fbttn | ASPEED AST2520 | arm1136jf | | meta-facebook/meta-minipack | minipack | ASPEED AST2520 | arm1136jf | | meta-facebook/meta-lightning | lightning | ASPEED AST1250 | arm926ejs | | meta-facebook/meta-galaxy100 | galaxy100 | ASPEED AST1250 | arm926ejs | | meta-facebook/meta-wedge100 | wedge100 | ASPEED AST1250 | arm926ejs | | meta-facebook/meta-minilaketb | minilaketb | ASPEED AST2520 | arm1136jf | | meta-facebook/meta-yosemite | yosemite | ASPEED AST1250 | arm926ejs | | meta-facebook/meta-cmm | cmm | ASPEED AST2520 | arm1136jf | | meta-facebook/meta-wedge | wedge | ASPEED AST1250 | arm926ejs | | meta-portwell/meta-pwneptune | pwneptune | ASPEED AST2520 | arm1136jf |
注意:
- 不同 git branch 支持 BSP 不一样;
- 有效 BSP 必须同时包含 local.conf.sample 和 bblayers.conf.sample 文件。
2.1.2 编译和运行
编译和运行环境如下:
kubuntu 18.04 LTS;
OpenBMC 官方仓库;
OpenBMC 维护的 QEMU 仓库,包含 OpenBMC 对 QEMU 官方代码的补丁和增强;
Palmetto QEMU 模拟目标机,真实硬件为一个使用 AST2400(支持 NC-SI)作为 BMC 的 OpenPower Power8 服务器。
注意:Facebook 官方仓库编译不成功,workaround 了 automake 编译错误问题后发现了更多问题,无法继续。有兴趣者可参考Facebook OpenBMC 仓库主页和OpenBMC 介绍 - 简书进行尝试,共同讨论一下。
搭建和编译步骤如下:
- sudo apt-get install -y git build-essential libsdl1.2-dev texinfo gawk chrpath diffstat
- git clone https://github.com/openbmc/openbmc.git
- cd openbmc
- export TEMPLATECONF=meta-ibm/meta-palmetto/conf
- . openbmc-env
- bitbake obmc-phosphor-image
注意:image 存放在编译目录下的tmp/deploy/images/palmetto/
中。
QEMU 编译步骤如下:
- git clone https://github.com/openbmc/qemu.git qemu_obmc
- sudo apt-get install libsdl2-2.0-0 libsdl2-dev
- cd qemu
- git submodule update —init dtc
- mkdir build
- cd build
- ../configure —target-list=arm-softmmu
- make
注意:可执行文件存放在编译目录下的arm-softmmu
中,因此启动 QEMU 时必须加上路径。
QEMU 配置和启动步骤如下:
- sudo apt-get install libvirt-dev libvirt-bin bridge-utils uml-utilities qemu-system-common
创建网桥配置文件, 注意文件路径和网口名与系统相关,
sudo mkdir -p /etc/qemu
sudo echo “allow virbr0” >> /etc/qemu/bridge.conf使用
brctl addif/delif <网桥名称> < 网口名称 >
命令调整网桥包含的网口并检查,正确配置如下所示$ brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.fec6883d4c52 yes tap0sudo arm-softmmu/qemu-system-arm -m 256 -M palmetto-bmc -nographic -drive file=~/code/openbmc/build/tmp/deploy/images/palmetto/flash-palmetto,format=raw,if=mtd -net nic,macaddr=C0:FF:EE:00:00:02,model=ftgmac100 -net bridge,id=net0,helper=/usr/lib/qemu/qemu-bridge-helper,br=virbr0
REST API 接口用法可参考OpenBMC REST cheat sheet:
- export bmc=root:0penBmc@xx.xx.xx.xx
查看接口
复位 Host
curl -b cjar -k -H “Content-Type: application/json” -X PUT -d ‘{“data”:”xyz.openbmc_project.State.Host.Transition.Reboot”}’ [https://![](https://g.yuque.com/gr/latex?%7Bbmc%7D%2Fxyz%2Fopenbmc%5C%5C%5C_project%2Fstate%2Fhost0%2Fattr%2FRequestedHostTransition%5D(https%3A%2F%2F#card=math&code=%7Bbmc%7D%2Fxyz%2Fopenbmc%5C%5C%5C_project%2Fstate%2Fhost0%2Fattr%2FRequestedHostTransition%5D%28https%3A%2F%2F&id=nQZBV){bmc}/xyz/openbmc_project/state/host0/attr/RequestedHostTransition)
复位 BMC
curl -b cjar -k -H “Content-Type: application/json” -X PUT -d ‘{“data”:”xyz.openbmc_project.State.BMC.Transition.Reboot”}’ [https://![](https://g.yuque.com/gr/latex?%7Bbmc%7D%2F%2Fxyz%2Fopenbmc%5C%5C%5C_project%2Fstate%2Fbmc0%2Fattr%2FRequestedBMCTransition%5D(https%3A%2F%2F#card=math&code=%7Bbmc%7D%2F%2Fxyz%2Fopenbmc%5C%5C%5C_project%2Fstate%2Fbmc0%2Fattr%2FRequestedBMCTransition%5D%28https%3A%2F%2F&id=xr0z9){bmc}//xyz/openbmc_project/state/bmc0/attr/RequestedBMCTransition)
Redfish 接口与 REST API 接口类似,用法可参考OpenBMC Redfish cheat sheet:
- export bmc=root:0penBmc@xx.xx.xx.xx
查询 root
建立连接
curl —insecure -X POST -D headers.txt [https://![](https://g.yuque.com/gr/latex?%7Bbmc%7D%2Fredfish%2Fv1%2FSessionService%2FSessions%5D(https%3A%2F%2F#card=math&code=%7Bbmc%7D%2Fredfish%2Fv1%2FSessionService%2FSessions%5D%28https%3A%2F%2F&id=WY7Es){bmc}/redfish/v1/SessionService/Sessions) -d ‘{“UserName”:”root”,”Password”:”0penBmc”}’
grep X-Auth-Token headers.txt
export bmc_token=查看对象
curl -k -H “X-Auth-Token:
{bmc}/redfish/v1/Chassis
IMPI 接口通常使用 ipmitool 访问,该工具支持部分命令补齐,帮助信息丰富:
- sudo apt-get install ipmitool
查看 Host 电源状态
ipmitool -I lanplus -H xx.xx.xx.xx -U root -P 0penBmc power status
列出 SDR(传感器数据记录)
ipmitool -I lanplus -H xx.xx.xx.xx -U root -P 0penBmc sdr list
2.2 u-bmc
u-bmc 是一个与 OpenBMC 并行开发但使用 gRPC 而不是 IPMI 的 BMC 固件开源项目。其中,gRPC 是 Google 主导开发的 RPC 框架,使用 HTTP/2 协议并用 ProtoBuf 作为序列化工具。
u-bmc 目的在于挑战行业现状,例如为人诟病的安全问题等。u-bmc 借鉴 OpenBMC 的代码并向其贡献代码。u-bmc 仍处于试验阶段,目前仅支持基于 ASPEED AST2400 的 BMC。
2.3 coreIPM
coreIPM 是一个开源的 IPMI BMC 管理框架,符合带有 PICMG 3.0 R2.0 AdvancedTCA 扩展的 IPMI v2.0 规范,可以监控传感器并提供记录和警报,实现电源控制和复位等。
coreIPM 支持 NXP LPC 系列 ARM 处理器和 TI AM335X 等,但 Github 代码仓库中最近一次更新已经是 2009 年 12 月。
一、开关机,重启
1. 查看开关机状态:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) power status
2. 开机:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) power on
3. 关机:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) power off
4. 重启:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) power reset
二、用户管理
说明:[ChannelNo] 字段是可选的,ChannoNo为1或者8;BMC默认有2个用户:user id为1的匿名用户,user id为2的ADMIN用户;<>字段为必选内容;<privilege level>:2为user权限,3为Operator权限,4为Administrator权限;
1. 查看用户信息:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) user list [ChannelNo]
2. 增加用户:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) user set name <user id> <username>
3. 设置密码:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) user set password <user id> <password>
4. 设置用户权限:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) user priv <user id> <privilege level> [ChannelNo]
5. 启用/禁用用户:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) user enable/disable <user id>
三、IP网络设置
说明:[ChannelNo] 字段是可选的,ChannoNo为1(Share Nic网络)或者8(BMC独立管理网络);设置网络参数,必须首先设置IP为静态,然后再进行其他设置;
1. 查看网络信息:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) lan print [ChannelNo]
2. 修改IP为静态还是DHCP模式:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) lan set <ChannelNo> ipsrc <static/dhcp>
3. 修改IP地址:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) lan set <ChannelNo> ipaddr <IPAddress>
4. 修改子网掩码:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) lan set <ChannelNo> netmask <NetMask>
5. 修改默认网关:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) lan set <ChannelNo> defgw ipaddr <默认网关>
四、SOL功能
说明:<9.6/19.2/38.4/57.6/115.2>其中115.2代表115200,即*1000是表示的波特率。
1. 设置SOL串口波特率:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) sol set volatile-bit-rate <9.6/19.2/38.4/57.6/115.2>
2. 打开SOL功能:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) sol activate
3. 关闭SOL功能:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) sol deactivate
五、SEL日志查看
1. 查看SEL日志:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) sel list
六、FRU信息查看
1. 查看FRU信息:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) fru list
七、SDR,Sensor信息查看
1. 查看SDR Sensor信息:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) sdr
2. 查看Sensor信息:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) sensor list
八、mc(管理单元BMC)状态和控制
1. 重启动BMC:
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) mc reset <warm/cold>
九、设置BMC的iptables防火墙
1. 设置某一段IP可以访问BMC
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) raw 0x32 0x76 0x01 0x01 ip1(0xa 0xa 0xa 0xa) ip2(0xb 0xb 0xb 0xb)
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) raw 0x32 0x76 0x09
2. 设置某个IP可以访问BMC
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) raw 0x32 0x76 0x00 0x01 ip1(0xa 0xa 0xa 0xa)
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) raw 0x32 0x76 0x09
3. 取消设置
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) raw 0x32 0x76 0x08
4.获取防火墙设置
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) raw 0x32 0x77 0x01 0x00
5. 阻止/开启某个端口
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) raw 0x32 0x76 0x02 0x00/0x01 0x00 (portno)0x22 0x00
6. 取消某个端口的设置(6是5的对应取消操作)
ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) raw 0x32 0x76 0x06 0x00/0x01 0x00 (portno)0x22 0x00