汪 濤
(江蘇卓易信息科技股份有限公司 江蘇 無錫 214206)
紅魚是一種基于HTTPs 服務(wù)的服務(wù)器BMC 管理標(biāo)準(zhǔn),已經(jīng)逐步成為業(yè)界新的服務(wù)器BMC 標(biāo)準(zhǔn)[1]。在紅魚標(biāo)準(zhǔn)推出之前,IPMI 是受到廣泛支持的行業(yè)標(biāo)準(zhǔn),但I(xiàn)PMI 已有近20 年歷史,最后的更新還是在2004 年,已無法滿足當(dāng)今BMC 對功能和安全的需求[2]。在傳統(tǒng)的服務(wù)器上,BIOS 和BMC通常會通過KCS協(xié)議使用IPMI來實現(xiàn)通訊和數(shù)據(jù)傳輸,這種方式存在的問題是傳輸速度慢,并且沒有一個統(tǒng)一的標(biāo)準(zhǔn),導(dǎo)致每一家BMC/BIOS 供應(yīng)商都定義了自己的格式。
本設(shè)計采用USB 作為傳輸通道,可極大提高傳輸速度,另外USB 支持大容量存儲(MASS STORAGE)方式,可以讓BIOS/BMC 以直接讀寫文件的方式使用USB,而采用標(biāo)準(zhǔn)紅魚JSON 格式作為BIOS 和BMC 交互的格式,BMC 的Web 界面可以對BIOS 的所有配置參數(shù)做修改,而且可以直接支持紅魚規(guī)范的BIOS 接口。
當(dāng)前主流服務(wù)器BIOS 一般采用統(tǒng)一的可擴(kuò)展固件接口(Unified Extensible Firmware Interface,UEFI)。UEFI是用于取代和擴(kuò)展舊的BIOS 固件的,它和BIOS 的主要區(qū)別之一是傳統(tǒng)BIOS 大多使用匯編寫成,而UEFI 的代碼99%以上是C 語言,并且充分利用新的模塊化的思想,采用了DRIVER/PROTOCOL 的新方式,UEFI 系統(tǒng)從加電到關(guān)機(jī)一般分為7 個階段[3]:SEC(安全驗證)->PEI(EFI 前期初始化)->DXE(驅(qū)動執(zhí)行環(huán)境)->BDS(啟動設(shè)備選擇)->TSL(操作系統(tǒng)加載前期)->RT(Run Time)->AL(系統(tǒng)災(zāi)難恢復(fù)期)。
本設(shè)計實現(xiàn)主要在BIOS 的DXE 和BDS 階段[4]。
為了實現(xiàn)BIOS 和BMC 之間紅魚接口,需要BIOS 和BMC 兩者配合,BIOS 在系統(tǒng)啟動階段需要實現(xiàn)的操作可大致分為下面5 個步驟。
(1)在BIOS 啟動進(jìn)入DXE 階段后,BIOS 首先發(fā)送IPMI 命令OPEN_USB_KEY 給BMC,通知BMC 準(zhǔn)備USB KEY,發(fā)送完這個命令之后,BIOS 并不等待BMC 返回的結(jié)果,而是繼續(xù)執(zhí)行正常啟動過程中的任務(wù)。
(2)當(dāng)BIOS 進(jìn)入BDS 階段時,BIOS 發(fā)送IPMI 命令QUERY_USB_KEY 給BMC,查詢USB KEY 是否已經(jīng)準(zhǔn)備就緒,如果USB KEY 已經(jīng)準(zhǔn)備就緒,BIOS 將執(zhí)行下一步操作;否則BIOS 會等待100ms 后繼續(xù)嘗試查詢USB KEY,重復(fù)此動作50 次之后(即總的等待時間是5S,主要是大部分系統(tǒng)對啟動時間有要求),如果USB KEY 還是沒有準(zhǔn)備就緒,BIOS 將進(jìn)行錯誤處理,然后執(zhí)行其他啟動任務(wù)。
(3)BIOS 在獲知USB KET 已經(jīng)準(zhǔn)備就緒,開始連接USB 設(shè)備,連接成功則進(jìn)行下一步操作。
(4)BIOS 讀 取BiosSettings.json 以 及Bios AttributeRegistry.json 文件[5],將配置生效。
(5)如果用戶沒有進(jìn)入BIOS 配置界面進(jìn)行配置修改,BIOS 把從BMC 獲取的配置生效后會立即重啟BIOS,否則BIOS 把新的BiosSettings.json 以及BiosAttributeRegistry.json 寫回USB 磁盤,發(fā)送IPMI命令CLOSE_USB_KEY 給BMC,最后BIOS 重啟自身。
上述操作流程見圖1。
上面步驟中第4 步中BIOS 獲取到配置文件之后需要判斷是否有需要更新的數(shù)據(jù),如果有待更新配置,需要判斷執(zhí)行相應(yīng)的操作,包括:是否需要更新密碼,是否需要恢復(fù)默認(rèn)配置,是否需要重置BIOS,是否上報BIOS配置等,具體流程見圖2。
在服務(wù)器運(yùn)行過程中,BMC 在服務(wù)器交流電(Alternating Current,AC)上電時就開始啟動運(yùn)行,而BIOS 需要在直流電(Direct Current,DC)上電時(通常是用戶按下啟動按鈕或者遠(yuǎn)程發(fā)送啟動命令給服務(wù)器)才會啟動,BMC 端無法主動發(fā)送IPMI 命令,但需要實現(xiàn)響應(yīng)BIOS 的3 個IPMI 命令。
2.1.1 OPEN_USB_KEY 命令
BMC 在收到OPEN_USB_KEY 之后需要實現(xiàn)下列操作。
(1)創(chuàng)建RAM 下的磁盤文件,并格式化成FAT16 格式,由于RAM 磁盤實際需要占用BMC 的內(nèi)存,所以不宜設(shè)置太大,通常設(shè)置5 ~10 M,本方案基于Yocto[6]和OpenBMC[7]實現(xiàn),默認(rèn)BMC 文件系統(tǒng)使用的BusyBox[8]中的mkfs.fat 只支持生成FAT32 格式,需要修改mkfs.fat源碼以支持FAT16 格式[9]。
(2)利用USB Gadget ConfigFS 掛載磁盤文件,類似插入了一個U 盤[10]。
(3)從配置目錄/var/lib/bios-settings-json/下面拷入BIOS 當(dāng)前的JSON 配置文件。
2.1.2 QUERY_USB_KEY 命令
BMC 在收到QUERY_USB_KEY 之后需要判斷USB_KEY 是否已經(jīng)準(zhǔn)備好,把結(jié)果返回給BIOS。
2.1.3 CLOSE_USB_KEY 命令
BMC 在收到CLOSE_USB_KEY 之后會做如下動作。
(1)把USB 磁盤上的BIOS 配置文件更新到/var/lib/bios-settings-json/目錄下。
(2)卸載磁盤文件。BMC 端可以通過一個shell 腳本實現(xiàn)對usb key 的掛載以及文件的復(fù)制移動[11]。
BIOS 和BMC 通訊定義的OEM IPMI 命令格式見表1,BIOS 每次啟動的時候都會發(fā)送這個OEM 命令給BMC,這個命令被限制為僅供KCS 接口通信。
表1 Redfish OEM IPMI 命令
BMC 提供Web頁面可以讓用戶修改BIOS 配置, 進(jìn)入BIOS 的配置頁面,BMC Web 后端會將BiosAttributeRegistry.json 和BiosSettings.json 合并成一個JSON 字符串,傳遞給前端,前端根據(jù)JSON 字符串動態(tài)生成界面,并可以提供SetBiosCurrentSettings.cgi 提供修改功能,修改界面見圖3。
其中BiosSettings.json 中定義了某個BIOS 屬性的當(dāng)前值,譬如以BIOS啟動模式舉例,即“BootMode”:“Uefi”。
當(dāng)前的啟動模式為UEFI 模式, 與之對應(yīng)的BiosAttributeRegistry.json 中定義了BootMode 的屬性和可能的取值等,BIOS 屬性舉例如下。
從以上可以看出,BootMode 是枚舉變量,有兩個屬性,分別是Uefi 和Legacy,即表示BIOS 啟動模式可以有UEFI或者兼容傳統(tǒng)BIOS(Legacy)兩種方式。
紅魚基于HTTPs服務(wù),利用RESTful接口實現(xiàn)設(shè)備管理。每個HTTPs 操作都是以UTF-8 編碼的JSON 形式,提交或返回一個資源。就像Web 應(yīng)用程序向瀏覽器返回HTML 一樣,RESTful 接口會通過同樣的傳輸機(jī)制(HTTPs),以JSON 的形式向客戶端返回數(shù)據(jù)。紅魚接口支持的操作見表2。
表2 紅魚接口支持的操作
通過訪問https://{BMC 的IP 地址}/redfish/v1/Registries/BiosAttributeRegistry 地址可以獲取BiosAttributeRegistry.json 里面的相關(guān)資源。
通過訪問https://{BMC 的IP 地址}/redfish/v1/Systems/1/Bios/Settings 地址可以獲取BiosCurrentSetting.json 文件里的相關(guān)資源。
采用本設(shè)計方案后,通過BMC Web 或者紅魚接口可基于BIOS 屬性來顯示或修改BIOS 設(shè)置并驗證用戶輸入。遠(yuǎn)程客戶端也可以通過網(wǎng)絡(luò)訪問服務(wù)器紅魚服務(wù),直接獲取紅魚JSON 文件。