openbmc实现ipmi协议的守护进程是ipmid,该软件包已经实现了绝大多数的ipmi协议命令,但是仍然有部分命令没有完善或者没有实现,这些命令需要自己完善或者实现(可能新版本会增加完善部分命令)。本文主要说明原理和添加简单的命令,起抛转引玉的作用,想了解更多只能直接读源码phosphor-ipmi-hostd。
1 ipmi实现原理
ipmid是软件包生成的守护进程(软件包还会生成phosphor-softpoweroff应用软件,这里不做过多描述),也是可执行的应用程序,该软件包默认是一定安装到镜像的。ipmid在启动时会加载依赖的lib库,这里的lib库是指实现按照ipmi协议实现对应命令的lib库,比如libusercmds.so、libwhitelist.so等。这些lib库在“/usr/lib/ipmid-providers”路径下,该路径下的库是专门给ipmid程序启动时加载用。另外软件包还提供了通用的lib库和头文件,以提供接口注册ipmi命令等。
2 启动源码解读
2.1 main函数
ipmid入口文件是ipmid-new.cpp文件中,该main函数中通过调用“ipmi::loadProviders(HOST_IPMI_LIB_PATH)”加载“/usr/lib/ipmid-providers”下的lib库,然后调用lib库中函数,进而注册lib库中实现的ipmi协议中的命令,如果lib库出现错误会跳过继续调用下一个,如果错误严重会导致ipmid应用程序重启。(IpmiProvider结构体内有加载lib库的函数)
中间还会有一些其它过程,这里不考虑,在main函数最后会注册ipmi的DBus接口,以便于其他应用程序进行调