OpenBMC: Adding a New Machine

前言

此系列文是參考OpenBMC官方Youtube頻道的學習筆記,
相關投影片可以由OpenBMC GitHub的wiki頁面取得。

基礎知識

這邊假設讀者已經具備下面列出的一些基礎知識:

  1. BMC硬體:要執行BMC的硬體環境。
  2. Linux Kernel
  3. 嵌入式Linux開發 (C/C++程式語言)
  4. IPMI
  5. D-Bus
  6. Yocoto

Machine Layers

要建立新的機器,或者理解為開始一個新專案,需要先以組織為名稱建立專案庫(repository/repo)。
例如組織名稱”abc”即建立名稱為:meta-abc的repo。
可以提出要求將這個repo加入OpenBMC的mail列表(Mailing List)中,與其他開發者共享。

接著可以在這個repo中自行加入機器(Machine Layer),例如:meta-xyz代表加入名為xyz的機器。
所有與機器有關的配置(Configuration)與Recipe(可以理解為平台上要使用的功能或Package)都放在個別機器的目錄下。

根據機器需要,各別加入packagegroup,而每個機器可以針對不同的Recipe有自己特定的配置。

下圖是一個範例:

範例中在meta-xyz(Machine Layer)中的conf目錄下定義了機器的配置,其中bblayers.conf.sample定義了一些外部的Recipe路徑(Discovery Path)。

具體的配置檔在macine/xyz.conf目錄下,可以在這個檔案中進行機器相關的系統配置(例如baud rate等)。

接下來是一系列的Recipes Changes,每個應用功能都對應的一個Recipe,而在Recipes目錄下可以根據系統需求增加功能或覆蓋原先的設定。

舉例來說,如果想要修改Linux Kernel可以在”recipes-kernel”中加入”bbappend”檔案,然後在”xyz.cfg”中自行加入需要的配置。

Kernel Changes

因為每個平台(Platform)在硬體配置上可能有不同的設計,也可能需要使用不同的驅動程式(Driver),因此需要針對Linux Kernel的部分進行配置。
基本的像是裝置樹(Device Tree),需要在目錄:arch/arm/boot/dts進行修改,其名稱必需要是”aspeed-bmc-abc-xyz.dts”。
其他也可以根據需要新增自己的驅動程式。

此外也可能因應Linux Kernel的升級(更新),需要同步更新專案的Kernel。
OpenBMC使用Kernel的分歧為:linux-aspeed。
如果需要Patch修改到Linux Kernel官方(kernel.org),要加入openBMC的Mailing List。

基礎功能

Host Power Control

有兩個package負責控制與監控電源狀態。

  1. Phosphor-state-manage
    每一個操作(on/off/reset)需要有單獨的systemd,例如:obmc-chassis-poweroff@.target、obmc-chassis-poweron@.target等。

  2. x86-power-control
    主要針對Intel平台的電源控制,支援標準的操作(on/off/reset),也支援Redfish。
    他是利用libgpiod來實作,意思是需要在Kernel(Device Tree)中加入對應的GPIO設定,如果使用的名稱與標準的不一樣,可以透過配置檔將名稱傳入。
    預設使用的名稱為:POWER_OUT、RESET_OUT等。
    支援多個host,並且可以有個別的配置檔。

使用VIRTUAL-RUNTIME_obmc-host-state-manager來選擇要使用的package。

SoL (Serial over Lan)

SoL提供遠端管理者可以用來看到主系統(Host System)上的終端機(Console)。
要啟用SoL可以將套件obmc-console加入專案。

server.xx.conf可以用來進行配置要使用的UART Port,在Aspeed Chip上預設使用VUART Port。

系統起來的時候會帶起一個obmc-console-server daemon,接下來就可以使用客戶端(obmc-console.client)去存取這個service。

OpenBMC SoL也支援多個host在不同的UART Port上,不過要先設定enable-concurrent-servers這個flag,然後每個host需要加入自己各自的配置檔。

FRU

FRU其實就是一個Flash Memory,用來保存這個板子的資訊,包含Product Name、Part Number、Serial Number等。
並依照規範(IPMI)的格式來儲存這些資訊。

有兩個package與這個功能有關:

  1. ipmi-fru-parser(phosphor-ipmi-fru)
    這個package是用來修改讀取FRU的EEPROM路徑。

  2. Entity Manager
    這個package透過配置檔將一個FRU定義為一個一個fru-device的Entity,因此叫做Entity Manager。

他會將所有可讀取的EEPROM列出來,並且提供讀取操作,支援8bit與16bit的device,所有FRU device有提供D-Bus介面可以存取。

問答有提到,Entity Manager有支援動態增加,不過需要先在Device Tree做好預先配置。

Sensors

此部分影片漏講,剛好投影片被跳過,因此下面的內容單純從投影片整理。

兩個與Sensor相關的package

  1. phosphor-hwmon
    透過sensor配置檔指定每個sensor讀取的方式。

  2. dbus-sensors
    有不同的daemon來提供不同類型的sensor,例如:hwmon、fan、cpu、ipmb、與psu等。

透過D-Bus讀取配置檔,在執行期間(Runtime)時根據每個種類來偵測Sensor。

監控Sensor後會根據配置檔設定的threshold來判斷是否超標,所有Sensor需要在Entity Manager的配置檔中進行配置。

Fan Control

系統也會需要根據溫度Sensor的讀值來控制風扇轉速。

phosphor-fan-presence與phosphor-pid-control兩個package可以用來進行與風扇相關的配置,設定virtual-obmc-fan-mgmt來指定要使用的package。

phosphor-pid-control有兩種配置方法

  1. 透過Json檔
    以Json檔各別設定每個sensor與風扇轉速之間的控制關係。

  2. 透過Entity Manager
    需要設定enable-configure-dbus來指定使用Entity Manager,再自行加入風扇控制的設定檔。

IPMI (In Band)

IPMI是很基礎的功能,主要用來與BMC進行溝通。

主要的package是phosphor-host-ipmid,可以設定obmc-host-ipmi-hw為phosphor-ipmi-kcs或phosphor-ipmi-bt來
指定使用KCS或BT介面來與host溝通。

使用時需要對每個機器指定一個ID:recpise-phosphor/ipmi/phosphor-ipmi-config/dev_id.json

支援標準IPMI指令,如果需要增加自己的OEM指令,可以透過增加/修改ipmi-providers library,也可以覆寫(Override)標準的指令。
如果需要增加自己的OEM Library需要建立自己的repo。

這邊有幾個OEM Specific IPMI repo的例子:intel-ipmi-oem、fb-ipmi-oem

IPMB

另一個常見的介面是IPMB,可以加入phosphor-ipmi-ipmb來啟用。
支援”ipmb”與”ME”兩個通道(Channel)。

支援多個裝置共用ipmb/ME通道。

需要在Device Tree中為每個裝置加入ipmb-dev kernel driver,並為每個裝置加入設定檔:recipes-phosphor/ipmi/phosphor-ipmi-ipmb/ipmb-channels.json

FW Upgrade

根據不同支援的裝置啟用不同的package來啟用FW更新,例如:

  1. phosphor-psu-software-manager:PSU
  2. phosphor-software-manager:BMC/Host BIOS

建構(Build)完的印象檔(image)位置在:$(build)/tmp/deploy/image/$machine/*.mtd.tar
BIOS則需要透過工具(genBiosTar)進行轉換,預設轉換後的檔案名稱為:obmc-bios-tar.gz

不同的平台可能有不同的更新流程,例如要先操作GPIO或考慮如何分配Flash空間,這些可以透過obmc-flash-host-bios@.service檔案來設定執行對應的指令。

更新流程大至如下:

  1. 透過scp指令將印象檔放到BMC上(/tmp/images)。
  2. 之後系統會產生一個image ID(/tmp/images/xxxx)。
  3. 接下來執行:
    1
    2
    3
    busctl set-property xyz.openbmc_project.Software.BMC.pdater /xyz/openbmc_project/software/XXXX
    xyz.openbmc_project.Software.Activation RequestedActivation s
    xyz.openbmc_porject.Software.Activation.RequestedActivations.Active
  4. 若是更新BMC,最後需要進行重啟讓設定生效。

也可以透過Redfish指令進行更新:

1
curl -k -H "X-Auth-Token: $token" -H "Content-Type: application/octet-stream" -X POST -T <image> https://${bmc}/redfish/v1/UpdateService

Other Features

還有其他功能例如:

  1. Entity Manager
  2. Redfish
  3. IPMI(Out of Band)
  4. BMCWeb
  5. WebUI
  6. Network-manager
  7. GPIO Monitor
  8. SEL log
  9. Host console log
  10. NVME
  11. Post code management

Continuous Integration

利用CI可以早期將可能導致系統壞掉的commit發現並修正。
參考:https://github.com/openbmc/openbmc/wiki/Continuous-Integration

OpenBMC的建構腳本(Build Script)


OpenBMC: Adding a New Machine
https://chris-suo.github.io/ChrisComplete/2022/09/25/OpenBMC-Adding-A-New-Machine/
Author
Chris Suo
Posted on
September 25, 2022
Licensed under