第二章 BMC功能介绍

1 BMC 芯片与 DC-SCM

1.1 芯片这块到底装在哪

先把位置搞清楚。BMC 是一块独立的 SoC,焊在主板上,跑一个裁剪过的 Linux。它的供电来自 3.3V 待机电压,不依赖 CPU,也不依赖操作系统,插上电源线就开始干活。

它对外连着一组低速总线,每一条管一类事。

┌────────────────────────────────────────────────────────────────┐
│ BMC 芯片坐在哪儿                                               │
├────────────────────────────────────────────────────────────────┤
│ 板载方案,BMC 芯片直接焊在主板上                               │
│                                                                │
│ ┌────────────────────────────────┐                             │
│ │                                │                             │
│ │    BMC  SoC   AST2600          │                             │
│ │    双核 Cortex-A7  1.2GHz      │                             │
│ │    板载 DDR4  512MB~1GB        │                             │
│ │                                │                             │
│ └────────────────────────────────┘                             │
│                 │                                              │
│   ├── SPI     ──> 自己的 Flash      固件本体、双镜像、配置区   │
│   ├── DDR     ──> 板上内存颗粒      有的用 SIP 封装里的 DRAM   │
│   ├── eSPI    ──> CPU / 桥片        拿画面、读 POST 码         │
│   ├── I2C     ──> 温度、PSU、背板   传感器与故障位             │
│   ├── SGPIO   ──> 硬盘背板          点定位灯                   │
│   ├── RMII    ──> 网口 PHY          外接 RJ45,有的走 NC-SI    │
│   └── UART    ──> 串口重定向        SOL,看 Linux 控制台       │
│                                                                │
│ 它吃的电是 3.3V 待机电压,电源一插上就跑,主机开不开跟它无关   │
└────────────────────────────────────────────────────────────────┘

主流的 BMC 芯片来自 Aspeed,市面上这几代最常见。

芯片主频与核数内存主要出现场合
AST2400ARM926 单核,400MHzDDR2/DDR3,最大 512MB老机型,现在多为维护状态
AST2500ARM11 单核,800MHzDDR3/DDR4,常见 512MB存量最大的一代
AST2600双核 Cortex-A7,1.2GHzDDR4,常见 1GB近几年新机型的主力
AST2700多核 Cortex-A55更大新平台,支持更多 PCIe 相关能力

换代带来的变化不止在性能上。AST2600 之后多了一批安全相关的东西,比如把信任根的校验流程固化进芯片,老型号上这些得靠外围电路和软件实现。

还有一类芯片不是 Aspeed 出的,Nuvoton 的 NPCM 系列在部分厂商机型上也能碰到,功能和引脚大体相当,但命令行工具和私有接口就完全是另一套了。接手新机型第一件事就是确认芯片型号,很多坑都跟它有关。

1.2 资源有多紧张

BMC 跑的是嵌入式环境,资源比想象中少,很多奇怪的现象根源就在资源上。

资源常见规格紧张时会怎样
Flash32MB 到 128MB装双镜像之后剩余空间本就不多,日志写满会触发清理
内存256MB 到 1GB会话开多了会占内存,Web 页面偶发打不开
CPU单核到双核,不到 2GHz刷新固件或压缩 KVM 画面时占满,响应变慢
会话数个位数到二十几个用满之后新登录全被拒,报错含糊
NVRAM几十 KB配置项塞不下时老数据被挤掉

会话数这一项在实际项目里最容易撞上。跑一轮回归测试,中途数次连不上,查半天网络没问题,最后发现是前面留下的会话没收。后台清一次立刻恢复正常。

1.3 DC-SCM 是什么

DC-SCM 是 OCP 社区提出的一套规范,全称是 Datacenter-ready Secure Control Module。它做的事情很直接,把原本焊死在主板上的 BMC 那一整套东西抠下来,做成一张可以插拔的小卡。

┌────────────────────────────────────────────────────────┐
│ DC-SCM 方案长什么样                                    │
├────────────────────────────────────────────────────────┤
│ DC-SCM 把 BMC 从主板上抠下来,做成一张可插拔模块       │
│                                                        │
│ 模块上装着什么                                         │
│ ┌──────────────────────────────────────────────────┐   │
│ │  BMC SoC       AST2600 或更新型号                │   │
│ │  安全芯片 RoT  单独一颗,管启动验签              │   │
│ │  管理通道      NC-SI,借网卡转发包               │   │
│ │  启动 Flash    SPI,双镜像                       │   │
│ │  密钥保险箱    放证书和私钥                      │   │
│ └──────────────────────────────────────────────────┘   │
│                         │                              │
│                         v                              │
│ 它插在哪                                               │
│ ┌──────────────────────────────────────────────────┐   │
│ │  主板上的卡槽  接口按 OCP DC-MHS 规范            │   │
│ │  同一个模块    能插在不同机型上复用              │   │
│ └──────────────────────────────────────────────────┘   │
│                                                        │
│ 带来的变化                                             │
│   BMC 不再是主板上焊死的部件,可以跨机型复用           │
│   安全能力单独挂出去,启动前要先过 RoT 验签            │
│   换了模块要重新做机型适配,密钥也会被重置             │
└────────────────────────────────────────────────────────┘

这么做的好处有三个。第一,同一个模块能用在多个机型上,厂商不用每个机型重做一遍硬件设计。第二,采购和维护都方便,模块坏了换一块就行。第三,安全能力有了统一的落点,密钥、证书、验签流程都放在这块模块上。

代价也明显。换了模块等于换了一整套密钥,之前导入的证书和 license 得重新做。不同厂商对接口的物理实现虽然都号称兼容规范,实际插上去认不认得出來的问题遇到过不止一次,新模块到手先在实际机型上验一遍。

1.4 启动链路与信任根

BMC 上电之后不是直接跑 Linux,中间有几步。

阶段干什么失败会怎样
BootROM芯片内部的固件,最先执行硬件层就废了,一般是芯片问题
验签引导校验下一级镜像的签名验不过就拒绝启动,切备份镜像
U-Boot初始化内存和外设这一步的输出只能从串口看
内核启动裁剪过的 Linux这一步挂了 BMC 会自己重启
服务拉起 Redfish、IPMI、Web 等部分服务起不来,其余功能还可用

串口在这里的价值没法替代。BMC 起不来的时候 Web 和 Redfish 都没意义,唯一能说话的就是串口。测试这类机型时先把串口线接上,波特率常见 115200,硬件流控那一项记得关掉,不然可能一个字符都收不到。

信任根那一层要单独讲。它的作用是保证跑起来的固件是厂商签过名的那份。测试的时候要验两件事,签名的固件能正常起,签错或者被改过的固件要被拒掉。第二条属于安全类用例,很多项目会漏。

1.5 芯片与模块层测什么

测试项怎么验常见缺陷
芯片信息Redfish 的 Managers 资源读固件版本和型号型号对不上物料清单
资源基线记录空闲时的内存占用,跑完一轮再测内存泄漏,跑几天就崩
长时间运行连续跑 72 小时以上服务进程重启,读数漂移
掉电时区保持断电几分钟再上电,看时间是否正常电池没电导致时间重置
启动验签传被改过的固件包校验没生效,照样刷进去
模块更换拔插 DC-SCM 模块换了之后网络配置不在了
串口输出全程连着串口,看启动阶段的打印某些阶段没有输出,排障困难

掉电时区保持那一条看着不起眼,命中率很高。样机在仓库里搁半年,纽扣电池干掉属于常事,出厂检验这一步又常常跳过。

2 KVM

KVM 是 Keyboard Video Mouse 的缩写,指的是 BMC 提供的远程控制台。它让你隔着网络看到主机屏幕显示的画面,并且能像坐在机器前面一样敲键盘动鼠标。

2.1 画面的来源

画面不是 BMC 猜出来的,是从主机那边搬运过来的。

┌─────────────────────────────────────────────────────────────────┐
│ KVM 画面的一段五跳旅程                                          │
├─────────────────────────────────────────────────────────────────┤
│ 画面是怎么从主机跑到你眼前的                                    │
│                                                                 │
│ ┌────────────────────────────────────────────────────┐          │
│ │  主机显卡            像素躺在帧缓存里              │          │
│ └────────────────────────────────────────────────────┘          │
│                       │                                         │
│                       v                                         │
│ ┌────────────────────────────────────────────────────┐          │
│ │  搬到 BMC            eSPI 或 PCIe 通道             │          │
│ └────────────────────────────────────────────────────┘          │
│                       │                                         │
│                       v                                         │
│ ┌────────────────────────────────────────────────────┐          │
│ │  BMC 压缩            编成帧序列                    │          │
│ └────────────────────────────────────────────────────┘          │
│                       │                                         │
│                       v                                         │
│ ┌────────────────────────────────────────────────────┐          │
│ │  推出去              HTTPS 或私有端口              │          │
│ └────────────────────────────────────────────────────┘          │
│                       │                                         │
│                       v                                         │
│ ┌────────────────────────────────────────────────────┐          │
│ │  浏览器              画布上还原成画面              │          │
│ └────────────────────────────────────────────────────┘          │
│                                                                 │
│ 中间三跳决定画面能不能出,最后一跳决定你看到的画面新不新        │
│ 反方向另有一条窄通道,键鼠事件原路走回去,走的是 USB HID 报文   │
└─────────────────────────────────────────────────────────────────┘

第一跳决定了能不能看到蓝屏和 BIOS 界面。这条路走 eSPI 或者 PCIe,把显卡帧缓存里的像素搬到 BMC 的内存。主机还没进操作系统的时候也在工作,所以装系统、改 grub、看蓝屏全靠它。

有些机型在这一条上加了一层视频压缩单元,整帧压缩之后再传,带宽占用低很多,代价是画面在某些场景下会有残影。

最后一跳的形态差别最大,后面 2.2 讲。

2.2 三种形态

形态怎么用优点缺点
Java 客户端下载一个 jar 包,用本地 JRE 跑兼容性好,老 BMC 上唯一选择要装 Java,浏览器普遍限制插件
HTML5浏览器直接打开不用装任何东西对浏览器版本敏感,需要高性能画布
独立程序厂商给的一个 exe 或者 AppImage最稳,功能齐全每台电脑都要装

现在新机型基本都走 HTML5,老机型上 Java 客户端还跑着。测试的时候这两种都要覆盖,客户那边的实际环境是什么样都有可能,别假定人家装了新浏览器。

iBMC 上 KVM 的入口在 Web 界面的远程控制台那一项,路径大概在界面顶部的工具栏里。它支持 Java 和 HTML5 两种模式,可以在配置里切换。切换之后要等一小会儿才能生效,立刻刷新页面会失败。

2.3 键盘鼠标怎么过去

画面往外的同时,键盘鼠标往里走。BMC 在这一段扮演的是一个 USB HID 设备,把自己伪造成一套键盘鼠标插在主机上。

这里有个高频问题。KVM 窗口里的键盘布局和主机认到的不一致,最常见的是数字小键盘输不出来,或者某些按键组合被本地系统截走了。Windows 上按 Ctrl+Alt+Del 会被本地截获,得用 KVM 窗口上自带的那个按钮。

另一个坑是虚拟介质和 KVM 抢同一个 USB 通道。挂了虚拟光驱之后再重连 KVM,键鼠有时候就没反应了,要先卸载介质再重连。这个现象在 3.3 节还会碰到。

2.4 SOL 文本控制台

除了图形界面,还有一条只走文本的路叫 SOL,Serial Over LAN。它把主机的串口重定向到网络上,你在本地用终端就能看到 Linux 的控制台输出。

对比KVMSOL
传输内容像素字符流
带宽占用高,几十 kbps 起极低,几 kbps
能看到 BIOS 界面吗能不能,要 BIOS 开了串口重定向才行
能用它改 grub 吗能能
依赖显卡吗依赖不依赖

SOL 的价值在排障。网络差到画面完全出不来的时候,SOL 经常还能通,因为它对带宽的要求极低。前提是主机的 bootloader 和内核都配置了串口输出。

2.5 KVM 测什么

测试项怎么验常见缺陷
画面能否出来在 BIOS 界面、系统里、蓝屏三种场景各试只在某一阶段黑屏
先后覆盖启动全程从头到尾开着,看是否全程有画面进入某项之后画面卡住不动
键鼠可用性在 BIOS Setup 里用键盘操作小键盘无效,组合键被截获
分辨率适配改窗口大小,看是否自适应画面被裁掉一部分
多用户两个人同时开后者把前者踢掉,报错信息不清楚
断线重连拔网线几秒再插回去重连之后画面再也不出
长时间保持保持连接 8 小时以上内存涨上去,最后掉线
与虚拟介质共存挂上介质后开 KVM,看键鼠是否仍可用挂载后键鼠失灵

第七条建议别省。KVM 会话的内存泄漏是慢性的,单看一个小时什么都发现不了,第二天早上来就看到一堆断开的连接占着资源。

3 虚拟媒体挂载

3.1 它在干什么

虚拟介质让主机把你本地的一个 ISO 文件当成光驱里的一张盘。

┌───────────────────────────────────────────────────────────┐
│ 虚拟介质走过的五步                                        │
├───────────────────────────────────────────────────────────┤
│ 本地 ISO 变成主机眼里的一台光驱                           │
│                                                           │
│ ┌──────────────────────────────────────────────┐          │
│ │  本地 ISO 文件                               │          │
│ │  管理员在自己电脑上                          │          │
│ └──────────────────────────────────────────────┘          │
│                       │                                   │
│                       v                                   │
│ ┌──────────────────────────────────────────────┐          │
│ │  上传到 BMC                                  │          │
│ │  HTTPS 或 SMB / NFS 地址                     │          │
│ └──────────────────────────────────────────────┘          │
│                       │                                   │
│                       v                                   │
│ ┌──────────────────────────────────────────────┐          │
│ │  BMC 的 USB 设备控制器                       │          │
│ │  把自己的 USB 口假装成外设                   │          │
│ └──────────────────────────────────────────────┘          │
│                       │                                   │
│                       v                                   │
│ ┌──────────────────────────────────────────────┐          │
│ │  主机看到一个 USB 光驱                       │          │
│ │  即插即用,认设备                            │          │
│ └──────────────────────────────────────────────┘          │
│                       │                                   │
│                       v                                   │
│ ┌──────────────────────────────────────────────┐          │
│ │  装完系统要卸载                              │          │
│ │  不卸的话下次重启还会认到                    │          │
│ └──────────────────────────────────────────────┘          │
│                                                           │
│ 关键点在第 3 跳。BMC 这一段同时扮演主机和设备才会两边通   │
└───────────────────────────────────────────────────────────┘

第三跳是核心。BMC 的芯片在这一段同时扮演 USB 主机和 USB 设备两个角色,一边接待管理员传上来的文件,一边把自己伪装成一台光驱插给主机。这段两用的能力也是为什么挂上去之后有时会干扰键鼠,因为键鼠走的是同源的 USB 通道。

3.2 支持哪几种形态

类型主机眼里是什么典型用途
CD/DVD 镜像一台光驱,只读装操作系统,最常见的一种
软盘镜像一台软驱老系统加载驱动,某些诊断场景
硬盘镜像一块硬盘,可读写导数据,做离线备份
物理光驱管理员机器上的真光驱少见,多为老旧流程

可读写那一项要小心。挂载之后有的 BMC 会支持回写,界面上的选项名叫读写和只读,选错一次可能就把主机的文件改写了。生产项目里一律用只读,除非流程明确要求。

3.3 挂上去之后看不见怎么办

我排查这个问题的顺序基本固定,按这个走十分钟能定位。

现象先查哪里再查哪里
挂载界面提示成功,主机认不到主机是不是在 UEFI 的启动项里排到了这个设备BMC 上有没有开启这项服务
BIOS 认得到,进系统之后消失卸载有没有被自動执行系统里的 USB 驱动有没有识别到
KVM 键鼠跟着失效先卸载介质再重连 KVM同上一条同 USB 通道的问题
传输到一半停住网络有没有丢包,共享地址能否访问文件大小有没有超过上限
换浏览器就不行是否走了需要插件的老模式浏览器有没有拦掉某些端口

最后一行的情形有种常见误会。实现上,免客户端那种模式的位图对浏览器有要求,Chrome 上正常,老版本 IE 内核下直接不工作。这不是缺陷,是模式选错了。

3.4 虚拟介质测什么

测试项怎么验常见缺陷
挂载流程图形界面挂一次,命令行或接口挂一次两个入口行为不一致
主机识别挂载之后在系统里看有没有多出一个光驱认到但是空的
装系统完整走一遍安装流程装到一半介质掉线
卸载正常卸载,看主机是否移除设备卸载后还在,重启才消失
异常挂载中拔网线,看是否会自己清理会话残留占着不释放
权限只读账户能不能挂载越权,本该被拒却成功
大文件传一个接近上限的 ISO传不完也不报错

第五条强调一下。挂载中网络中断,BMC 那一侧的挂点应该自己清理掉,不然之后再也挂不上去。这条异常场景的处理最能看出实现质量。

4 风扇调速

4.1 一个闭环

风扇不是按一个固定值转的,是一整套闭环。

┌────────────────────────────────────────────────────────────┐
│ 风扇调速的四个动作                                         │
├────────────────────────────────────────────────────────────┤
│ 调速是一个闭环,每一圈大约 1 到 5 秒                       │
│                                                            │
│ ┌──────────────────────────────────────────────────────┐   │
│ │  采样    读一批传感器读数                            │   │
│ │          入口、CPU、内存、PCIe 各分区                │   │
│ └──────────────────────────────────────────────────────┘   │
│                         │                                  │
│                         v                                  │
│ ┌──────────────────────────────────────────────────────┐   │
│ │  判定    跟阶梯表的档位比对                          │   │
│ │          取所有分区里最高的那档需求                  │   │
│ └──────────────────────────────────────────────────────┘   │
│                         │                                  │
│                         v                                  │
│ ┌──────────────────────────────────────────────────────┐   │
│ │  输出    换算成 PWM 占空比                           │   │
│ │          渐变到位,不允许一步跳过去                  │   │
│ └──────────────────────────────────────────────────────┘   │
│                         │                                  │
│                         v                                  │
│ ┌──────────────────────────────────────────────────────┐   │
│ │  确认    读实际转速再核对                            │   │
│ │          对不上要报风扇故障                          │   │
│ └──────────────────────────────────────────────────────┘   │
│                                                            │
│    └─ 回到第 1 步,接着采样 ─┘                             │
└────────────────────────────────────────────────────────────┘

采样这一步要注意分区。机器里至少分了入口、CPU、内存、PCIe 这么几个区,每个区有自己的传感器。判定那一步取的是所有分区里需求最高的那档,不是平均值。这条决定了故障时的表现,单独一个区过热,整机风扇都会起来。

输出那一步藏着测试最常踩的坑。转速是渐变的,从当前值走到目标值要几秒到几十秒,中间还在 overshoot。判定写成切完模式立刻读转速等于目标值,大概率失败,要给一个合理的收敛时间。

4.2 四种模式

模式行为什么时候用
自动按温度阶梯表调速,默认绝大多数场合
手动固定一个占空比,不再跟随温度调试、噪音测试、故障隔离
全速所有风扇到 100%排除散热问题时的对照手段
智能按部件温度和拓扑联合决策部分厂商的增强模式,比如 iBMC 的智能调速

模式切换可以走 Redfish 的 Thermal 资源做 PATCH,也可以在 Web 界面上改。改完之后要到另外两个入口再读一次确认,横跨多个入口的一致性检查在这里很有必要。

从手动切回自动的时候要留意。有的实现会让转速先跳一下再收敛,把这个过程对着命令行窗口看十几秒很直观,肉眼看数字会发现它在几秒内一点点靠近目标。

4.3 转速怎么读

风扇的转速单位是 RPM,每分钟转数。BMC 读它靠的是风扇反馈回来的 tach 信号,一根线一个脉冲。

字段含义
Reading实测转速,单位 RPM
LowerThresholdCritical转速下限,低于此值判故障
UpperThresholdNonCritical转速上限,超出多半说明风扇跑得不对劲
Status.HealthBMC 自己判的健康状态

清零和卡住是两个不同的缺陷。风扇停了读数当然是 0,会低于下限判 Critical;风扇卡住不转但反馈线还在可能读出偏低的奇怪数值,这类值要结合其他分区的温度一起看才有意义。

4.4 少一把风扇会怎样

风扇是有冗余设计的。热插拔掉一把之后,剩下的会提速补偿,同时上报一条告警。补偿之后整机温度要能稳住,不能超过传感器阈值。

这条的判定标准要写清楚。

  • 拔掉一把之后是否立刻产生告警
  • 剩余风扇转速是否提升,提升幅度有没有上限
  • 温度是否稳住,多久恢复到正常区间
  • 插回去之后转速是否自动回落到原值
  • 拔到超过冗余上限时会发生什么

最后一条要谨慎。多数机型在这里要么强力提速要么强制关机,属于保护机制,测试之前要先确认规划好的行为,别把它当成缺陷提。

4.5 风扇调速测什么

测试项怎么验常见缺陷
模式切换四种模式逐一切一遍界面显示改成功了,实际调速逻辑没换
收敛时间切换后每两秒读一次,画曲线长时间不收敛,或者来回震荡
读数精度与手持转速计比对偏差超百分之十
冗余补偿拔一把,看其余是否提速不补偿,温度直接上去了
虚假告警把风扇的反馈线拔掉,看是否报错拔了不报,风险很大
全速噪音切全速,量噪音和功耗全速下功耗超出电源预算
断电保持拔掉电源线之后调速策略还在不在重启后回到默认模式

第五条是我最喜欢的一条。把 tach 反馈线拔了而不拔风扇,风扇还在转,温度也正常,但 BMC 读不到转速。这时候如果它沉默不报,等真出故障时就晚了。好的实现会立刻报风扇丢失。

5 固件更新

5.1 一次升级动的东西

┌────────────────────────────────────────────────────────────┐
│ 固件更新涉及的部件                                         │
├────────────────────────────────────────────────────────────┤
│ 一次固件升级牵扯到的不止 BMC 自己                          │
│                                                            │
│ ┌──────────────────────────────────────────────────────┐   │
│ │  打包发货的升级包      通常是一个 hpm 或 zip         │   │
│ │                        里面同时装着好几份固件        │   │
│ └──────────────────────────────────────────────────────┘   │
│                         │                                  │
│                         v                                  │
│ ┌──────────────────────────────────────────────────────┐   │
│ │  BMC 自身固件          先升,因为它要带着后面的      │   │
│ └──────────────────────────────────────────────────────┘   │
│                         │                                  │
│                         v                                  │
│ ┌──────────────────────────────────────────────────────┐   │
│ │  CPLD                  改上电时序,风险最高          │   │
│ └──────────────────────────────────────────────────────┘   │
│                         │                                  │
│                         v                                  │
│ ┌──────────────────────────────────────────────────────┐   │
│ │  BIOS                  双镜像,失败会自动回退        │   │
│ └──────────────────────────────────────────────────────┘   │
│                         │                                  │
│                         v                                  │
│ ┌──────────────────────────────────────────────────────┐   │
│ │  RAID / 网卡           部件固件,有的要重启才生效    │   │
│ └──────────────────────────────────────────────────────┘   │
│                                                            │
│ 绝大多数固件要重启之后才生效,这一步最容易被漏掉           │
└────────────────────────────────────────────────────────────┘

升级包这个词在企业级场合指的是一份打包好的东西,里面同时装着好几份固件。这几份固件的版本之间有配套要求,第一章讲过那次事故,这里不再重复。

顺序是有讲究的。BMC 自己要先升,因为后面的几份固件要通过它去刷。CPLD 的风险最高,它管上电时序,刷挂了机器就起不来。BIOS 有双镜像兜底。部件固件有的要重启才生效,有的不用。

5.2 三条更新路径

路径怎么做适用场景
Web 界面上传打开固件升级页,选文件,点开始单机操作,最直观
Redfish 接口调 UpdateService 的 SimpleUpdate 动作批量操作,标准化
命令行厂商自带的工具,比如 iBMC 上的 SSH 登进去跑厂商指定流程,救砖时用

Redfish 那条路径要多说几句。它是异步的,下发之后拿到 202 和一个 Location,指向一个任务,真正刷完要分钟级。确认进度要反复去轮询那个任务,等到状态变成 Completed 再重启读版本。判定写成传完包立刻查版本号等于新版本,必挂。

这个流程在第一章 8.3 节画过一张图,可以回去对照看。

5.3 更新要注意的细节

  • 升级之前先导出一份配置备份,别指望厂家的默认行为
  • SEL 日志先清一轮或者导出,升级之后老日志可能被清掉
  • 确认机器上没有正在跑的业务,升级要重启
  • 看一眼 Release Notes 里的配套矩阵,第一章那次事故就是这么来的
  • 确认退路,上一版固件包放在手边,救砖流程先问过

第三条常被忽视。测试机上跑着其他人的任务,重启一次把人家的活儿弄没了,这种事在共享样机环境里几乎每周都发生。

5.4 固件更新测什么

测试项怎么验常见缺陷
正常升级走流程到结束,读版本确认版本没变,或者进度卡住不动
跨版本从很旧的版本直接升上来中间版本缺失时报错不清楚
版本回退从新版降回旧版有的机型禁止降级但不给提示
同版本重刷再刷一次相同版本有的机器会拒绝,有的不拒绝
中断刷到一半拔网线或者断电变砖,无法回退
错误包传一个别机型或者被改过的包校验没生效,刷进去变砖
配置保留升级之后检查配置项是否还在升级后设置全掉,要人工重配
并发同时向一台机器下发多个升级没有互斥,状态被搞乱

第五和第六条属于破坏性测试,要在专门的样机上做。别拿唯一一台能用的机器去试。

6 保存配置与恢复出厂设置

6.1 配置项存在哪

┌──────────────────────────────────────────────────────┐
│ 保存配置跟恢复出厂在改哪儿                           │
├──────────────────────────────────────────────────────┤
│ 同一片 Flash 里,配置项被分成了几块                  │
│                                                      │
│ ┌────────────────────────────────────────────────┐   │
│ │  Flash 里的分区                                │   │
│ │                                                │   │
│ │  代码区        固件本体,双镜像                │   │
│ │  出厂配置区    默认值,写死,改不了            │   │
│ │  当前配置区    用户改过的那些设置              │   │
│ │  动态数据区    日志、电压曲线、截图            │   │
│ └────────────────────────────────────────────────┘   │
│                         │                            │
│                         v                            │
│ ┌────────────────────────────────────────────────┐   │
│ │  恢复出厂  =  当前配置区 ← 出厂配置区          │   │
│ └────────────────────────────────────────────────┘   │
│                                                      │
│ 真正执行的时候还要选粒度,哪些恢复哪些留下           │
└──────────────────────────────────────────────────────┘

代码区和配置区分开是通用做法。这也解释了为什么升级固件之后你改的设置还在,因为升级动的是代码区。

出厂配置区是写死的,不会因为你的操作而改变。恢复出厂这个动作,本质上是把当前配置区的每一项都找回默认值,不是把整片 Flash 擦了重写。

6.2 哪些留哪些丢

这一步各家实现差别相当大,我按最常见的行为列一张表,接手新机型时一定要逐项实测,别照抄。

内容恢复出厂后说明
IP 地址等网络设置多数机型会重置有的能勾选保留
用户账户与密码重置回默认自定义账户会被删掉
SNMP 团体名与告警目标重置Trap 目的地会丢,要重配
NTP 服务器地址重置开篇那次就是这条被改过又没备份
SEL 日志通常保留也有机型会一并清掉
主机名与位置信息重置资产录入时要重填
证书和密钥视实现而定部分机型会保留自己的签名证书
时间与时区保留RTC 走了多久不会被这个动作改变

真正让人难受的是第三行。告警目标被清了,机器之后的告警全部送不出去,而这时候大家都在看别的东西,没人想到是上周那次恢复出厂动的手脚。

6.3 三种粒度

iBMC 和一些厂家提供了不止一种恢复粒度。

粒度影响范围什么时候用
恢复全部出厂设置上面那张表里的项几乎全重置机器转到别的用途,或者要交付给新客户的时候
保留网络设置重置用户和告警配置,IP 地址不动带外还能连的时候,避免把自己关在门外
仅清除日志只清 SEL 和操作日志交付前做一次清理

第二种是救命的。远程机房操作,一旦把 IP 也重置了而现场又没人帮忙改回去,这台机器就从网络上消失了。我做远程操作前会先确认这个选项在不在,没有的话这一步就改成现场做。

保存配置那一侧也有动作。导出配置文件存成一份 xml 或者二进制文件,之后能再导回去。测试时要验一个来回,先导出,改掉几项配置,再把备份导回去,看改过的那些有没有被还原。

6.4 配置与恢复测什么

测试项怎么验常见缺陷
导出再导入改几项配置后导入备份,看是否还原部分字段没被包含在备份里
备份完整性逐项对照备份文件和界面上的显示漏备份 NTP 或告警目标
恢复粒度三种粒度各跑一次,比对结果保留网络这一项无效,IP 照样丢
是否需要重启看恢复动作之后是否要求重启 BMC有的机型不重启不生效但不提示
日志处置确认 SEL 是否被清与说明书描述不一致
可重复连续做三次,结果应当一致第二次开始出现残留
独占性恢复过程中其他接口能否操作没有加锁,配置被改写到一半

最后一条单独拿出来说。有的 BMC 执行恢复之后需要重启才完全生效,界面上却不给任何提示。你以为已经恢复了出厂,实际只恢复了一半,后面跑出来的测试结果全是基于中间状态。

7 网络设置

7.1 三种接法

┌────────────────────────────────────────────────────────────┐
│ 网逃脱不出这三种接法                                       │
├────────────────────────────────────────────────────────────┤
│ 同一件事画出三条不同的连线方式                             │
│                                                            │
│ ┌──────────────────────────────────────────────────────┐   │
│ │  A  专用管理口                                       │   │
│ │  主板侧面一个独立 RJ45,只走管理流量                 │   │
│ └──────────────────────────────────────────────────────┘   │
│ ┌──────────────────────────────────────────────────────┐   │
│ │  B  共享业务口                                       │   │
│ │  两种流量挤一个口,靠 VLAN 或者端口区分              │   │
│ └──────────────────────────────────────────────────────┘   │
│ ┌──────────────────────────────────────────────────────┐   │
│ │  C  NC-SI 侧带                                       │   │
│ │  借用网卡上的一条专用通道,由网卡固件转发            │   │
│ └──────────────────────────────────────────────────────┘   │
│                                                            │
│                                                            │
│   A   BMC ── RMII ──> PHY ── RJ45 ──> 独立交换机           │
│   B   BMC ──> 共用 RJ45 ──> 汇聚交换机   (业务流量同口)    │
│   C   BMC ── NC-SI ──> 业务网卡固件 ──> 业务网络           │
│                                                            │
│ 接法 B 省一根线,代价是网卡一挂,带外跟着不通              │
│ 接法 C 依赖网卡固件,升级前后一定要验这条通道              │
└────────────────────────────────────────────────────────────┘

接法 A 是最省心的,管理流量有独立的网线、独立的交换机,业务网出事也影响不到带外。缺点是每台机器多占一个网口和一段布线。

接法 B 在成本敏感的项目里常见。管理流量和业务流量走同一根线,靠 VLAN 标签区分。省了线缆和交换端口,代价是网卡或者交换机出问题时带外跟着一起断。测这种接法时要专门挖一次网线,确认在业务流量跑满的情况下,管理流量还能不能挤进去。

接法 C 多见于支持 DC-SCM 的新机型。BMC 不直接接网口,而是把报文交给业务网卡上的固件转发。这条通道叫 NC-SI。它的优点是布线简单,缺点是高度依赖网卡固件,网卡固件一升级,这条通道到底工作不工作要重新验。

7.2 要配些什么

配置项说明容易出错的地方
IP 地址与掩码静态配置,也可以走 DHCP掩码写错,同网段能通跨网段不通
默认网关跨网段访问时必配漏配导致 NTP 和邮件告警全失效
VLAN ID走共享口或者 trunk 时必配配成 untag 或者忘记配,交换机侧也收不到
DNS用域名的场合需要NTP 用域名时没有它就同步不上
IPv6部分客户要求双栈只配了地址没配网关,地址显示但是不通
链路聚合少见,部分机型支持交换机侧没配对称模式,一半的流量丢

网关那一行单独说。很多人的直觉是网关只影响远程访问,实际上 NTP、Syslog、邮件告警、SNMP Trap 这些走远端的功能全都依赖它。开篇那次事故里 NTP 地址配在另一个网段,配了 DNS 也没用,网关不通就是不通。

7.3 都开着哪些口

服务端口默认该不该开
HTTPS443开必开,Redfish 和 Web 都靠它
SSH22开有命令行需求就开,不用就关
SNMP161 查询,162 Trap关要接监控平台才开
IPMI over LANUDP 623开安全审计里经常被要求关
虚拟介质私有端口,各厂商不同开不用的时候建议关
KVM同上开同上
Telnet23关不要开,明文传输

IPMI over LAN 那一行在等保项目里经常被要求关掉。关之前先确认监控侧有没有在用,有些老的巡检脚本还在跑 ipmitool,一刀切关掉之后巡检全线告警。

7.4 改 IP 怎么不断线

远程改 IP 是高危操作,改错一步就再也连不上。我按这个顺序做。

  • 先确认新地址所在的网段是通的,用同网段的其他机器 ping 一下网关
  • 检查有没有被交换机侧的端口安全策略挡住
  • 改之前导出一份配置备份
  • 同时改动网关和地址时,先改网关还是先改地址要想清楚,改完第一项可能立刻断线
  • 改完之后开两个终端窗口,用新地址连,旧窗口别关
  • 确认新地址能连上之后再等五分钟,看连接是不是稳的

第五步的双窗口习惯救过我好几次。新地址连不上,旧窗口还在,还能立刻改回去。

7.5 网络这块测什么

测试项怎么验常见缺陷
静态地址配完能连,重启之后保持重启丢失,回到 DHCP 或者默认地址
DHCP拿到的地址能否正常用,租期到期后是否续约租约到期不续,机器自己消失
VLAN配 tag 之后抓包确认带标签配了不生效,仍是 untag
IPv6地址和网关都通只有地址没有路由
服务开关逐个关掉再打开,看端口是否真的变了界面改了端口还开着
改地址按上面的顺序改一次改一半失联
网络丢包长 ping 几千包偶发丢包导致 KVM 卡顿
拔线恢复拔网线一分钟再插回网络服务不恢复,要重启 BMC

最后一条里藏着一个常见毛病。网线拔插之后 BMC 的网络服务有时候不自动重连,界面上显示还是那个地址,就是不通。测的时候别只看配置还在不在,要真的连一次。

8 用户管理与安全

8.1 角色与权限

┌──────────────────────────────────────────────────────┐
│ 一次登录要过的六道关                                 │
├──────────────────────────────────────────────────────┤
│ 一次登录要过的关                                     │
│                                                      │
│ ┌────────────────────────────────────────────────┐   │
│ │  1  账户存在吗        不存在直接失败           │   │
│ └────────────────────────────────────────────────┘   │
│                         │                            │
│                         v                            │
│ ┌────────────────────────────────────────────────┐   │
│ │  2  密码对吗          错一次就开始计数         │   │
│ └────────────────────────────────────────────────┘   │
│                         │                            │
│                         v                            │
│ ┌────────────────────────────────────────────────┐   │
│ │  3  该账户被锁了吗    达到阈值进锁定期         │   │
│ └────────────────────────────────────────────────┘   │
│                         │                            │
│                         v                            │
│ ┌────────────────────────────────────────────────┐   │
│ │  4  账户过期了吗      有有效期这一项           │   │
│ └────────────────────────────────────────────────┘   │
│                         │                            │
│                         v                            │
│ ┌────────────────────────────────────────────────┐   │
│ │  5  来源 IP 允许吗    有的机型能配白名单       │   │
│ └────────────────────────────────────────────────┘   │
│                         │                            │
│                         v                            │
│ ┌────────────────────────────────────────────────┐   │
│ │  6  会话还有位置吗    总数是个位数             │   │
│ └────────────────────────────────────────────────┘   │
│                         │                            │
│                         v                            │
│ ┌────────────────────────────────────────────────┐   │
│ │  过了这六关才拿到令牌,后面带着它办事          │   │
│ └────────────────────────────────────────────────┘   │
│                                                      │
│ 失败计数和锁定计时是两个独立变量,别混着看           │
└──────────────────────────────────────────────────────┘

权限模型各厂商叫法不同,大体是这几档。

角色能做不能做
管理员全部功能,包括升级和改用户无
操作员开关机、挂介质、开 KVM改用户、刷固件
只读用户看状态、读日志任何改动类操作
自定义按厂商给的复选框组合没勾的都不能做

Redfish 里这些角色叫 Privilege,取值通常是 Administrator、Operator、ReadOnly。IPMI 里也有对应的 privilege level。测试要做的是三种入口上的角色对应一致,同一个账户在 Web 上是只读的,在 IPMI 里却能把机器关掉,这种越权缺陷不算少见。

iBMC 在这之上支持自定义角色,勾选粒度比较细。配完之后要逐个确认没勾的那个权限真的被挡住了。只验勾中的那几项是不够的,恰恰是没勾的这些最容易出问题。

8.2 密码策略

策略项常见默认值测试时怎么定
最小长度8 位试 7 位应当被拒
复杂度大小写数字符号的组合要求逐个组合试一遍
有效期90 天或者永久改时间到临界点看会不会提醒
历史密码不能与最近几次重复改回去应当被拒
首次登录强制改密码有的机型默认开新账户第一次登录是否被强制
传输加密HTTPS 加密传输抓包确认不是明文

第三条可以用改 BMC 时间的办法快速验证。把时间往前调到接近有效期,登录看有没有提醒。但改完一定要记得改回去,这条我踩过,调完忘了恢复,后续几天的 SEL 记录时间全乱了。

8.3 锁定与会话

失败次数、锁定时长、解锁方式这三项要组合着测。

组合预期行为
连续输错到阈值账户被锁,正确的密码也登不上
锁定期内日志要有记录,不管是 SEL 还是操作日志
锁定期届满自动解锁
管理员解锁提前解锁成功
未到阈值失败计数要能清零,输对一次就算通过

最后一行最容易被漏。失败两次之后成功登录一次,计数应当归零,而不是继续累加到阈值把人锁在外面。实现的版本差异很大,有的机型清零有的不清,属于必须实测的一项。

会话那边的约束在第一章 8.3 节提过。总数是个位数到二十几个,占着不释放很快就用完。测试时要留意单次会话的存活时长和清理机制,用完之后主动登出。

8.4 证书与服务

项目说明
证书替换可以导入客户自己的证书,也可以用自签的那张
协议版本TLS 版本,建议只留 1.2 及以上
证书校验客户端要不要校验证书,浏览器上会给出提示
SNMP 版本v3 支持认证和加密,v2c 只有团体名
双因子少数机型支持

证书替换之后要验的东西比较多。换完之后所有走 HTTPS 的入口都要重新连一次,包括 Web、Redfish、以及依赖 SDK 的厂商工具。证书链不完整的时候浏览器能连,命令行工具反而报错,两边一起验才踏实。

8.5 用户安全测什么

测试项怎么验常见缺陷
角色权限每个角色逐个功能试一遍只读账户能刷固件,严重越权
密码策略上表逐项弱密码被接受
锁定策略组合表逐项计数不清零
默认密码新机器用默认密码能否登录出厂密码没提示修改
会话释放登录后不退出反复来几次会话耗尽,报错含糊
HTTPS 加密抓包看是不是明文登录过程明文传输
证书校验传被篡改的包,看校验是否生效校验形同虚设
操作留痕改完配置去查操作日志改动没记录,出事没人认

第一条里有个典型场景,只读账户理论上不能开关机,但某些机型只在 Web 界面上拦了,走接口照样能下发 Reset 动作。判定的时候要把三个入口都跑一遍。

9 日志记录

9.1 四类日志

┌──────────────────────────────────────────────────────────────┐
│ 日志记录的内容和去处                                         │
├──────────────────────────────────────────────────────────────┤
│ 机器上的日志按用途分成四摊                                   │
│                                                              │
│ ┌──────────────────────────────────────────────────┐         │
│ │  SEL 系统事件日志    硬件告警、传感器越限        │         │
│ │  Redfish LogServices/SEL                         │         │
│ └──────────────────────────────────────────────────┘         │
│ ┌──────────────────────────────────────────────────┐         │
│ │  操作日志            谁在什么时候改了什么        │         │
│ │  LogServices/Operations                          │         │
│ └──────────────────────────────────────────────────┘         │
│ ┌──────────────────────────────────────────────────┐         │
│ │  视频 / 截图         故障瞬间的画面快照          │         │
│ │  私有接口或者 /UI 路径                           │         │
│ └──────────────────────────────────────────────────┘         │
│ ┌──────────────────────────────────────────────────┐         │
│ │  服务自身日志        Web、认证、守护进程         │         │
│ │  要开 SSH 才能看到完整版                         │         │
│ └──────────────────────────────────────────────────┘         │
│                             │                                │
│                             v                                │
│ ┌────────────────────────────────────────────────────────┐   │
│ │  三种外送方式        Syslog、SNMP Trap、邮件           │   │
│ │  本地留存            写满以后多数机型是覆盖最老的      │   │
│ └────────────────────────────────────────────────────────┘   │
└──────────────────────────────────────────────────────────────┘

SEL 是这里面最重要的一类,也是厂商定位问题时的第一手材料。提缺陷单的时候对方第一个要的就是它。它记的是硬件层面的事件,风扇转速超了、电源掉了、温度越限了、内存可纠错的错多了,都会在这儿留下一条。

操作日志记的是人的动作。谁在什么时候登进来,改了哪一项,全在里面。有审计要求的场合,这一份常被列为交付的必查项。

9.2 一条 SEL 包含什么

字段说明
Record ID记录编号,从 1 开始累加
Timestamp发生时间,依赖 BMC 时钟
Sensor Name传感器名,比如 CPU1_Temp
Sensor Type传感器类型,温度、电压、风扇、电源
Event Direction上冲还是下落,断言消失还是产生
Event Data事件数据,各厂商解读方式不完全一致
Severity级别,OK、Warning、Critical 之类

第七个字段要留意。同一份读数在不同厂商甚至不同版本上的级别判定会有差异。测试时要拿读数跟阈值自己算一遍,再去跟 BMC 报的级别对账,这一步在第一章 7.4 节有完整的例子。

Timestamp 那一列依赖 BMC 的时钟。开篇那次事故整篇说的就是它,时钟不对,这列的排序就全乱了,日志平台按时间窗过滤时会把新告警当成旧数据丢掉。

9.3 写满了怎么办

策略行为适用场合
循环覆盖写满之后覆盖最老的记录默认策略,多数机型如此
停止记录写满之后不再写,同时上报一条告警审计要求留存完整的场合
自动归档导出到本地或者远端之后再清少数机型提供

第二种策略要保证告警能送出去。日志满了机器又处于告警无法上送的状态,等于静默失效,是最坏的组合。测这条的时候故意把它填满,看它会不会吭声。

9.4 怎么送出去

方式用途测试要点
SNMP Trap推给监控平台在平台侧确认能收到,并且 community 或者用户名对得上
Syslog推给日志服务器看服务器上的时间戳和级别映射是否正确
邮件告警推到运维邮箱需要配 SMTP 服务器,测邮件服务器不通时是否有提示

Trap 那条最痛的地方在于平台侧。BMC 说自己发了,平台说自己没收到,两边都说对方的问题。判定的时候在中间抓一次包,看包到底有没有出网口,这个证据一拿出来争议就结束了。

9.5 日志这块测什么

测试项怎么验常见缺陷
事件产生人为制造告警,看有没有记录该记的没记
事件级别按 9.2 节的办法自己算一遍再对账级别判错
时间戳故意把时间改错一次,看记录是否同步时间错但是日志还是老时间
写入顺序短时间内连续制造多条排序混乱
溢出策略填满它静默失效,没有任何提示
清除清一次再看是否真的清空清不掉,或者连带清了别的
上送三种方式各配一次配好了不送,或者连不上没提示
权限只读账户能不能清除能清,属于越权

第三条和开篇那个故事串起来了。改时间之后新记录的时间戳应当跟着走,如果还停留在旧时间,说明两组时钟之间没打通。

10 BMC 时间设置

10.1 两个时钟

┌─────────────────────────────────────────────────────────┐
│ 时间设置牵着哪些功能                                    │
├─────────────────────────────────────────────────────────┤
│ BMC 有两个时钟,分工不同                                │
│                                                         │
│ ┌──────────────────────────────────────────────┐        │
│ │  硬件时钟 RTC        一粒纽扣电池续着        │        │
│ │  运行时钟            开机后自己在数          │        │
│ └──────────────────────────────────────────────┘        │
│                       │                                 │
│                       v                                 │
│ ┌──────────────────────────────────────────────┐        │
│ │  NTP 校准            间隔通常几分钟到几小时  │        │
│ │                      配了服务器地址才有校准  │        │
│ └──────────────────────────────────────────────┘        │
│                       │                                 │
│                       v                                 │
│ ┌──────────────────────────────────────────────┐        │
│ │  时区换算            有的机型只认 UTC 偏移   │        │
│ │                      夏令时跟不跟要问清楚    │        │
│ └──────────────────────────────────────────────┘        │
│                                                         │
│ 时间一旦偏掉,下面这些地方跟着一起乱                    │
│   SEL 排序错位,日志平台按时间窗过滤会把新告警丢掉      │
│   HTTPS 证书判不过期,Web 与 Redfish 直接拒绝访问       │
│   Trap 和 syslog 的时间戳不对,监控侧当成历史数据丢弃   │
│   升级任务的等待超时是按本地时间算的,可能提前判失败    │
└─────────────────────────────────────────────────────────┘

硬件时钟靠一粒纽扣电池续着,断电之后还在走。电池没电的时候每次断电都回到出厂时间,开篇那台机器就是这个情况。

NTP 配置这一层要留意。有的机型只认 IP 地址不认域名,配域名会静默失败,界面上不报错也不生效。诊断的时候先看 DNS 有没有配,再试着直接填 IP。

10.2 配 NTP 的几条经验

要点说明
服务器地址尽量填 IP,少一层 DNS 依赖
可达性配之前先在同网段其他机器上验证一下这个 NTP 服务器活着
同步间隔几分钟到几小时,有的是固定值不能改
时区设置有的机型只有 UTC 偏移,夏令时不会自动跟
防火墙UDP 123 端口要放行
降级行为NTP 服务器不可达时应当有明确提示

最后一行在实际项目里最有用。NTP 服务器不通,好的实现会报一条告警或者在界面上显示同步失败,差的实现什么也不说,时间一点一点飘走,等发现的时候 SEL 已经错了一大片。

10.3 时间错了会连带什么

开篇那次故事里已经串过一遍,这里列清楚。

受影响的功能表现
SEL 与操作日志时间戳错,排序和过滤失效
HTTPS 证书证书判未生效或者已过期,Web 与 Redfish 拒绝连接
SNMP Trap 与 Syslog远端平台按时间窗过滤时把数据丢弃
证书有效期新建证书的时间基准出错
任务超时判定升级之类任务的等待时间按本地时间算,可能提前判失败
双因子认证基于时间的一次性口令直接失效

第二行能解释很多诡异现象。当时浏览器弹出的那个证书无效提示,根源就是 BMC 的时间还在 2013 年,比证书的生效日期还早。

10.4 时间这块测什么

测试项怎么验常见缺陷
手动校时设一个时间,看是否立刻生效设完之后又要重启才生效
NTP 同步配好地址,等一个同步周期看是否对齐配了不同步,也没有提示
域名与 IP分别用两种形式配一次域名形式静默失败
时区改时区,看 SEL 记录的时间是否跟着变改了时区日志时间不变
断电保持断电几分钟再上电电池没电导致时间重置
改时间的影响故意改错,看上述六项功能表现功能连带失效
夏令时有的地区要测夏令时切换时的重复时间段是否处理正确

最后一行在国内项目基本用不着,出口设备的验收里偶尔被要求。接到这类需求先问清楚客户当地的规定,别自己猜。

11 存储设备管理

11.1 看到什么

┌──────────────────────────────────────────────────────────────┐
│ BMC 眼里的存储长这样                                         │
├──────────────────────────────────────────────────────────────┤
│ BMC 眼里的存储是一棵树                                       │
│                                                              │
│   /redfish/v1/Systems/1/Storage                              │
│     └── StorageId  1                仿真出来的控制器         │
│           ├── Drives                                         │
│           │     ├── Disk.Bay.0      盘位、型号、容量、状态   │
│           │     ├── Disk.Bay.1      由背板 SES 上报          │
│           │     └── Disk.Bay.2                               │
│           └── Volumes               也有机型把逻辑盘挂这儿   │
│                                                              │
│   这一层之上还有一条独立的路                                 │
│                                                              │
│ ┌──────────────────────────────────────────────────────┐     │
│ │  RAID 卡自己知道的     阵列级别、重建进度            │     │
│ │  BMC 能看到的          物理槽位、在位与否            │     │
│ │  两边对不上的地方      逻辑盘和物理盘的映射          │     │
│ └──────────────────────────────────────────────────────┘     │
└──────────────────────────────────────────────────────────────┘

Redfish 里这部分挂在 Systems 的 Storage 下面。要先提醒一句,这里那个 Storage 是虚拟出来的一层容器,它既不代表主板上的 SATA 控制器,也不代表 RAID 卡,用途是给 BMC 挂盘信息。

11.2 每条记录包含什么

字段含义
Name盘的名字,常见是 Disk.Bay.0 这类槽位编号
Model型号,部分机型读不到
CapacityBytes容量,单位是字节
Status.Health健康状态,OK 或者 Critical
ProtocolSATA、SAS、NVMe 之一
MediaType机械盘还是固态盘
Location槽位信息,定位时要看它

第五个字段很重要。NVMe 盘在一些老版本 BMC 上会被识别成 SATA,认错了不算功能缺陷,但会让资产统计的数据出错。

11.3 点灯与定位

找到某块盘之后,最常见的动作是让它亮灯,方便现场拔插。

操作说明测试要点
点亮定位灯让对应槽位的蓝灯闪起来灯应亮在场正确的槽位上
熄灭恢复常态点完之后能不能立刻停住
UID 灯整机的定位灯与槽位灯互不干扰
重启后是否保持多数会灭有的机型会保持,属于差异

第一条最容易出错的地方是对应关系错乱。软件上标的是 0 号槽,实际亮的是背板上的 1 号。批量换盘的场景里这个错位能把人搞到崩溃,务必逐个槽位核一遍。

11.4 与 RAID 卡的分工

这一节最容易被误解,单独讲清楚。BMC 看到的是物理存在,RAID 卡看到的是逻辑组织。接了 RAID 卡之后,两者对不上是常态。

  • 盘接入 RAID 卡之后,BMC 还能不能看到这块盘取决于背板走线和卡的 passthrough 支持
  • 组了阵列之后,BMC 侧通常看不到 Volume 这一层,要查阵列得进 RAID 卡自己的界面
  • 同一块盘在两边显示的健康状态有可能不一致,一边判成失效另一边还报正常
  • 更换一块盘之后两边更新状态的速度不一样,BMC 侧常常慢半拍

第三条不是缺陷,是两套视角的固有差异,但要写进验收说明里,免得客户拿两处不一致的地方当成问题开单。

11.5 存储这块测什么

测试项怎么验常见缺陷
盘的识别逐个槽位比对实际装机情况少认盘,或多出一个空槽位的记录
槽位对应拔掉某一块,看是否消失槽位错位
点灯逐个点亮亮错槽位,或者根本不亮
热插拔带电拔插,看识别是否跟上拔了不更新,插回去认不到
协议类型NVMe、SAS、SATA 各测一种协议认错
健康状态人为造一块坏盘状态不更新
与 RAID 卡一致性组阵列之后两边一起读差异没在文档里说明
背板在位拔掉背板线缆不报故障

12 BMC 看门狗功能

12.1 两个方向

┌────────────────────────────────────────────────────────┐
│ 看门狗盯的是谁                                         │
├────────────────────────────────────────────────────────┤
│ 两个方向完全不同的看门狗                               │
│                                                        │
│   A  主机看 BMC 有没有活着                             │
│       BMC 自己喂自己的狗,跑飞了就重启 BMC             │
│                                                        │
│   B  BMC 看主机有没有活着                              │
│       主机上的软件隔一会儿喂一次,喂不上说明系统卡住   │
│                                                        │
│       ┌── 喂一次,倒计时清零重来                       │
│       │                                                │
│       └── 一直不喂,就往下数到零                       │
│ ┌────────────────────────────────────────────────┐     │
│ │  倒计时归零,触发预设动作                      │     │
│ └────────────────────────────────────────────────┘     │
│                                                        │
│    ├── 什么都不做    只报一条记录,现场原样留着        │
│    ├── 硬复位        最常用的一条                      │
│    ├── 整机下电      避免硬件受损,会丢数据            │
│    └── 断电再上电    最彻底,代价也最大                │
│                                                        │
│ 四个动作里第 2 条用得最多,第 4 条最伤人               │
└────────────────────────────────────────────────────────┘

第一类是 BMC 自己的看门狗。它盯着 BMC 上跑的软件,软件跑飞了没有按时喂狗,就重启整个 BMC。这种重启对用户一般不可见,只能从日志或者启动次数上发现。

第二类是 BMC 盯着主机。主机上装一个喂狗的程序,定期给 BMC 发一个信号,发不出来说明操作系统卡住了或者进程死了,BMC 按预设的动作去处理。这一类才是我们在测试里打交道最多的。

12.2 超时动作

动作行为什么时候用
No Action只报一条记录,不动手排障阶段,先看它到底会不会触发
Hard Reset给主机一个复位信号绝大多数生产场合选这个
Power Down下电并保持担心复位会把数据写坏的场合
Power Cycle下电再上电复位处理不了的深层卡死

第二条和第四条的差别在实践中很明显。Hard Reset 只是拉一下复位线,某些卡住的外设要彻底断电才肯认错。碰到复位之后现象照旧的场景,试试第四条。

12.3 四个容易搞错的点

这四个点我自己全踩过,按踩坑的先后顺序记下来。

计时器的单位。多数实现以百毫秒为单位下发超时值,配 100 不代表 100 秒。第一次接手一定要制造一次真实的超时,把实际用时记下来。

启动之后是否自动开始。有的实现配完立刻开始计时,有的要再下发一次启动命令。这两者对使用流程的影响差别很大。

停止之后还会不会继续计数。规范上 stop 之后应当冻结,部分实现会继续走,这样再往下一步就触发了本不该触发的动作。

BMC 重启之后的设置。如果期望看门狗长期生效,要确认 BMC 重启之后它的配置还在,有的机型会回到关闭状态。

12.4 看门狗测什么

测试项怎么验常见缺陷
计时准确设一个短超时,量实际触发时间单位理解错,差一个数量级
四种动作逐个配一遍,观察结果配了 A 实际执行 B
喂狗在超时前喂一次,看是否重新计时喂了不生效,照样超时
停与启停之后数一下,启之后再数一下stop 之后仍在计数
BMC 重启后重启 BMC 再看配置配置丢失,回到关
与系统配合装一个真实的喂狗程序系统负载高时喂不上导致误重启
日志留痕触发之后去查 SEL没有任何记录

第六条经常在项目后期才暴露。喂狗程序跑在用户态,系统负载满的时候调度不出来,没按时喂上,于是机器没等到喂养信号就被重启了,现象看上去特别像硬件故障。

13 电源设备管理

13.1 四件事

┌──────────────────────────────────────────────────────────────────┐
│ 电源设备管理管到哪一层                                           │
├──────────────────────────────────────────────────────────────────┤
│ 供电这块 BMC 能管的事                                            │
│                                                                  │
│ ┌────────────────────────────────────────────────────────┐       │
│ │  读      每个模块的输出功率、输入电压、温度            │       │
│ │  控      冗余策略、冷备份开关、分区下电                │       │
│ │  限      整机功耗封顶,压住 CPU 频率换功耗             │       │
│ │  记      峰值、均值、累计能耗                          │       │
│ └────────────────────────────────────────────────────────┘       │
│                             │                                    │
│                             v                                    │
│ ┌────────────────────────────────────────────────────────┐       │
│ │  恢复策略            市电恢复之后机器该怎么办          │       │
│ │  三种选项            保持关机、恢复上次状态、总是开机  │       │
│ └────────────────────────────────────────────────────────┘       │
│                                                                  │
│ 最后这项写在说明书里,但每批客户的验收要求都不一样,排期前先问   │
└──────────────────────────────────────────────────────────────────┘

读数的部分在测试里用得最多。每个电源模块的输出功率、输入电压、自身温度都能读出来,Redfish 上在 Chassis 的 Power 资源里。

要交付给客户的能耗数字,我一律拿外置功耗仪对一遍再写进报告。BMC 自己读的和实际入线侧的功率差着一部分电源转换损耗,两边对不上是正常的,但报告里要写清楚取的是哪一个口径。

13.2 冗余模式

模式行为怎么验
满配冗余 N+N每个模块承担一半负载拔掉一路,另一路立刻承担全部
N+1 冗余有一个多余的模块备着拔掉一路不影响运行
冷备份备份模块处于轻载或者待机主模块故障后切换有切换时间
无冗余一路都不敢坏拔一路就掉电,验收时要确认客户知情

切换时间这一项在有精密设备的场景里是硬指标。切换过程中电压跌落如果超过设备的容忍范围,设备会跟着重启。测的时候要接示波器或者用带记录的万用表盯着输出电压。

13.3 功耗封顶

功耗封顶是给整机设一个功率上限,超过之后 BMC 会通过降频或者其他手段把功耗压下来。

测试点怎么验
设值与生效设一个明显低于当前功耗的值,看整机是否被压下来
生效时间从设值到功耗落下去,中间要多久
性能影响压下来之后跑一轮基准测试,看性能掉了多少
边界设在额定功率附近,看会不会触发保护性关机
保持重启之后这个值还在不在

第三条要提前跟客户对齐。封顶确实省电,但性能下降的幅度经常超出预期,没沟通过就设上去,后面业务侧找过来才发现是被自己锁了频率。

13.4 上下电策略

策略行为适合谁
保持关机市电来了也不动要人工确认才敢加电的场合
恢复上次状态断电前是开着的就自动开绝大多数客户的默认值
总是开机来电就开要求随时在线的服务

这个策略在验收时经常被要求配置成特定值。改完之后要真的做一次断电再来电的完整验证,别只看界面上选了哪一项。有的机型改了之后需要彻底断电一次才会按新策略走。

13.5 电源这块测什么

测试项怎么验常见缺陷
读数精度与钳形表或功耗仪比对偏差超过百分之十
模块在位拔掉一路,看是否立刻识别拔了半天才报
冗余切换拔掉主用的一路切换失败,机器直接掉电
告警上送制造电源故障告警产生了但没送出去
功耗封顶按 13.3 的五项设了不生效
上下电策略三种各做一次完整断电改了策略不生效
分区管理多 PSU 机型插拔各个模块模块之间的角色识别错

14 这些功能是互相咬着的

前面一节一节讲完了,最后一节把它们串起来看。这是我在开篇那次事故里学到的东西,功能之间不是平铺的关系。

14.1 一张连带关系表

改动左边的操作时,右边的东西可能跟着变。

你做的动作可能连带到的功能
改网络配置NTP 断掉,进而时间漂移,进而证书失效
改时间SEL 排序错乱,Trap 被平台丢弃,任务超时判定错
恢复出厂NTP、告警目标、用户全丢,告警送不出去
刷固件部分配置项被重置,纵或者直接掉落 license
改风扇模式转速渐变过程中温度先冲高,可能触发温度告警
挂虚拟介质与键鼠抢 USB 通道,KVM 输入失效
开 KVM占用会话和内存,挤占其他接口的资源
关 SNMP依赖 Trap 的告警通道全断,故障 snapshot 送不出去
改用户角色依赖该账户的巡检脚本失效

第一行和第二行构成了一个环。改网络导致 NTP 不可达,NTP 不可达导致时间漂移,时间漂移导致证书失效,证书失效之后你连回去改网络的通道都没了。开篇那天的处境就是这一串的最后一步,只不过当时是从废弃的电池开始的。

14.2 一轮功能回归的顺序

按第一行的前提往下排,可以省掉很多莫名的失败。

顺序阶段内容
1先把底座建好网络、时间、NTP、证书,确认三样都通
2只读功能传感器、存储、电源读数、日志读取
3用户与安全角色、密码策略、会话、证书开局
4远程控制台KVM、SOL、虚拟介质
5控制类风扇调速、功耗封顶、看门狗
6状态改变保存配置、恢复出厂、导出导入
7固件更新刷固件、回退、版本确认
8收尾恢复现场、清会话、导出日志和报告

第 3 步放在前面是有讲究的。先确定账户能用、会话够用,后面那些要登录的操作才跑得下去,不然跑到一半开始报会话耗尽,很难判断到底是功能有缺陷还是环境被自己搞乱了。

第 6 步之前一定要先导出一份完整配置。恢复出厂之后想回头看原本配了什么,那份导出文件是唯一的凭据。

14.3 三条经验

改之前先导出。这条在文中的三个地方出现过,导出配置花两分钟,能省掉之后半天重新配的时间。

改完回头再读一次。同一个设置在改它的那个入口上看,永远显示成功。到另一个入口再读一次才算真的验证过。跨入口不一致是最容易挖到东西的地方,也是最容易漏的地方。

涉及网络和时间的操作给自己留一条回去的路。双窗口改 IP、保留网络设置的恢复粒度、手边放着上一版固件包,本质上是同一件事,都是在给操作留退路。远程机房上没有退路的操作,一次都嫌多。

小结

这一章把 BMC 的十三个功能逐个过了一遍,从最底下的芯片和 DC-SCM 模块开始,一直到最后一层电源管理。每个功能都给了它在 Redfish、IPMI 和 iBMC 上的入口,配了一张图和至少一张测试要点表。

讲的时候有一条暗线。这些功能不是平铺的按钮,它们互相咬着。改网络会扯到 NTP,NTP 扯到时间,时间扯到证书,而证书一断,连回去改网络的通道都没了。开篇那个故事从头到尾讲的就是这条链。

最后一节给了一张连带关系表和一份回归顺序。真正到项目里能原样照搬的情况不多,更多是挑其中几项按手上的机型裁一轮,但顺序这条原则不会变,先把底座稳住,再去碰会动状态的东西。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐