IPMI从驱动到应用(中篇 )

IPMI从驱动到应用(中篇)git


上篇咱们讲到了IPMI底层硬件链接和内核里驱动的实现,这样就为应用程序开发者提供了便利,用户只须要利用标准的设备文件打开操做、调用享用的IOCTL就能够向BMC发送请求或者读取响应结果。算法


应用程序开发工程师除了使用这种方法外,还能够利用现有开源的封装了上述操做的代码。目前开源的IPMI代码主要有ipmitoolOpenIPMI。感兴趣的读者能够用git clone git://git.code.sf.net/p/ipmitool/source ipmitool-source下载ipmitool的源代码,能够用git clone git://git.code.sf.net/p/openipmi/code openipmi-code下载OpenIPMI代码。前者会编译出一个个符合IPMI规范的用户态的命令”ipmitoo”,它可以用来向BMC查询系统主板、风扇、电源、温度等状态信息。支持了不少参数,使用灵活,短小精悍。还能够用它的raw command格式发送不一样厂家本身定义实现的OEM命令,可以知足各类经常使用的场景。美中不足的是,它对OEM的系统事件日志的解析须要根据vendor定义的格式修改代码。此外,因为下面的几点缘由,BMC须要实现System management software(SMS)来按期检测系统状态:多线程

  • 过热或长期处于偏热的状态会减小硅上芯片的寿命;框架


  • 随着电容老化,系统会慢慢出错;dom


  • 风扇会随着使用年限慢慢出错;ide

  • 在器件出错前,应该采起预防性的措施防止出现灾难性的后果。函数

可是IPMI没有提供一套便于实现SMS的框架和接口,针对这个不足,OpenIPMI迎运而生。加密


OpenIPMI基于事件驱动模型,提供了回调和超时机制,封装了锁、多线程库和内存管理,隐藏了操做系统的区别,屏蔽了SMI(System Managment Interface)Lan接口、IPMB接口的使用差别,用户能够直接使用OpenIPMI库进行二次开发,专一于和BMC IPMI相关业务的模块和实现,不用再额外考虑太多锁、同步和事件驱动模型自己的设计,极大地提升了开发效率。OpenIPM中涉及到下面六个基本概念,理解这些概念是快速把握OpenIPMI的关键:spa

  • connection:  凡是BMC和外部模块链接的方式均可以叫做connection,好比smi/lan/IPMB操作系统

  • domain:   能够自动探测到的SDR/Sensors/FRU等的实体的集合;

  • Entities: 凡是能被检控的器件或者模块都叫作entity,可分为非固定位置的entity(好比机箱内的PSU/ambient)和固定位置的entity


  • sensors: 用来监控系统上的某个对象,可分为threshod sensor and discrete sensor,前者是连续值,经过跟与设定的阈值的比较来触发SEL或者设置起特殊的状态位;然后者是离散值,不一样的值表示不一样的状态,以电源为例子,它表示上电、掉电、出错、AC lost等状态;


  • Controls:包括点灯、中继、显示、报警、重启动、风扇转速、one-shot-reset,one-shot-outputs、标识符;


  • Events:系统事件一般由跟sensor/control/entity相连的事件回调函数处理。回调函数须要返回一个值,来标志该handler是否已经处理那个Event.


OpenIPMIPMI驱动的简要模块以下图所示: 

wKiom1X6r0mBa0zNAAGQx2xHWg8051.jpg


那么该怎样写一个基于OpenIPMI的程序?下面基于sample/dump_sensor.c进行分析,主要步骤以下:

1. allocate OS handler

Os handler 屏蔽了操做系统的差别,向OpenIPMI Library提供了统一的服务,以便实现事件驱动模型。这些服务包括:回调接口,超时计数器,条件变量(OpenIPMI不用)和锁和线程机制。

2.更新handler的相关设置,好比日志记录等;

3.初始化IPMI library. ipmi_init(os hanlder) 包括下面的步骤:

  • 创建起内存分配器

  • 定义了定制化的处理:在ipmi event/command/responce或者错误出现的时候的响应函数;

  • 创建链接:定义了地址设置、改变链接状态、发送命令、添加和删除事件处理函数、发送响应、处理器响应出错等链接时可能出现的问题

  • 初始化通讯接口:注册smilan这两个接口

  • 初始化domaindomain是一个具备不一样ID可是互联到management controler的集合,为何须要引进这个domain? 须要它来区别多mc系统中某个mc以及与之链接的各个entities (_ipmi_domain_init),它初始化mc_oem_handlersdomain_change_handlersdoma×××_listoem_handlers

  • 初始化mc:OpenIPMI基于状态机来描述INACTIVE/ACTIVE/CLEAN UPmc的状态

  • 初始化远程console;

  • 指定payload的加密算法:AES-CBC-128/ xRC4-128 /xRC4-40

  • 指定RMCP认证算法:HMAC-SHA1 integrity

  • 注册md5算法

  • 初始化FRU解码句柄

  • 注册FRU相关读写函数,读取FRU 原始数据

  • 初始化payload size for SOL

  • 根据manufactory_ID,Product_ID来初始化一些OEMMC, 这些型号包括:force_conn, motorala_mxp,intel,kontron,atca

  • 运行OEM Test

4.解析参数:ipmi_parse_args2: 接收用户的输入

5.创建起来链接:根据输入的参数创建起相应的链接

6. open domain并注册connection创建起来后执行的操做;

7.调用perform_one_op()来实现指定的操做。


开发者能够基于上面和sample目录下其余的例子来实现本身的功能,本人就基于demo程序实现了一个跟目标系统的库,使用起来很是方便。想知道我是怎么实现的吗?OpenIPMI的库和回调函数是怎么回事?小编还会接着和你们分析,请持续关注。

相关文章
相关标签/搜索