1. 概述
1.1 IMPI 简介
1.2 BMC 简介
2. 开源方案
2.1 OpenBMC
2.1.1 概述
2.1.2 编译和运行
- 2.2 u-bmc
- 2.3 coreIPM
参考
1. 概述
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 典型架构
2. 开源方案
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 官方仓库 https://github.com/openbmc/openbmc 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 仓库 https://github.com/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 仓库主页 https://github.com/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 tap0
- 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:
export bmc=root:0penBmc@xx.xx.xx.xx
查看接口
curl -b cjar -k https://${bmc}/xyz/openbmc_project/list
复位 Host
curl -b cjar -k -H "Content-Type: application/json" -X PUT -d '{"data":"xyz.openbmc_project.State.Host.Transition.Reboot"}' https://${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://${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 -b cjar -k https://${bmc}/redfish/v1
建立连接
- curl --insecure -X POST -D headers.txt https://${
- bmc
- }/redfish/v1/SessionService/Sessions -d '{"UserName":"root","Password":"0penBmc"}'
- grep X-Auth-Token headers.txt
- export bmc_token=<X-Auth-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 月.
参考
IPMI/BMC 维基百科词条
LPC(Low Pin Count)总线维基百科词条 https://en.wikipedia.org/wiki/Low_Pin_Count
Intel IPMI 主页(含标准)
NC-SI 维基百科词条 https://en.wikipedia.org/wiki/NC-SI
IPMI/BMC 百度百科词条 https://baike.baidu.com/item/IPMI
IPMI 简介
IPMI SOL - Inexpensive Remote Console
IPMI SOL 使用
IPMI 及 Serial Over Lan(Sol)的实现
KVM OVER IP 百度百科词条 https://baike.baidu.com/item/KVM OVER IP
基于 ARM 的 BMC 设计与实现 http://www.docin.com/p-1326096700.html
OpenBMC 维基百科词条 https://en.wikipedia.org/wiki/OpenBMC
OpenBMC 主页 https://www.openbmc.org/
OpenBMC GitHub 主页 https://github.com/openbmc
OpenBMC 介绍 - 简书
u-bmc 主页 https://u-bmc.readthedocs.io/en/latest/
u-bmc GitHub 主页 https://github.com/u-root/u-bmc
coreIPM 主页 http://www.coreipm.com/
coreIPM Google Code 主页 https://code.google.com/archive/p/coreipm/
coreIPM GitHub 代码克隆
BMC,IPMI 介绍
AST2500 NC-SI 功能调试
DMTF Redfish 主页 https://www.dmtf.org/standards/redfish
Redfish 白皮书
DCMI v1.5 规范
来源: http://www.jianshu.com/p/e18de3800686