# BMC 相關了解


## BMC (Board Management Controller)

在 Wiki 不會有專門 BMC 的頁面，他會包含在 IPMI 架構裡面維基百科介紹。

{{< image
    src="image.png"
    alt="[IPMI Wiki](https://zh.wikipedia.org/zh-tw/IPMI)"
    caption="[IPMI Wiki](https://zh.wikipedia.org/zh-tw/IPMI)"
>}}

上圖左側是與主機溝通網路介面

1. LPC（Low Pin Count）匯流排：BMC 與主機南橋晶片或 Super I/O 晶片的高速低針腳通道。作業系統（OS）開機後，如果安裝了 ipmitool 或 Dell OMSA 這類本機工具，就是透過這條通道直接與 BMC 交換資訊（如 KCS 介面）。

* LPC（Low Pin Count）匯流排：BMC 與主機南橋晶片或 Super I/O 晶片的高速低針腳通道。
  * 像是你在伺服器上面用 ipmi 查詢伺服器資訊，其實是使用 KCS
  * KCS 的全名是 Keyboard Controller Style（鍵盤控制器風格介面）。在早期 PC 架構中，主機板上負責處理鍵盤訊號的是一顆專用微控制器（著名的 Intel 8042 鍵盤控制器）。CPU 是透過兩組特定的 I/O 記憶體位址（通常是 0xCA2、0xCA3 這類暫存器）去跟鍵盤晶片溝通資料與狀態。
  * IPMI 規範制定時，為了讓 CPU/作業系統能夠與主機板上的 BMC 溝通，工程師決定不要重新發明輪子。BMC 就在硬體暫存器層級「偽裝／模仿」成傳統 8042 鍵盤控制器的暫存器讀寫行為（包含 Status Register、Data Register 等）。
* 遠端透過網路，如同圖，NIC 是透過 SMBus 傳輸到 BMC 上面。
  * 由於 SMBus 速度太慢（只有 100 kHz），無法支撐現代流暢的 HTML5 遠端畫面（KVM）與大檔案掛載，現在伺服器已全面轉用 NC-SI（Network Controller Sideband Interface，基於 RMII 協定 (L1 協定) ，速度達 100 Mbps），但架構本質同樣是透過這條 Sideband 旁路通道直通 BMC。

右側則是 BMC 監控硬體

* 專屬訊號線：BMC 用來直接讀取機殼按鍵（Power/Reset Switch）、控制狀態燈號（Power/UID LED）、或向南橋發送電源控制信號（開機、關機、重開機）。各廠商（OEM）也會透過這條路線實作自家客製化的管理訊號。  
* I2C / IPMB: 作用：BMC 的感測器數據收集網。透過低成本的 I2C 雙線架構，BMC 能週期性地輪詢並監控硬體監控晶片（HW Monitor，讀取風扇轉速、溫度）、電源供應器（PSU 狀態與耗電）、記憶體模組（DIMM SPD/溫度）、晶片組以及擴充插槽。

最下側是：

* Switching Logic（多工切換邏輯）：負責切換序列埠（COM Port）的走向。
  * 本地使用：實體機殼後的序列埠（Serial Port Connector）可以直接連接到主機板上的 Super I/O。
  * 遠端管理（Serial-Over-LAN, SOL）：當管理員在遠端使用 ipmitool sol activate 時，切換邏輯會將 Super I/O 的序列輸出重新導向至 BMC 的序列埠，再由 BMC 將文字串流打包成網路封包傳送給遠端終端機。

IPMI 就是為了在 Server 關機的時候管理伺服器，BMC 可以：

* 遠端強制開機、關機、冷開機（Hard Reset）、重新開機。
* 即時監控 CPU/主機板溫度、風扇轉速、各路電源電壓、機殼開啟偵測（Intrusion Detection）。
* KVM over IP：在遠端瀏覽器直接看到螢幕輸出，並接管鍵盤與滑鼠，可以一路從 BIOS/UEFI 畫面設定到 OS 登入。
* Virtual Media（虛擬媒體掛載）：將遠端電腦上的 ISO 檔模擬為本機 USB 或光碟機，即使伺服器是空機也能遠端安裝作業系統。

IPMI 只規範了訊息格式、通訊協定與最基礎的感測/電源指令集。因為規範只保證「基本相容」，各家廠商會在 BMC 上運行專屬韌體，並加入各自的圖形化網頁介面（Web GUI）、安全機制以及高階管理功能：

1. Dell: iDRAC (Integrated Dell Remote Access Controller)
2. HPE: iLO (Integrated Lights-Out)
3. Lenovo: XCC (XClarity Controller)
4. Supermicro: Supermicro IPMI (多基於 ASPEED 晶片)
5. 開源 OpemBMC

我們一般可以透過 `ipmitool`，這是最通用的標準工具，Debian 與 Ubuntu 官方軟體庫本來就有收錄，任何人都能直接安裝。

使用 `ipmitool` 遠端連線，是直接與伺服器上的 iDRAC（BMC）專用網路孔 溝通，而不是走 Ubuntu 系統的網路。

1. 接線：Dell 伺服器背後通常有一個標示為 wrench 圖示或 iDRAC 的獨立網孔，確認網線已插上並設定好 IP。
2. 開啟 IPMI over LAN。
3. 使用 IPMI 2.0 RMCP+ 加密傳輸協定（管理現代伺服器必填，若用舊版 -I lan 會因安全等級不足連線失敗）。

而同樣各家廠商也有自己的套件庫，像是 Dell 有：

1. Dell RACADM（Remote Access Controller Admin Tool）：`racadm` 是 Dell 專為 iDRAC 打造的命令列工具，支援的功能遠比標準 ipmitool 多（例如直接升級 BIOS、設定 RAID 陣列、匯出/匯入主機 XML 設定檔）。
   1. 可以在 Dell 支援網站（Support Site）輸入伺服器型號（如 PowerEdge R740/R750），搜尋 DRAC Tools for Linux 下載 .tar.gz 壓縮包。
2. Dell OpenManage Server Administrator (OMSA): 如果你的 Ubuntu 是安裝在 Dell 伺服器主機上，想要在作業系統內全面監控硬體狀態、RAID 陣列狀況，Dell 官方有維護給 Debian/Ubuntu 的專屬 APT Repository，你可以直接設定好 APT Key 跟來源清單直接透過 `apt install srvadmin-all` 安裝。

### Dell OSMA

實際上 OSMA 要被放棄了，因為 OMSA 在本機作業系統開啟 Web 介面（Port 1311），這套老舊的網頁架構多次被爆出權限提升（Privilege Escalation）、XSS 或未授權存取漏洞，增加被駭客入侵的主機攻擊面。

請全面改用：

* iDRAC（完全頻外管理）：所有硬體監控、開關機、RAID 設定全部走獨立專用的 iDRAC 網路孔與 Redfish API，作業系統內完全零負擔。
* iSM（iDRAC Service Module，極輕量代理模組）：
  * 它是只有幾 MB 的極輕量背景小程式，安裝在 OS 內只做一件事：充當 OS 與 iDRAC 之間的輕量通訊橋樑（例如把 OS 的 IP 位址、主機名稱、OS 當機藍屏日誌同步傳給 iDRAC）。

以前需要 OMSA 是因為：

1. Dell 的 PERC 磁碟陣列卡是插在主機板 PCIe 插槽上的獨立擴充卡。早期這張卡只對主機的 PCIe 匯流排有連線，根本沒有拉線給 BMC。
2. iDRAC 完全不知道主機插了幾顆硬碟、哪顆硬碟亮黃燈壞掉了、或者 RAID 5 是不是處於 Degraded 降級狀態。
3. OMSA 安裝在 Windows 或 Linux 內部，透過 OS 的 RAID 卡驅動程式去問 PERC 卡：「現在硬碟狀況如何？能不能重建（Rebuild）陣列？」，管理員才能在作業系統裡面看到硬碟壞了沒。
4. 早期 iDRAC 是獨立於主機外的硬體（Out-of-Band），這帶來一個副作用：它對作業系統內部一無所知。
   1. OMSA 扮演了「情報員」：它常駐在 OS 裡，負責把系統內部的狀態打包傳給網管人員。

如今從 iDRAC 7/8/9（約 2012 年後至今）開始，硬體架構發生了徹底的革命：

* BMC 變成完整的小電腦：現代 iDRAC 搭載雙核心 ARM 處理器、上 GB 的 RAM 與專屬 eMMC 快閃記憶體，本身就是一台高效能的嵌入式 Linux 伺服器，直接跑 HTML5 網頁跟 Redfish API 毫無壓力。
* 硬體打通通道：主機板架構全面升級，RAID 卡、NVMe 擴充背板全部都有專屬的 Sideband 匯流排直通 iDRAC。iDRAC 免進系統就能直接管理每一顆實體硬碟與虛擬磁碟。
* Dell 把 OMSA 體積龐大、容易出漏洞的 Web 介面與管理程式全部拔除，只留下幾 MB 的 iSM（iDRAC Service Module），單純用來在 OS 與 iDRAC 之間同步主機名稱、OS 網路 IP 與當機日誌。

## BMC 上面的孔

1. Dedicated Management LAN Port（BMC 專用獨立網孔），這是純粹屬於 BMC 自己的獨立網路通道，完全不經過伺服器的主 CPU 與主晶片組。
   1. 機殼外 RJ-45 插座 $\to$ 實體隔離變壓器（Magnetics） $\to$ 專用以太網實體層收發晶片（Dedicated PHY） $\to$ MII / RMII / RGMII 介面 $\to$ BMC 晶片內部整合的 MAC 控制器。
2. Serial Port / Console Port
   1. 機殼外 DB9 / RJ-45 插座 $\to$ RS-232 電平轉換晶片（如 MAX3232，負責將 $\pm 12\text{V}$ 轉換為主機板能用的 $3.3\text{V}$ TTL 電平） $\to$ Switching Logic（多工切換器 / MUX） $\to$ BMC 的 UART 硬體控制器
   2. 這邊走 UART/RS-232C
3. Direct Access USB Port（前置管理用 USB / iDRAC Direct 孔）: 此孔會將 BMC 模擬成一個多功能 USB 週邊設備。
   1. 前面板 USB-A 或 Type-C 插座 $\to$ 靜電防護 IC（ESD Protection） $\to$ USB 差分訊號線（D+ / D-） $\to$ BMC 內部的 USB Device 控制器。
4. Share LOM /NC-SI Port: 此孔平時是給伺服器作業系統（Ubuntu、Windows 等）上網用的，但內部有「旁路側枝（Sideband）」偷分流給 BMC。

## Redfish

如果說 IPMI 是 1990 年代的老舊二進位電報，那麼 Redfish 就是現代網路通用的 RESTful API（像呼叫一般 Web API 一樣）。

它是由分散式管理任務組（DMTF）聯合 Intel、Dell、HPE 等大廠共同制定的開放標準，目的是讓大型資料中心可以用寫 Web 程式（如 Python、Ansible、cURL）的方式來大規模管理成千上萬台伺服器。

* IPMI 2.0 使用老舊的 RMCP+ 協定，存在著名的雜湊外洩漏洞（Cipher 0 漏洞），密碼雜湊值容易被離線暴力破解。
* Redfish 直接採用標準的 HTTPS（TLS 加密），安全性與一般銀行網頁同等級。

