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的庫和回調函數是怎麼回事?小編還會接着和你們分析,請持續關注。

相關文章
相關標籤/搜索