伺服器BMC技術調研
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官方倉庫 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/qemusudo echo "allow virbr0" >> /etc/qemu/bridge.conf
- 使用
brctl addif/delif <網橋名稱> <網口名稱>
命令調整網橋包含的網口並檢查,正確配置如下所示$ brctl showbridge name bridge id STP enabled interfacesvirbr0 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:[email protected]
- 檢視介面
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:[email protected]
- 查詢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.txtexport 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)匯流排維基百科詞條
- Intel IPMI主頁(含標準)
- NC-SI維基百科詞條
- IPMI/BMC百度百科詞條
- IPMI簡介
- IPMI SOL – Inexpensive Remote Console
- IPMI SOL使用
- IPMI 及Serial Over Lan(Sol)的實現
- KVM OVER IP百度百科詞條
- 基於ARM的BMC設計與實現
- OpenBMC維基百科詞條
- OpenBMC主頁
- OpenBMC Github主頁
- OpenBMC介紹 - 簡書
- u-bmc主頁
- u-bmc Github主頁
- coreIPM主頁
- coreIPM Google Code主頁
- coreIPM Github程式碼克隆
- BMC、IPMI介紹
- AST2500 NC-SI功能除錯
- DMTF Redfish主頁
- Redfish白皮書
- DCMI v1.5規範