IPMI从驱动到应用(下篇 )

继续上文的讲叙,在利用OpenIPMI现成的库和例子程序之前,我们需要理解OpenIPMI 代码的结构和OpenIPMI程序运行的过程和特点。

OpenIPMI的目的就是要屏蔽IPMI协议的细节,给用户提供快速实现SMS的框架和接口。因此,它内部替用户已经实现了IPMI协议里提到的各种类型(数据结构),比如sensor,sdr,sel,mc,sel,entity等等,同时使用面向对象的思想,提供了很多查询和设置这些数据结构的方法。当然,为了屏蔽不同平台和接口的差别,OpenIPMI自己在用户层封装了一层timer机制、锁同步机制。此外,为了向用户提供统一的操作方法,OpenIPMI自定义了一些额外的数据结构,比如domain,connection等等。结合文档和原代码的分析,我们可以看到OpenIPMI的数据结构比较多,相互关联比较复杂:

通过上面的图,我们可以看到最中间的ipmi_domain_t,它关联了和BMC本身相关的mc,sdr,sensor,entity等数据结构,这些成员都是在这个域建立起来后需要初始化的。在上面图最左上侧的os_handler_s数据结构,就是对不同的内存管理、timer机制的封装。而它下面的ipmi_con_s数据结构就是对BMC不同的接口比如KCS/Lan/IPMB的封装,以向用户提供统一的命令发送、链路建立的接口。和BMC本身相关的数据结构主要有ipmi_mc_s,它囊括了SEL/SDR/Sensor/Control信息以及处理OEM差异的函数,而SEL/SDR/Sensor/Control等信息数据又和相应的实体结构对应,每个实体结构包括真实的物理信息,OpenIPMI为此提供了许多设置和查询的操作。以ipmi_sensor_s为例子,它本身包括Lun/ Sensor number等基本信息,OpenIPMI又提供了对它的许多操作:

||      ipmi_sensor_convert_from_raw
||     stand_ipmi_sensor_convert_to_raw
||     stand_ipmi_sensor_get_tolerance
||     stand_ipmi_sensor_get_accuracy
||     stand_ipmi_sensor_reading_name_string
||     ipmi_sensor_get_callbacks
||     ipmi_sensor_set_callbacks
||     ipmi_sensor_set_event_enables
||     ipmi_sensor_enable_events
||     ipmi_sensor_disable_events
||     ipmi_sensor_rearm
||     ipmi_sensor_get_event_enables
||     ipmi_sensor_get_hysteresis
||     ipmi_sensor_set_hysteresis
||     ipmi_sensor_get_thresholds
||     ipmi_sensor_set_thresholds
||     ipmi_sensor_get_reading
||     ipmi_sensor_get_states

用户只需要利用OpenIPMI提供的机制按照函数定义的格式正确调用就能快速高效构建自己的SMS。比如我们需要每隔5秒钟检查系统上的所有sensor的读值是否超出阈值,可以利用OpenIPMI已经提供好的timer机制、回调机制和现成的函数接口实现即可。具体的过程如下:
1. 执行框架代码:建立起来统一的os handler,初始化IPMI 库,关联connection和os handler, open一个domain,同时指定额外的初始化函数;
2. 初始化timer:OpenIPM提供的timer相当于定时触发器,每隔一段时间和它关联的进程就会执行一次。 具体而言,需要先初始化一个timeval和os_hnd_timer_id_t的数据结构,设置超时间隔,指定超时后执行的函数。这里指定扫描系统所有sensor的函数作为超时后执行的函数。然后通过os handler启动定时器。这样设置完成后,一旦定时器超时,指定的函数就会执行 。但需要注意的是,由于定时器超时后不会再自动启动,这个函数只会执行一次 。为了让指定的函数周期地按照固定的间隔执行,需要利用线程。
3.通过os handler调用creat_thread创建一个线程 ,在线程里面执行OpenIPMI事件驱动模型的主要循环,这个循环里面就包括重启定时器。
4. 利用OpenIPMI的回调机制实现sensor扫描:首先在超时后执行的函数里面调用枚举sensor的函数:
  ipmi_entity_iterate_sensors(myentity, iterate_sensor, NULL);
注意这个函数的第二个参数是需要用户自定义的回调函数,它有固定的参数格式:
  static iterate_sensor(ipmi_entity_t *ent, ipmi_sensor_t *sensor, void * b_data)
特别需要强调的是,并不是ipmi_entity_interate_sensors()函数执行完了后,马上就会执行到了iterate_sensor,从前者都后者在OpenIPMI内部又经历了三四层的回调,并且当执行到后者时,它的前面两个参数刚好指向当前遍历的sensor的ipmi_entity_t 和 ipmi_sensor_t结构,这样用户根据需要直接访问这俩参数就可以了。至于底层如何从/dev/ipmi0设备通过IOCTL发送IPMI sensor reading请求并读取响应值,OpenIPMI都已经处理好,用户不需要再操心。类似的,如果用户需要遍历所有的entity,调用ipmi_domain_iterate_entities()函数并实现对应的handle_entity()回调函数就可以。值得注意的是,用户可以通过枚举函数ipmi_domain_iterate_xxxx的第三个参数 void * cb_data向回调函数传递参数,但是回调函数不能想上层带回信息。
5. 调用OpenIPMI提供的函数来查询sensor的状态:OpenIPMI提供了大量的设置sensor和查询sensor的函数,比如ipmi_is_state_set()、ipmi_set_initial_update_in_progress()等。用户可以直接调用这些函数来检查某些状态位或阈值位是否已经设置。

根据上面的分析我们不难看到,借助OpenIPMI提供的timer方法、回调机制和提供的诸多接口,用户不再需要对驱动、IPMI协议有详尽了解,甚至也不用开发任何访问BMC的函数,就可以快速构建自己的SMS,这在产品更新换代日益加快的今天,无疑将会大大提高生产效率,加快产品上线进度。

时间: 2024-10-11 17:42:38

IPMI从驱动到应用(下篇 )的相关文章

IPMI从驱动到应用(中篇 )

IPMI从驱动到应用(中篇) 上篇我们讲到了IPMI底层硬件连接和内核里驱动的实现,这样就为应用程序开发者提供了便利,用户只需要利用标准的设备文件打开操作.调用享用的IOCTL就可以向BMC发送请求或者读取响应结果. 应用程序开发工程师除了使用这种方法外,还可以利用现有开源的封装了上述操作的代码.目前开源的IPMI代码主要有ipmitool和OpenIPMI.感兴趣的读者可以用git clone git://git.code.sf.net/p/ipmitool/source ipmitool-s

IPMI从驱动到应用(上篇)

很多企业的核心业务大都运行在服务器系上,一旦系统出现非预料的宕机,很可能造成数据出错甚至丢失,这种情况如果发生在金融和银行系统上,将会造成不可估量的损失.为此,有必要实时检测服务器的健康状态,包括风扇转速.CPU和主板的温度.核心电压.电源模块的状态等,进而及时预报各种可能出现的错误.系统管理软件(system managemnet software)就是为了实现这一功能的,它依赖于各个厂家的主板和模块的实现方式.为了统一不同厂家的实现方法,1998年Intel.Dell.HP.NEC共同提出了

android系统平台显示驱动开发简要:LCD基本原理篇『一』

平台信息:内核:linux3.4.39系统:android4.4 平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新浪博客:http://weibo.com/cpjphone 从在校时玩单片机的点阵屏,到工作后android系统下的LCD,他们像一条流水线,顺应,简单的原理构成了复杂的结构: 我们来梳理一下: 玩51用的点阵 玩51用的lcd1602 玩51.32用的TFT彩屏 对于点阵的原理相比大多数朋友都非常熟悉,

LabVIEW 吸星大法 - 看见的好东西都是我的(下篇)

前言 写了多年的LabVIEW程序,你是否面临这样的问题 总是在做一些重复的工作,感觉很没有意思: 总在不停的写代码,做类似的控件,实现相同的功能,丝毫没有成就感: 总在天加班,没有时间去提高自己; 你也知道简单的重复并不能带来效率的提高,却不知道走向何方,无奈而又焦急着? 小黑今天带你聊一聊LabVIEW吸星大法,让你在工作中越来越有效率,体会一切皆可掌控的妙感~ 记住,我们的口号是 : 告别重复造车,你的就是我的,万物皆为我所用~ 引言 经过了前两篇的介绍,相信接触LabVIEW你已经了解一

Linux摄像头驱动学习之:(一)V4L2_框架分析

这段时间开始搞安卓camera底层驱动了,把以前的的Linux视频驱动回顾一下,本篇主要概述一下vfl2(video for linux 2). 一. V4L2框架: video for linux version 2虚拟视频驱动vivi.c分析:1.分配video_device2.设置3.注册:video_register_device vivi_init    vivi_create_instance        v4l2_device_register   // 不是主要, 只是用于初始

Linux下spi驱动开发

转载至:http://www.embedu.org/Column/Column367.htm 作者:刘洪涛,华清远见嵌入式学院讲师. 一.概述 基于子系统去开发驱动程序已经是linux内核中普遍的做法了.前面写过基于I2C子系 统的驱动开发.本文介绍另外一种常用总线SPI的开发方法.SPI子系统的开发和I2C有很多的相似性,大家可以对比学习.本主题分为两个部分叙述,第一 部分介绍基于SPI子系统开发的理论框架:第二部分以华清远见教学平台FS_S5PC100上的M25P10芯片为例(内核版本2.6

使用 ipmitool 实现 Linux 系统下对服务器的 ipmi 管理

http://www.ibm.com/developerworks/cn/linux/l-ipmi/ 1.简介 IPMI(Intelligent Platform Management Interface)即智能平台管理接口是使硬件管理具备“智能化”的新一代通用接口标准.用户可以利用 IPMI 监视服务器的物理特征,如温度.电压.电扇工作状态.电源供应以及机箱入侵等.Ipmi 最大的优势在于它是独立于 CPU BIOS 和 OS 的,所以用户无论在开机还是关机的状态下,只要接通电源就可以实现对服

dell R710 开机提示iDRAC6 Communication Failure   IPMI

最近公司电路要做检修,需要把服务器停机,其中一台R710机器,开机报错 intializing Remote Access Controller........ iDRAC6 Communication Failure, rebooting 自动重启,重启后初始化,等待时间许久,失败 提示按F1跳过,再启动ESXi5 系统启动到检测IPMI时,卡住 好好的机器出现这个,有点奇怪,尝试给服务器放静电,拨掉电源,按开机键,等上一两分钟 再开机,正常启动了 顺便在网上找了下ESXi屏蔽IPMI的方式,

第1个linux驱动___打印"hello world"

为了方便后续的深入,我们在驱动程序中用printk( )函数来打印"hello world",printk( )是内核中自带的函数,专门用于在打印内核信息. 在安装驱动模块到内核中的时,需要进行驱动模块的初始化,初始化具体做什么我们先不提,我们暂时只用printk( )打印"hello world": int first_drv_init(void) { printk("hello world!\n"); return 0; } · 关于prin