(*如果之後架構有變,這邊不會更新)GitHub - openbmc/smbios-mdr
MDR(Managed Data Region) 是 OpenBMC中取得SMBIOS Table並解析其內容的一個功能,目前網路上(在沒有特別帳號權限下)能找到的資料蠻少的,所以這邊會盡量用公開資料做個分析 如果還不認識SMBIOS 可以先看之前寫的文章
先體會一下 smbios-mdr 的結果,假如SMBIOS中有兩個Processor struct,表示Platform上有兩個CPU socket,透過 smbios-mdr 的運作後,最後我們可以從Redfish 的Processor Collection中看到兩顆CPU socket
> curl -k -H "X-Auth-Token: $token" -H "Content-Type: application/octet-stream" -X GET https://${bmcip}/redfish/v1/Systems/system/Processors
{
"@odata.id": "/redfish/v1/Systems/system/Processors",
"@odata.type": "#ProcessorCollection.ProcessorCollection",
"Members": [
{
"@odata.id": "/redfish/v1/Systems/system/Processors/cpu0"
},
{
"@odata.id": "/redfish/v1/Systems/system/Processors/cpu1"
}
],
"Members@odata.count": 2,
"Name": "Processor Collection"
}
簡單來說,BIOS將smbios table透過一些方式傳給BMC後,BMC呼叫dbus method "AgentSynchronizeData" ,smbios-mdr會去將smbios資料expose 到dbus上,供使用者讀取和操作
// github.com/openbmc/intel-ipmi-oem/blob/master/src/smbiosmdrv2handler.cpp
ipmi::RspType<> cmd_mdr2_data_done(uint16_t agentId, uint16_t lockHandle)
{
// ...
sdbusplus::message::message method = bus->new_method_call(
service.c_str(), mdrv2Path, mdrv2Interface, "AgentSynchronizeData");
// ...
}
// github.com/openbmc/smbios-mdr/blob/master/src/smbios-ipmi-blobs/handler.cpp
bool syncSmbiosData()
{
// ...
sdbusplus::message::message method =
bus.new_method_call(mdrV2Service, phosphor::smbios::mdrV2Path,
mdrV2Interface, "AgentSynchronizeData");
// ...
}
MDR(Managed Data Region)
MDR 是一種通用機制,用於管理韌體實體之間的數據傳輸並在 BMC 中維護伺服器數據。 目前,該數據由 BCT/SMBIOS 數據組成。 但將來可能會添加其他數據實體。
- CMM:Chassis Management Module
- BMC:Baseboard Management Controller
- BIOS:Basic Input/Output System
CMM通常是放在PDB上面的,會連接1~N的BMC,負責機箱/機殼管理,可以參考Intel機架規模設計(RSD,Rack Scale Design),當然,並不是所有伺服器都有CMM的存在,MDR的設計中是有包含CMM的,但是沒有也沒關係,等下會著重在BMC和BIOS的溝通
SMBIOS的傳輸
從BIOS傳輸SMBIOS給BMC目前有四個方式,分別是
- MDRv1 intel-ipmi-oem/smbioshandler.cpp · GitHub
- MDRv2 (Pull) intel-ipmi-oem/smbiosmdrv2handler.cpp · GitHub
- MDRv2 (Push) intel-ipmi-oem/smbiosmdrv2handler.cpp · GitHub
- IPMI blobs smbios-mdr/handler.cpp · GitHub
這四種方法最後都是將SMBIOS放到/var/lib/smbios底下,呼叫smbios-mdr去做解析並將資料放到dbus上,其中MDRV1 是BIOS透過指令將SMBIOS 慢慢送過去給BMC,MDR V2 則是BIOS將SMBIOS放到VGA share memory,BMC再去讀出來 ,只是會根據主動發送指令的是BMC還是BIOS分成Pull和Push兩種,最後IPMI Blobs的方式就是將SMBIOS視為一個Blobs傳送給BMC
CPU 資訊檢查
smbios-mdr 中還有另一個服務"xyz.openbmc_project.cpuinfo.service"。 它的作用是根據SMBIOS中的Processor Type和Entity manager的config文件,通過PIROM訪問CPU,確認CPU ID合法 ,如果沒有問題,才將CPU資訊曝光到dbus上
底下是Entity Manager Config的範例,Bus/Address記得改成主機板上CPU的對應資訊
# Entity Manager config / baseboard.json
{
"Address": "0x30",
"Bus": 0,
"CpuID": 1,
"Name": "CPU 1",
"PiromI2cAddress": "0x50",
"PiromI2cBus": 12,
"PresenceGpio": [
{
"Name": "CPU1_PRESENCE",
"Polarity": "Low"
}
],
},
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。