IPMI从驱动到应用(上篇)

很多企业的核心业务大都运行在服务器系上,一旦系统出现非预料的宕机,很可能造成数据出错甚至丢失,这种情况如果发生在金融和银行系统上,将会造成不可估量的损失。为此,有必要实时检测服务器的健康状态,包括风扇转速、CPU和主板的温度、核心电压、电源模块的状态等,进而及时预报各种可能出现的错误。系统管理软件(system managemnet software)就是为了实现这一功能的,它依赖于各个厂家的主板和模块的实现方式。为了统一不同厂家的实现方法,1998年Intel、Dell、HP、NEC共同提出了IPMI 规范,用来监控温度、电压、风扇转速和实现远程控制。到2004年IPMI 规范已经发展到了2.0颁布,并且广泛应用在各种服务器上,不同的厂家为了实现额外的功能,大都都扩展了一些OEM的IPMI命令给用户。这就极大地方便了系统管理软件的设计和实现。

一个典型的IPMI的总的架构如下图所示:

通过上面的图可以看到 ,一个系统上可能有多个BMC,BMC上可以连接一些非智能的卡或者sensor,这些器件和 BMC以及BMC之间通过IPMB连接。和BMC通信的接口的包括Smbus、PCIE、USB和LPC。I2C在早期的系统上用得比较普遍 ,PCIE常用作KVM,而USB多用于固件升级,LPC接口最常见。BMC和 主机之间的接口叫作system management interface(简称system interface或si)。传统的BMC的system interface包括:
KCS:最常用的接口 ,物理层基于LPC协议,实现了 8742 KCS  interface,后文的System interface默认就是LPC接口
SMIC (system management interface chip):用在没有内建的KCS/LPC控制器的BMC上,有三个IO Port,可基于ASIC/FPGA实现。
BT接口: 速度和性能最好的接口,需要握手,同样可基于ASIC/FPGA实现3个IO port,可用于定制化的BMC上。

2.System  Interface接口
    LPC的全称是Low Pin Count interface,它通过CLK信号LFRAM和复用的AD信号来实现类似PCI协议的多种操作,包括IO Read/Write,Memory Read/Write, Sync,TAR,按照下面的时序执行各种操作,进而实现上层的KCS (keyboard control style)接口。

Host和BMC之间通过LPC引脚直接连接。Host端的原理图如下图所示,其中最右侧的一列信号来自于主机的LPC控制器。

3. 驱动的实现
    内核中IPMI驱动是分层实现的,最底层分别实现了基于Smbus、LPC的自动检测、事物处理、结果读取和清除的操作,并用这些函数初始化了抽象的system interface的对应的函数,从而屏蔽了底层硬件接口的区别。更上层的设备抽象和协议实现都是直接和抽象的system interface直接交互的。具体的说明可以参考内核中的Documentation/IPMI.txt文档,简要的归纳如下:
ipmi_smbus.ko: 实现对 IPMI management controller基于Smbus直接访问的接口驱动;

ipmi_ssif.ko: 在更早的内核版本里对应的名字就是 ipmi_smbus.ko,支持通过Smbus接口发送、接受信息;

ipmi_si.ko: 屏蔽了不同系统接口的驱动,支持KCS/SMIC/BT,除非host 和BMC之间使用Smbus或者其他定制化的接口,否则都需要这一标准驱动;定义了probe BMC的三种方法:ACPI/SMBIOS(DMI)/PCI (class type);

ipmi_msghandler.ko: 内核用它来实现IPMI协议规范 ,它注册了 IPMI驱动;

ipmi_devintf.ko: provides a userland IOCTL interface for the IPMI driver,每一个打开的文件都都对应到一个消息处理句柄。定义了 /dev/ipmi0对应的ioctl/open/release/fasync/poll/llseek的操作,给应用层程序提供了fs接口。其中ioctl的操作类型包括:
    IPMICTL_SEND_COMMAND,IPMICTL_SEND_COMMAND,IPMICTL_RECEIVE_MSG和          IPMICTL_RECEIVE_MSG_TRUNC。应用程序就是通过打开/dev/ipmi0或者/dev/ipmi0并调用各种IOCTL来实现和BMC的通信的;

ipmi_watchdog.ko:向上层用户提供一个标准的linux 看门狗计时器;

ipmi_poweroff.ko: 支持通过ipmi命令开关机的内核驱动。

时间: 2024-10-16 20:07:05

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

IPMI从驱动到应用(中篇 )

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

IPMI从驱动到应用(下篇 )

继续上文的讲叙,在利用OpenIPMI现成的库和例子程序之前,我们需要理解OpenIPMI 代码的结构和OpenIPMI程序运行的过程和特点. OpenIPMI的目的就是要屏蔽IPMI协议的细节,给用户提供快速实现SMS的框架和接口.因此,它内部替用户已经实现了IPMI协议里提到的各种类型(数据结构),比如sensor,sdr,sel,mc,sel,entity等等,同时使用面向对象的思想,提供了很多查询和设置这些数据结构的方法.当然,为了屏蔽不同平台和接口的差别,OpenIPMI自己在用户层封

领域驱动设计实践上篇

一.前言 领域驱动设计的概念最早是由著名的建模专家Eric Evans在2004年发表的著名书籍 Domain-Driven Design –Tackling Complexity in the Heart of Software(中文译名:领域驱动设计 2006年3月清华出版社译本,或称 Domain Driven-Design architecture [Evans DDD]).园子里有很多人早已将其实践并应用,关于其要素.特点不再赘述,很多人在技术选型时想用它但又怕驾驭不了它,无非是没有真

领域驱动设计实践上篇(转)

http://www.cnblogs.com/idoudou/p/Domain-driven-design-Part1.html 一.前言 领域驱动设计的概念最早是由著名的建模专家Eric Evans在2004年发表的著名书籍 Domain-Driven Design –Tackling Complexity in the Heart of Software(中文译名:领域驱动设计 2006年3月清华出版社译本,或称 Domain Driven-Design architecture [Evan

I2C从驱动到应用(上篇)

I2C(Intel-Integrated Circuit)总线是由Phliphs公司开发的一种两线式串行总线,用于连接外围设备和微控制器.应用非常广泛,可以用在连接E2ROM来保存各种接口卡.显示器上的ROM信息 ,也可以用在BMC上来连接各种温度.电压.电流等传感器,还可以用来连接内存条DIMM上,用来获取内存条的信息.Smbus兼容i2c,虽然信号引脚定义上有出入,但从软件的角度上基本上可以视作I2C,I2C的应用几乎不要任何修改就可以运行在Smbus上. 硬件上I2C只有两个信号线,数据线

基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4

使用 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的方式,

tty初探—uart驱动框架分析(二)uart_add_one_port

在前面的一篇文章中,我们分析了一个 uart_driver 的向上注册过程,主要是 tty 的一些东西,知道了 tty 注册了一个字符设备驱动,我们在用户空间 open 时将调用到 uart_port.ops.startup ,在用户空间 write 则调用 uart_port.ops.start_tx ,还知道了如何 read 数据等等.但是,这些都是内核帮我们实现好的,在真正的驱动开发过程中几乎不涉及那些代码的修改移植工作,真正需要我们触碰的是 uart_port 这个结构体,它真正的对应于