在某海鲜二手市场买了一块超微的 X10DRL-i,用来做家里的 HomeLab。
在超微的 X99 系列中选择它主要是因为紧凑的布局 (ATX) 和较多的 PICe 插槽。
这篇文章将略去具体的 HomeLab 机器构建过程,主要记录一下配置这块主板的一些操作。
升级 BIOS / BMC 固件 #
我手上这块主板的固件相当老旧,BIOS 版本是 2.0b
,BMC 版本是 3.58
。猜想是这块从机房淘汰出来的主板,在出厂到退役的这段时间内从未进行过固件更新。
在对超微官网应产品固件页下载 BIOS / BMC 固件文件进行固件更新之前,需要先查看对应的 Release Notes
,以确定清楚需要进行的操作步骤。
最新的 BIOS 3.4
中没有看见特殊的注意事项,可以直接更新。而 BMC 3.91
的说明内描述了重要事项:
即,为了不丢失 FRU 和配置信息,低于 3.73
的固件需要先升级到 3.80
再升级到 3.85+
。
3.80
固件从哪里获取呢? 按说明中的描述,需要联系超微的官方支持来获取,这也符合超微官网并不提供历史固件下载的实际情况。不过这不要紧,因为 drunkencat.net 上专门提供了相当多的超微历史固件下载。
图上可见,输入 X10DRL-i
进行查询,可以找到 3.80
的 BMC 固件和发行说明。查看发行说明并未发现如 3.91
那样的特殊要求,于是确定了 BMC 的更新流程:直接更新到 3.80
,然后再更新到 3.91
。
更新固件的过程较简单,只需要下载固件压缩包,解压后阅读其中的说明文件了解清楚可用的平台和对应工具如何操作后,选择你喜好的工具执行即可。我个人选择的是在 FreeDOS 环境下使用 DOS
工具来更新 BIOS / BMC 固件。当然还有更便捷的方法,就是使用 BMC 上的固件更新功能,但这部分功能需要先使用许可证激活后才能使用。
使用 OOB License 激活 BMC 功能 #
在 BIOS 中配置好 BMC 的 IP 地址后,可以登录 BMC 的网页进行基础体验。
记得使用 HTTPS 协议,这块主板默认的 BMC 登录用户名密码是
ADMIN / ADMIN
。
为什么说是基础体验? 因为 BMC 中那些强大的功能需要许对应的许可证才能激活,比如:
- 通过 IPMI 或者网页进行 BIOS / BMC 固件的更新
- 模拟挂载 ISO 镜像
- RAID 的配置及监控
- 强大的 RESTful API 支持
具体不同许可证之间的功能差异参考 System Management Software:
上述提及的固件更新功能,就属于 OOB 许可证的能力范围,对应的售价是 $27。功能更多的 DCMS 的则要贵得多,售价 $180。
超微这种连最基础的通过网页更新固件的能力都需要付费购买许可证来激活多少是有点吃相难看。好在世界上存在与我持相同意见的能人,因为 OOB 许可证的具体算法可以在互联网上轻松搜索到:
Supermicro IPMI License Key (for updating BIOS) = HMAC-SHA1-96(INPUT: MAC address of BMC,SECRET KEY: 85 44 E3 B4 7E CA 58 F9 58 30 43 F8)
就是使用 BMC 网口的 MAC 地址计算 HMAC。在 Linux / Unix 环境下可以通过 openssl
来生成许可证:
echo -n '{YOUR_BMC_MAC_ADDR}' | xxd -r -p | openssl dgst -sha1 -mac HMAC -macopt hexkey:8544E3B47ECA58F9583043F8 | awk '{print $2}' | cut -c 1-24
没有对应环境的可以使用 getmyoob 网页来生成。
在 Miscellaneous
-> Activate License
的页面中将许可证填入即可完成激活。
需要重置许可证的话可以通过修改 BMC 的 MAC 地址来完成。信息来自官方的 IPMI_Users_Guide.pdf:
Note 2: If BMC MAC address is changed,prior license keys will be lost.
但是奇怪的是,我这块在 BIOS 中的
IPMI
->BMC Network Configuration
中Station MAC Address
是灰色的,无法修改。我猜或许可以通过
ipmitool
来完成 (未测试):# example to configure bmc lan 1 mac addr ipmitool lan set 1 macaddr 00:11:22:33:44:55
BMC Redfish,RESTful API #
对于 X10 系列主板,超微的 BMC 固件提供了 Redfish 支持,从下载的 BMC 固件文件名 REDFISH_X10_391_20200806_unsigned.zip
中就可以看见大写的 Redfish 这个单词。当然,超微对使用 Redfish 的最基本的要求是激活了 OOB 许可证。
服务器主板上 BMC 最主要的能力就是以 IPMI 协议实现提供操作硬件的接口,但是自 IPMI 标准在 1994 年发布以来,逐渐暴露出以下问题:
- 可扩展性不强
- 对用户不友好
- 协议及实现中的安全漏洞屡见不鲜
- 供应商能力无法对齐、碎片化、存在各种不兼容的 API、标准、协议和接口
由 DTMF 开发的 Redfish 作为取代 IPMI 的下一代协议,主要就是解决上述问题,提供更现代化的标准 API – 使用 JSON 数据进行交互的 的 RESTful API。
大概的架构可以参考这张网图:
在这块主板上,激活 OOB 许可证后,就可以像这样调用账户管理的 API 获取账户信息:
$ curl -sku 'ADMIN:ADMIN' https://192.168.15.7/redfish/v1/AccountService/Accounts/2 | jq
{
"@odata.context": "/redfish/v1/$metadata#ManagerAccount.ManagerAccount",
"@odata.type": "#ManagerAccount.v1_0_0.ManagerAccount",
"@odata.id": "/redfish/v1/AccountService/Accounts/2",
"Id": "2",
"Name": "User Account",
"Description": "User Account",
"Password": "null",
"UserName": "ADMIN",
"Locked": false,
"RoleId": "Administrator",
"Enabled": true,
"Links": {
"Role": {
"@odata.id": "/redfish/v1/AccountService/Roles/Administrator"
}
}
}
具体的接口及操作指南可以查看 BMC 固件 zip 文件解压出的
Redfish_Ref_Guide_xxx.pdf
。除了直接使用 cURL 此类 HTTP 客户端程序,你也可以选择 DMTF 官方出品的 Python Cli 程序 Redfishtool。
很可惜的是 UpdateService
相关 API 需要 DCMS 的许可证才能工作。
$ curl -k -u 'ADMIN:ADMIN' https://192.168.15.7/redfish/v1/UpdateService/IPMIConfig | jq
{
"error": {
"code": "Base.v1_4_0.GeneralError",
"Message": "A general error has occurred. See ExtendedInfo for more information.",
"@Message.ExtendedInfo": [
{
"MessageId": "Base.v1_4_0.OemLicenseNotPassed",
"Severity": "Warning",
"Resolution": "Please activate at least one license in above message.",
"Message": "Not licensed to perform this request. The following licenses DCMS were needed",
"MessageArgs": [
"DCMS "
],
"RelatedProperties": [
""
]
}
]
}
}
这与查询到的超微 FAQ 回答一致。
Q: What license is required to upload SSL using Redfish API?
A: X10/X11 UP will be require DCMS and X11DP board will require OOB license.
应该说相当多的 API 都需要使用 DCMS 许可证才能工作,倒也并不意外。
如果许可证不是问题,BMC 中 HTTPS 证书的自动化更新就可以通过编写脚本调用
/redfish/v1/UpdateService/SSLCert
来完成,可以完美的做在 Let’s Encrypt 证书的自动化申请/更新的流程下游。
BMC SMASH Shell #
SMASH,一个同样是由 DTMF 开发的标准,这个东西从手册上看跟 Redfish 很像,都是结构化、树形的资源分类与管理,看起来区别只是提供了一个 SSH 协议的 adapter 方便使用脚本来实现简单的监控/管理功能。
使用它只需要通过 SSH 协议登录即可,登录使用的账号密码就是 BMC 中配置的账号密码。登陆成功后进入的是一个简单的 Shell:
可以使用 show {TARGET}
来查看具体对象的信息,如 show system1/sensors1/sensor001
:
具体的说明、能力和用法参考 IPMI_Users_Guide.pdf 中的 Appendix B: Using SMASH
部分。
BMC 的 SSH 端口可以在 BMC 网页的
Configuration
->Port
中修改。
PCIe 拆分 #
控制 PCIe 拆分的设置在 BIOS 中。与常用于家用的消费级主板不同,超微的这个配置入口稍微有些难找(缺乏经验),这块主板的手册页面也并没有详细说明。还是通过 FAQ,得知具体的配置路径是:
Advanced
» Chipset Configuration
» North Bridge
» IIO Configuration
» IIO1 / IIO2 configuration
同时根据 FAQ 中的回答理解,可以拆分的 PCIe 插槽,上面就会有一个 IOUN(N 是数字)的选项。
我只安装了一个 CPU,BIOS 中只有
IIO1 Configuration
。
这是我选择对 CPU1 SLOT2
进行了 x4x4
拆分后的实际 BIOS 界面截图(通过 BMC iKVM 功能远程操作):
BIOS 中所展示的 CPU1 SLOT1 ...
、CPU1 SLOT2 ...
等与实际物理插槽的对应关系都在手册 X10DRL-i USER’S MANUAL 中。
结合上述信息并实际操作 BIOS 后,确定这块主板支持拆分的插槽及能力是:
PCIe Slot | Form Factor Lanes | Actually Connected Lanes | Bifurcation Support |
---|---|---|---|
CPU1 SLOT2 |
8 |
8 |
x4x4 |
CPU1 SLOT3 |
8 |
8 |
x4x4 |
CPU1 SLOT5 |
16 |
16 |
x4x4x4x4 / x8x8 / x8x4x4 |
如果你足够 丧 心 病 狂 的话,可以使用两块 X8-> X4X4 的 M.2 拆分适配卡,加上一块 X16 -> X4X4X4X4 的 M.2 拆分适配卡,光这三个插槽就能插上 8 块 NVMe SSD。
还需要注意的是,实施任意插槽的拆分都会影响原 PCIe 总线地址号的分配。我这张 LSI 的 HBA 卡原先地址号是
02:00
:
另一个插槽拆分并安装上傲腾后,LSI HBA 卡的地址号变成了
03:00
,原先的02:00
被分配给了傲腾。
上述截图来自 PVE 网页控制台。
控制风扇转速 #
这块主板的 BIOS 界面没有地方可以调整风扇的设置,因为风扇全都由 BMC 进行控制。
进入 BMC 网页的 Configuration
-> Fan mode
页面中可以看见 4 个选项:
我这块主板默认之前就配置的是上图所示的全速模式,而其他的 3 个模式找不到任何具体的文档定义及说明,只有一个 FAQ 回答了似是而非的答案:
Q: For X10SRL-F, we found there are Heavy IO speed option in IPMI, what is this fan mode definition ? We couldn’t find any document states for it.
A: X10SRL-F supports the following fan modes:
Standard – Provide standard fan speed
Full Speed – Maximum cooling
Optimal – Balanced fan speed and power consumption
Heavy I/O – Boost cooling to the add-on card zone
我只在主板上连接了 2 个风扇:
Connecter Name | Type | Usage | Max RPM In Specification | Max RPM Reported By BMC |
---|---|---|---|---|
FAN2 | Thermalright(利民) TL-D12B |
CPU 散热 | 1500±10% | 1600 |
FAN6 | Prolimatech(采融) PT12025(DB) |
机箱后置出风 | 1500±10% | 1400 |
实际对这 3 个模式测试观察到的结果是:
Fan Mode | Behavior |
---|---|
Standard |
所有风扇低速运行几秒后突然满速运行一两秒,然后转速又逐渐降低,周而复始。 |
Optimal |
同上 |
HeavyIO |
同上 |
搜索并阅读 TrueNAS 论坛上的这篇 How To: Change IPMI Sensor Thresholds using ipmitool 帖子后才理解了这个现象。
原因就是 BMC 中配置的传感器阈值 – 所有风扇的 LNR
(Lower Non-Recoverable) 阈值都在 15000 RPM(忘记截图当时的读数了)。非 Full 模式的风扇转速显然不是满速,而 BMC 定时监测到有风扇转速低于 Lower LNR
阈值后就会触发所有风扇进入全速模式。这个 15000 的阈值很明显是匹配其原始的工作负载对象 — 2U / 4U 机箱中的几万转大风量暴力风扇,我的风扇显然是水土不服。
帖子中提到的几个阈值是:
Name Abbreviation Supermicro Term (Via BMC Web Console) Lower Non-Recoverable LNR Low NR Lower Critical LCR Low CT Lower Non-Critical LNC \ Upper Non-Recoverable UNR High NR Upper Critical UCR High CT Upper Non-Critical UNC \ 各传感器已设置的阈值可以在 BMC 网页的
Server Health
->Sensor Readings
中点击Show Thresholds
按钮查看,或者使用ipmitools
:ipmitool sensor list all
正如帖子中提出的那样,设置 BMC 中传感器各种阈值的手段最好是通过 ipmitool
,因为超微的 BMC 网页上根本不存在设置的地方,而超微自己的 IPMI 工具又并不是总能正常工作。
使用 ipmitool
调整两个风扇的 Lower LNR、LCR、LNC 以匹配我的实际情况后,风扇周而复始的转速波动情况不再出现。
ipmitool sensor thresh FAN2 lower 0 100 200
ipmitool sensor thresh FAN6 lower 0 100 200
而来自 servethehome
的这篇 Supermicro X9/X10/X11 Fan Speed Control 帖子则代替超微官方补充描述了 Standard
、Optimal
、HeavyIO
这 3 种模式的具体定义:
于是实际测试了下这几个模式下风扇的 RPM,结果如下:
Fan Mode | FAN2 RPM, Ratio | FAN6 RPM, Ratio |
---|---|---|
Standard | 800, = 50% | 700, = 50% |
Optimal | 700, ≌ 43% | 600, ≌ 42% |
HeavyIO | 900, ≌ 56% | 600, ≌ 42% |
不光与帖子中的描述不是完全一致,更让人纳闷的是,在这几个模式中来回反复切换几次就会出现:同一个模式下第 1 次和第 N 次的结果不是完全一致的现象。猜测 BMC 不仅仅是按固定百分比去控制转速,可能还与对应 Zone 的温度有关。
好在帖子中也给出了自定义控制风扇转速的方法,这也是我最后采用的方式。简要来说,需要做到:
- BMC 的 Fan Mode 配置为 Full
- 发送 IPMI RAW 指令指定具体风扇转速比例
除了通过 BMC 网页上设置风扇模式为 Full,也可以通过
ipmitool
工具进行:# Gets the fan mode # 0/1/2/4 Standard/Full/Optimal/HeavyIO ipmitool raw 0x30 0x45 0x00 # Sets the fan mode to Standard ipmitool raw 0x30 0x45 0x01 0x00 # Sets the fan mode to Full ipmitool raw 0x30 0x45 0x01 0x01 # Sets the fan mode to Optimal ipmitool raw 0x30 0x45 0x01 0x02 # Sets the fan mode to HeavyIO ipmitool raw 0x30 0x45 0x01 0x04
根据帖子描述,RAW 指令中需要使用 Hex 来描述转速百分比,0x64
是十进制的 100,就是表示 100%,0x32
表示 50%,依此类推。例如设置 CPU zone (0) 的风扇使用 50% 转速:
ipmitool raw 0x30 0x70 0x66 0x01 0x00 0x32
但是,实际观察到的情况又与帖子存在出入。¯\_(ツ)_/¯
0x64
确实是满速,而 0x32
在我执行指令后通过 ipmitool sdr
观察发现,CPU zone 的 FAN2、FAN6 风扇转速分别是 1000 和 900,接近 64% 的比例。
$ ipmitool raw 0x30 0x70 0x66 0x01 0x00 0x32
$ ipmitool sdr | grep FAN
FAN1 | no reading | ns
FAN2 | 1000 RPM | ok
FAN3 | no reading | ns
FAN4 | no reading | ns
FAN5 | no reading | ns
FAN6 | 900 RPM | ok
FANA | no reading | ns
FANB | no reading | ns
这个
3.91
的 BMC 是 2021 年的,servethehome
帖子的最后修改时间是 2016,可能是超微又改了什么东西导致的。
反复测试后发现只有 0x24
才符合 50% 转速: FAN2 800 RPM,FAN6 700 RPM,且多次结果完全一致。基于静音和散热的考量,最终选择的也是这个值。
通过 RAW 指令设置转速的缺点是,设置在 BMC Reset (掉电/重置) 后会丢失。如果你像我一样使用的是 Linux (比如 PVE),可以选择使用 Systemd 的 oneshot unit 来做到在系统启动时自动设置:
$ systemctl cat ipmi_fan.service
# /etc/systemd/system/ipmi_fan.service
[Unit]
Description=ipmi_fan script
After=openipmi.service
[Service]
Type=oneshot
User=root
Group=root
ExecStart={PATH_TO_YOUR_SCRIPT}
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
[Install]
WantedBy=multi-user.target
想要手动触发 BMC Reset 可以使用 BMC 网页上的
Maintenance
->Unit Reset
,或者使用ipmitool
:ipmitool mc reset cold
Github 上有个 Python 项目 smfc (Super Micro fan control for Linux (home) servers.),号称可以做到按需自动调整风扇转速,但我没有用过。