IPMI從驅動到應用(上篇)

    不少企業的核心業務大都運行在服務器繫上,一旦系統出現非預料的宕機,極可能形成數據出錯甚至丟失,這種狀況若是發生在金融和銀行系統上,將會形成不可估量的損失。爲此,有必要實時檢測服務器的健康狀態,包括風扇轉速、CPU和主板的溫度、核心電壓、電源模塊的狀態等,進而及時預報各類可能出現的錯誤。系統管理軟件(system managemnet software)就是爲了實現這一功能的,它依賴於各個廠家的主板和模塊的實現方式。爲了統一不一樣廠家的實現方法,1998年Intel、Dell、HP、NEC共同提出了IPMI 規範,用來監控溫度、電壓、風扇轉速和實現遠程控制。到2004年IPMI 規範已經發展到了2.0頒佈,而且普遍應用在各類服務器上,不一樣的廠家爲了實現額外的功能,大都都擴展了一些OEM的IPMI命令給用戶。這就極大地方便了系統管理軟件的設計和實現。

一個典型的IPMI的總的架構以下圖所示:linux

wKioL1X49ZTxH46tAANUQv_feQI521.jpg


經過上面的圖能夠看到 ,一個系統上可能有多個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)接口。服務器

wKioL1X49i_CtKXPAAC2aieFyZY117.jpg

Host和BMC之間經過LPC引腳直接鏈接。Host端的原理圖以下圖所示,其中最右側的一列信號來自於主機的LPC控制器。架構

wKiom1X49KChwP9wAAGW0xqZfg4632.jpg

3. 驅動的實現
    內核中IPMI驅動是分層實現的,最底層分別實現了基於Smbus、LPC的自動檢測、事物處理、結果讀取和清除的操做,並用這些函數初始化了抽象的system interface的對應的函數,從而屏蔽了底層硬件接口的區別。更上層的設備抽象和協議實現都是直接和抽象的system interface直接交互的。具體的說明能夠參考內核中的Documentation/IPMI.txt文檔,簡要的概括以下:
ipmi_smbus.ko: 實現對 IPMI management controller基於Smbus直接訪問的接口驅動;async


ipmi_ssif.ko: 在更早的內核版本里對應的名字就是 ipmi_smbus.ko,支持經過Smbus接口發送、接受信息;ide

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 看門狗計時器;blog


ipmi_poweroff.ko: 支持經過ipmi命令開關機的內核驅動。接口

相關文章
相關標籤/搜索