第二章 BMC功能介绍
第二章 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,市面上这几代最常见。
| 芯片 | 主频与核数 | 内存 | 主要出现场合 |
|---|---|---|---|
| AST2400 | ARM926 单核,400MHz | DDR2/DDR3,最大 512MB | 老机型,现在多为维护状态 |
| AST2500 | ARM11 单核,800MHz | DDR3/DDR4,常见 512MB | 存量最大的一代 |
| AST2600 | 双核 Cortex-A7,1.2GHz | DDR4,常见 1GB | 近几年新机型的主力 |
| AST2700 | 多核 Cortex-A55 | 更大 | 新平台,支持更多 PCIe 相关能力 |
换代带来的变化不止在性能上。AST2600 之后多了一批安全相关的东西,比如把信任根的校验流程固化进芯片,老型号上这些得靠外围电路和软件实现。
还有一类芯片不是 Aspeed 出的,Nuvoton 的 NPCM 系列在部分厂商机型上也能碰到,功能和引脚大体相当,但命令行工具和私有接口就完全是另一套了。接手新机型第一件事就是确认芯片型号,很多坑都跟它有关。
1.2 资源有多紧张
BMC 跑的是嵌入式环境,资源比想象中少,很多奇怪的现象根源就在资源上。
| 资源 | 常见规格 | 紧张时会怎样 |
|---|---|---|
| Flash | 32MB 到 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 的控制台输出。
| 对比 | KVM | SOL |
|---|---|---|
| 传输内容 | 像素 | 字符流 |
| 带宽占用 | 高,几十 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.Health | BMC 自己判的健康状态 |
清零和卡住是两个不同的缺陷。风扇停了读数当然是 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 都开着哪些口
| 服务 | 端口 | 默认 | 该不该开 |
|---|---|---|---|
| HTTPS | 443 | 开 | 必开,Redfish 和 Web 都靠它 |
| SSH | 22 | 开 | 有命令行需求就开,不用就关 |
| SNMP | 161 查询,162 Trap | 关 | 要接监控平台才开 |
| IPMI over LAN | UDP 623 | 开 | 安全审计里经常被要求关 |
| 虚拟介质 | 私有端口,各厂商不同 | 开 | 不用的时候建议关 |
| KVM | 同上 | 开 | 同上 |
| Telnet | 23 | 关 | 不要开,明文传输 |
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 |
| Protocol | SATA、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 扯到时间,时间扯到证书,而证书一断,连回去改网络的通道都没了。开篇那个故事从头到尾讲的就是这条链。
最后一节给了一张连带关系表和一份回归顺序。真正到项目里能原样照搬的情况不多,更多是挑其中几项按手上的机型裁一轮,但顺序这条原则不会变,先把底座稳住,再去碰会动状态的东西。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)