服务器BMC技术调研

作者: 古斟布衣 | 来源:发表于2019-03-13 11:20 被阅读4次

    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如下所示:

    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
    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://${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://${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://${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://${bmc}/redfish/v1

    3. 建立连接

      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>

    4. 查看对象

      curl -k -H "X-Auth-Token: bmc_token" -X GET https://{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. IPMI/BMC维基百科词条
    2. LPC(Low Pin Count)总线维基百科词条
    3. Intel IPMI主页(含标准)
    4. NC-SI维基百科词条
    5. IPMI/BMC百度百科词条
    6. IPMI简介
    7. IPMI SOL – Inexpensive Remote Console
    8. IPMI SOL使用
    9. IPMI 及Serial Over Lan(Sol)的实现
    10. KVM OVER IP百度百科词条
    11. 基于ARM的BMC设计与实现
    12. OpenBMC维基百科词条
    13. OpenBMC主页
    14. OpenBMC Github主页
    15. OpenBMC介绍 - 简书
    16. u-bmc主页
    17. u-bmc Github主页
    18. coreIPM主页
    19. coreIPM Google Code主页
    20. coreIPM Github代码克隆
    21. BMC、IPMI介绍
    22. AST2500 NC-SI功能调试
    23. DMTF Redfish主页
    24. Redfish白皮书
    25. DCMI v1.5规范

    相关文章

      网友评论

        本文标题:服务器BMC技术调研

        本文链接:https://www.haomeiwen.com/subject/iarzpqtx.html