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 规范主体架构如下:

服务器BMC技术调研 - 图1

IPMI 主体架构

此外,为了提供更多的功能和更好的安全性,DMTF(分布式管理任务组)制定了基于浏览器 RESTful 插件和 JSON 数据格式的的安全可扩展数据中心管理标准Redfish API。英特尔也实现了 IPMI 2.0 的大数据中心扩展DCMI(Data Center Manageability Interface),基于 IPMI 接口但是最小化可选接口数量,并包括功率上限控制等其他不同。

1.2 BMC 简介

维基百科中BMC 定义如下:

基板管理控制器(BMC)提供 IPMI 架构中的智能特性。它是嵌入在计算机(通常是服务器)主板上的专用微控制器。 BMC 负责管理系统管理软件和平台硬件之间的接口。

服务器BMC技术调研 - 图2

维基百科 BMC 框图

根据 IPMI 规范,BMC 需要满足如下条件:

  • 实现 IMPI 必选命令;
  • 提供任一 BMC 访问接口;
  • 提供标准化的看门狗定时器接口和看门狗内部事件产生功能;
  • 提供可被其他主机组件使用的事件接收功能;
  • 提供可通过相应的 IPMI 必选命令访问的 SDR(传感器数据记录)仓库、SEL(系统事件记录)和 FRU(现场可替换单元)目录等功能;
  • 提供初始化代理功能以初始化 BMC 和其他管理控制器的传感器和事件产生组件。

简而言之,BMC 就是嵌入到服务器主板上的一块独立处理器,通过 IPMB、LPC(low-pin-count-interface)、SMBus 等各种接口收集与主机内部的其他软硬件组件进行通信,并通过网络、串行 / Moderm、PCI 等接口传向本地主机 / 远程服务器提供查询和控制功能。

典型的 BMC 系统如下所示:

服务器BMC技术调研 - 图3

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 介绍 - 简书进行尝试,共同讨论一下。

搭建和编译步骤如下:

  1. sudo apt-get install -y git build-essential libsdl1.2-dev texinfo gawk chrpath diffstat
  2. git clone https://github.com/openbmc/openbmc.git
  3. cd openbmc
  4. export TEMPLATECONF=meta-ibm/meta-palmetto/conf
  5. . openbmc-env
  6. bitbake obmc-phosphor-image

注意:image 存放在编译目录下的tmp/deploy/images/palmetto/中。

QEMU 编译步骤如下:

  1. git clone https://github.com/openbmc/qemu.git qemu_obmc
  2. sudo apt-get install libsdl2-2.0-0 libsdl2-dev
  3. cd qemu
  4. git submodule update —init dtc
  5. mkdir build
  6. cd build
  7. ../configure —target-list=arm-softmmu
  8. make

注意:可执行文件存放在编译目录下的arm-softmmu中,因此启动 QEMU 时必须加上路径。

QEMU 配置和启动步骤如下:

  1. sudo apt-get install libvirt-dev libvirt-bin bridge-utils uml-utilities qemu-system-common
  2. 创建网桥配置文件, 注意文件路径和网口名与系统相关,

    sudo mkdir -p /etc/qemu
    sudo echo “allow virbr0” >> /etc/qemu/bridge.conf

  3. 使用brctl addif/delif <网桥名称> < 网口名称 >命令调整网桥包含的网口并检查,正确配置如下所示

    $ brctl show
    bridge name bridge id STP enabled interfaces
    virbr0 8000.fec6883d4c52 yes tap0

  4. sudo 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:

  1. export bmc=root:0penBmc@xx.xx.xx.xx
  2. 查看接口

    curl -b cjar -k [https://![](https://g.yuque.com/gr/latex?%7Bbmc%7D%2Fxyz%2Fopenbmc%5C%5C%5C_project%2Flist%5D(https%3A%2F%2F#card=math&code=%7Bbmc%7D%2Fxyz%2Fopenbmc%5C%5C%5C_project%2Flist%5D%28https%3A%2F%2F&id=VADBW){bmc}/xyz/openbmc_project/list)

  3. 复位 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)

  4. 复位 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:

  1. export bmc=root:0penBmc@xx.xx.xx.xx
  2. 查询 root

    curl -b cjar -k [https://![](https://g.yuque.com/gr/latex?%7Bbmc%7D%2Fredfish%2Fv1%5D(https%3A%2F%2F#card=math&code=%7Bbmc%7D%2Fredfish%2Fv1%5D%28https%3A%2F%2F&id=Axx5H){bmc}/redfish/v1)

  3. 建立连接

    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=

  4. 查看对象

    curl -k -H “X-Auth-Token: 服务器BMC技术调研 - 图4
    {bmc}/redfish/v1/Chassis

IMPI 接口通常使用 ipmitool 访问,该工具支持部分命令补齐,帮助信息丰富:

  1. sudo apt-get install ipmitool
  2. 查看 Host 电源状态

    ipmitool -I lanplus -H xx.xx.xx.xx -U root -P 0penBmc power status

  3. 列出 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. 1. 查看开关机状态:
  2. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) power status
  3. 2. 开机:
  4. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) power on
  5. 3. 关机:
  6. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) power off
  7. 4. 重启:
  8. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) power reset

二、用户管理

  1. 说明:[ChannelNo] 字段是可选的,ChannoNo1或者8BMC默认有2个用户:user id1的匿名用户,user id2ADMIN用户;<>字段为必选内容;<privilege level>:2user权限,3Operator权限,4Administrator权限;
  2. 1. 查看用户信息:
  3. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) user list [ChannelNo]
  4. 2. 增加用户:
  5. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) user set name <user id> <username>
  6. 3. 设置密码:
  7. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) user set password <user id> <password>
  8. 4. 设置用户权限:
  9. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) user priv <user id> <privilege level> [ChannelNo]
  10. 5. 启用/禁用用户:
  11. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) user enable/disable <user id>

三、IP网络设置

  1. 说明:[ChannelNo] 字段是可选的,ChannoNo1(Share Nic网络)或者8BMC独立管理网络);设置网络参数,必须首先设置IP为静态,然后再进行其他设置;
  2. 1. 查看网络信息:
  3. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) lan print [ChannelNo]
  4. 2. 修改IP为静态还是DHCP模式:
  5. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) lan set <ChannelNo> ipsrc <static/dhcp>
  6. 3. 修改IP地址:
  7. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) lan set <ChannelNo> ipaddr <IPAddress>
  8. 4. 修改子网掩码:
  9. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) lan set <ChannelNo> netmask <NetMask>
  10. 5. 修改默认网关:
  11. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) lan set <ChannelNo> defgw ipaddr <默认网关>

四、SOL功能

  1. 说明:<9.6/19.2/38.4/57.6/115.2>其中115.2代表115200,即*1000是表示的波特率。
  2. 1. 设置SOL串口波特率:
  3. 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>
  4. 2. 打开SOL功能:
  5. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) sol activate
  6. 3. 关闭SOL功能:
  7. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) sol deactivate

五、SEL日志查看

  1. 1. 查看SEL日志:
  2. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) sel list

六、FRU信息查看

  1. 1. 查看FRU信息:
  2. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) fru list

七、SDR,Sensor信息查看

  1. 1. 查看SDR Sensor信息:
  2. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) sdr
  3. 2. 查看Sensor信息:
  4. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) sensor list

八、mc(管理单元BMC)状态和控制

  1. 1. 重启动BMC
  2. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) mc reset <warm/cold>

九、设置BMC的iptables防火墙

  1. 1. 设置某一段IP可以访问BMC
  2. 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)
  3. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) raw 0x32 0x76 0x09
  4. 2. 设置某个IP可以访问BMC
  5. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) raw 0x32 0x76 0x00 0x01 ip1(0xa 0xa 0xa 0xa)
  6. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) raw 0x32 0x76 0x09
  7. 3. 取消设置
  8. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) raw 0x32 0x76 0x08
  9. 4.获取防火墙设置
  10. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) raw 0x32 0x77 0x01 0x00
  11. 5. 阻止/开启某个端口
  12. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) raw 0x32 0x76 0x02 0x00/0x01 0x00 (portno)0x22 0x00
  13. 6. 取消某个端口的设置(65的对应取消操作)
  14. ipmitool H (BMC的管理IP地址) I lanplus U (BMC登录用户名) P (BMC 登录用户名的密码) raw 0x32 0x76 0x06 0x00/0x01 0x00 (portno)0x22 0x00


https://www.jianshu.com/p/e18de3800686