IPMI從驅動到應用(中篇)git
上篇咱們講到了IPMI底層硬件鏈接和內核裏驅動的實現,這樣就爲應用程序開發者提供了便利,用戶只須要利用標準的設備文件打開操做、調用享用的IOCTL就能夠向BMC發送請求或者讀取響應結果。算法
應用程序開發工程師除了使用這種方法外,還能夠利用現有開源的封裝了上述操做的代碼。目前開源的IPMI代碼主要有ipmitool和OpenIPMI。感興趣的讀者能夠用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.
OpenIPM和IPMI驅動的簡要模塊以下圖所示:
那麼該怎樣寫一個基於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或者錯誤出現的時候的響應函數;
創建鏈接:定義了地址設置、改變鏈接狀態、發送命令、添加和刪除事件處理函數、發送響應、處理器響應出錯等鏈接時可能出現的問題
初始化通訊接口:註冊smi和lan這兩個接口
初始化domain:domain是一個具備不一樣ID可是互聯到management controler的集合,爲何須要引進這個domain? 須要它來區別多mc系統中某個mc以及與之鏈接的各個entities (_ipmi_domain_init),它初始化mc_oem_handlers、domain_change_handlers、doma×××_list、oem_handlers
初始化mc:OpenIPMI基於狀態機來描述INACTIVE/ACTIVE/CLEAN UP等mc的狀態
初始化遠程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來初始化一些OEM的MC, 這些型號包括: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的庫和回調函數是怎麼回事?小編還會接着和你們分析,請持續關注。