(*如果之后架构有变,这边不会更新)

smbios-mdr 

GitHub - openbmc/smbios-mdrhttps://github.com/openbmc/smbios-mdr

MDR(Managed Data Region) 是 OpenBMC中取得SMBIOS Table并解析其内容的一个功能,目前网上(在没有特别帐号权限下)能找到的资料蛮少的,所以这边会尽量用公开资料做个分析 如果还不认识SMBIOS 可以先看之前写的文章

轻松搞懂SMBIOS-CSDN博客https://blog.csdn.net/yeiris/article/details/122775007先体会一下 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,负责机箱/机壳管理,可以参考英特尔机架规模设计(RSD,Rack Scale Design),当然,并不是所有伺服器都有CMM的存在,MDR的设计中是有包含CMM的,但是没有也没关系,等下会着重在BMC和BIOS的沟通

SMBIOS的传输

从BIOS传输SMBIOS给BMC目前有四个方式,分别是

  1. MDRv1 intel-ipmi-oem/smbioshandler.cpp · GitHub
  2. MDRv2 (Pull)   intel-ipmi-oem/smbiosmdrv2handler.cpp · GitHub
  3. MDRv2 (Push)   intel-ipmi-oem/smbiosmdrv2handler.cpp · GitHub
  4. 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"
	    }
	],
},
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐