BMC 如何監控電源:從 PMBus、FRU 到 IPMI 與 Redfish(電源工程師版)
寫給電源工程師的 BMC 入門:BMC 透過哪些訊號與 SMBus 連接電源、開機後如何辨識電源與輪詢 PMBus、STATUS_WORD 如何變成 SEL 事件、讀值如何變成 ipmitool / Redfish 上的感測器,以及電源韌體為了 BMC 相容要注意的事項。
BMC 是什麼
BMC(Baseboard Management Controller)是伺服器主機板上的一顆獨立小電腦,有自己的處理器、記憶體和網路孔。只要伺服器插著電(就算主機沒開機),BMC 就在運作,負責:
- 監控溫度、電壓、風扇、電源供應器
- 記錄硬體事件
- 讓管理人員遠端開關機、看畫面、更新韌體
管理人員透過 IPMI(較傳統)或 Redfish(較新,基於 HTTP / JSON)和 BMC 溝通。常見的 BMC 韌體有各家廠商的版本,以及開源的 OpenBMC。
硬體連接:電源和 BMC 之間有哪些線
| 訊號 | 方向 | 用途 |
|---|---|---|
| SMBus(SDA / SCL) | 雙向 | 讀寫 PMBus 命令、讀取 FRU EEPROM |
| PRESENT# | 電源 → 系統 | 電源有沒有插在插槽上 |
| PWROK / PG | 電源 → 系統 | 主輸出是否正常 |
| SMBALERT# | 電源 → BMC | 電源有異常,通知 BMC 來讀 STATUS |
| PSON# | 系統 → 電源 | 開關主輸出,常由 BMC 或 CPLD 控制 |
伺服器上通常有多顆電源和很多 I2C 裝置,所以 SMBus 常會經過 I2C Mux,每顆電源各自在一個通道上,或用不同的位址區分(例如 FRU EEPROM 依插槽位置使用 A0h、A2h……)。
BMC 的一天:從插電到發生故障
sequenceDiagram
participant PSU as 電源供應器
participant BMC as BMC
participant User as 管理人員
Note over PSU,BMC: AC 插上,電源輸出待機電源,BMC 開機
BMC->>PSU: 檢查 PRESENT#35;
BMC->>PSU: 讀取 FRU EEPROM(型號、序號、額定功率)
Note over BMC: 依型號載入對應的設定(感測器、門檻)
loop 約每秒一次
BMC->>PSU: PMBus:READ_VIN / IIN / POUT / TEMP / FAN
BMC->>PSU: PMBus:STATUS_WORD
end
User->>BMC: 開機
BMC->>PSU: 拉低 PSON#35;(主輸出開啟)
PSU-->>BMC: PWROK 成立,讀值開始增加
Note over PSU: AC 斷電
PSU-->>BMC: SMBALERT#35;,STATUS_WORD 出現 INPUT 相關位元
BMC->>BMC: 寫入 SEL:「Power Supply AC lost」
User->>BMC: 查看 SEL / 感測器
1. 辨識電源:先讀 FRU
電源插入後,BMC 第一件事通常是讀 FRU EEPROM,用型號、料號判斷「這是哪一款電源」,再載入對應的設定:有哪些感測器、門檻是多少、要讀哪些 PMBus 命令。以 OpenBMC 為例,Entity Manager 會比對 FRU 欄位來決定要載入哪一份設定檔。
所以 FRU 內容不正確,BMC 可能根本不認得這顆電源,連感測器都不會出現。FRU 格式請見 IPMI FRU 資料格式完整解析 與 電源供應器 FRU EEPROM 解析。
2. 輪詢 PMBus:定期讀取量測值與狀態
辨識完成後,BMC 會定期讀取一組 PMBus 命令,週期依平台而定,常見約每秒一次:
| PMBus 命令 | BMC 用途 |
|---|---|
READ_VIN、READ_IIN、READ_PIN | 輸入電壓、電流、功率感測器 |
READ_VOUT、READ_IOUT、READ_POUT | 輸出電壓、電流、功率感測器 |
READ_TEMPERATURE_1/2/3 | 溫度感測器 |
READ_FAN_SPEED_1 | 風扇轉速感測器 |
STATUS_WORD 與各 STATUS_xxx | 判斷是否有故障或警告 |
READ_EIN / READ_EOUT | 部分平台用來計算平均功率與耗電量 |
換算方式和系列文章介紹的完全相同:LINEAR11、LINEAR16 + VOUT_MODE、Direct。以 OpenBMC 為例,底層就是 Linux 核心的 pmbus 驅動 + hwmon,和 Python / Linux 實作 那篇介紹的是同一套機制。
3. 偵測異常:STATUS_WORD 變成 SEL 事件
BMC 發現異常的途徑有三種:
- SMBALERT# 被拉低(中斷)
- 輪詢時發現
STATUS_WORD有位元被設定 - PRESENT# 或 PWROK 等 GPIO 變化
接著 BMC 把這些狀態轉成 IPMI 標準的電源事件(感測器類型 08h),寫進 SEL(系統事件紀錄):
| 電源端的狀況 | 常見對應的 SEL 事件 |
|---|---|
| 插入電源(PRESENT# 成立) | Presence detected |
| STATUS_WORD 有故障位元、PWROK 掉了 | Failure detected |
| 風扇轉速偏低、溫度警告等 | Predictive failure |
INPUT / VIN_UV_FAULT 等輸入相關位元 | Power Supply AC lost / Input out of range |
這只是常見的對應方式,哪個 STATUS 位元對應哪個事件,由 BMC 韌體決定,各平台不完全相同。
使用者最後看到什麼
IPMI:ipmitool
$ ipmitool sensor list | grep PSU1
PSU1 Input Voltage | 230.000 | Volts | ok | ...
PSU1 Input Power | 508.000 | Watts | ok | ...
PSU1 Output Power | 480.000 | Watts | ok | ...
PSU1 Temp | 35.000 | degrees C | ok | ...
PSU1 Fan | 9800.000 | RPM | ok | ...
$ ipmitool sel elist
1 | 10/31/2026 | 12:00:05 | Power Supply PSU1 Status | Presence detected | Asserted
2 | 10/31/2026 | 18:42:13 | Power Supply PSU1 Status | Power Supply AC lost | Asserted
以上為示意,感測器名稱、欄位格式與事件描述依平台而定。
- sensor / sdr:即時數值,來自 PMBus 量測命令。每個感測器的名稱、單位、門檻記錄在 SDR(Sensor Data Record) 中,詳見 IPMI SDR 解析
- sel:事件紀錄,來自 STATUS 位元與 GPIO 變化,詳見 IPMI SEL 解析
- fru:型號、序號,來自 FRU EEPROM
Redfish:HTTP + JSON
較新的伺服器也會透過 Redfish 提供同樣的資訊,以電源供應器為一個資源:
{
"Name": "PSU1",
"Manufacturer": "ACME",
"Model": "CRPS-800",
"SerialNumber": "SN80000001",
"PowerCapacityWatts": 800,
"Status": { "State": "Enabled", "Health": "OK" }
}
型號、序號來自 FRU,Health 來自 STATUS 與事件,另外的 Metrics 資源提供輸入電壓、功率、溫度等即時讀值。實際的路徑與欄位依 Redfish 版本和平台而定。
電源韌體要注意的事
從 BMC 的角度回頭看,電源韌體的這些行為會直接影響系統端:
| 電源端 | 在 BMC 那邊造成的問題 |
|---|---|
| FRU 內容錯誤或 Checksum 錯 | BMC 認不得電源,感測器不出現,或顯示錯誤的型號 |
| PMBus 回應太慢(Clock Stretching 過長) | BMC 讀取逾時,感測器顯示 na 或「無法讀取」,甚至影響同一條匯流排上的其他電源 |
| 讀值跳動或偶發錯誤值 | 數值剛好越過門檻,BMC 產生誤報的警告事件 |
| STATUS 位元設定錯誤 | BMC 誤判故障,SEL 出現不存在的電源錯誤;或真的故障了卻沒有回報 |
| 不支援的命令沒有正確 NACK 或設定 CML | 驅動程式誤以為支援,顯示無意義的數值 |
| AC 斷電時狀態更新太慢 | 待機電源消失前來不及回報,SEL 少了「AC lost」紀錄,事後難以判斷原因 |
| 韌體更新或忙碌期間無回應 | BMC 判定電源通訊失敗,可能記錄故障事件 |
結論
- BMC 是伺服器上的獨立管理電腦,透過 SMBus + GPIO 連接電源。
- 插入時讀 FRU 辨識電源,之後定期輪詢 PMBus 取得量測值與狀態。
- STATUS 位元與 GPIO 變化被轉成 SEL 事件;量測值變成 SDR 感測器;FRU 變成型號與序號資訊。
- 使用者透過 ipmitool 或 Redfish 看到這些資料。
- 電源韌體的回應時間、STATUS 正確性與 FRU 內容,都會直接影響系統端的監控結果。
延伸閱讀: