OpenBMC: Adding a New Machine
前言
此系列文是參考OpenBMC官方Youtube頻道的學習筆記,
相關投影片可以由OpenBMC GitHub的wiki頁面取得。
基礎知識
這邊假設讀者已經具備下面列出的一些基礎知識:
- BMC硬體:要執行BMC的硬體環境。
- Linux Kernel
- 嵌入式Linux開發 (C/C++程式語言)
- IPMI
- D-Bus
- 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負責控制與監控電源狀態。
Phosphor-state-manage
每一個操作(on/off/reset)需要有單獨的systemd,例如:obmc-chassis-poweroff@.target、obmc-chassis-poweron@.target等。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與這個功能有關:
ipmi-fru-parser(phosphor-ipmi-fru)
這個package是用來修改讀取FRU的EEPROM路徑。Entity Manager
這個package透過配置檔將一個FRU定義為一個一個fru-device的Entity,因此叫做Entity Manager。
他會將所有可讀取的EEPROM列出來,並且提供讀取操作,支援8bit與16bit的device,所有FRU device有提供D-Bus介面可以存取。
問答有提到,Entity Manager有支援動態增加,不過需要先在Device Tree做好預先配置。
Sensors
此部分影片漏講,剛好投影片被跳過,因此下面的內容單純從投影片整理。
兩個與Sensor相關的package
phosphor-hwmon
透過sensor配置檔指定每個sensor讀取的方式。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有兩種配置方法
透過Json檔
以Json檔各別設定每個sensor與風扇轉速之間的控制關係。透過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更新,例如:
- phosphor-psu-software-manager:PSU
- 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檔案來設定執行對應的指令。
更新流程大至如下:
- 透過scp指令將印象檔放到BMC上(/tmp/images)。
- 之後系統會產生一個image ID(/tmp/images/xxxx)。
- 接下來執行:
1
2
3busctl 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 - 若是更新BMC,最後需要進行重啟讓設定生效。
也可以透過Redfish指令進行更新:
1 |
|
Other Features
還有其他功能例如:
- Entity Manager
- Redfish
- IPMI(Out of Band)
- BMCWeb
- WebUI
- Network-manager
- GPIO Monitor
- SEL log
- Host console log
- NVME
- Post code management
Continuous Integration
利用CI可以早期將可能導致系統壞掉的commit發現並修正。
參考:https://github.com/openbmc/openbmc/wiki/Continuous-Integration
OpenBMC的建構腳本(Build Script)