ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

UEFI裸机硬件自检工具:21项测试搞定系统前故障排查

UEFI裸机硬件自检工具:21项测试搞定系统前故障排查 做运维的人大概都有过这种经历一台裸金属服务器开不了机或者装系统装到一半反复报错你在机房蹲了大半天到底是内存坏了、CPU 底座接触不良还是 PCIe 卡槽松动完全要靠猜。系统进不去AIDA64、HWiNFO 这类常规检测软件全用不上只能靠固件报错声和一次次换硬件碰运气。这个痛点我忍了很久市面上能用的免费方案要么只测内存、要么必须先进操作系统始终没找到一个能在 UEFI 阶段就把整台裸机完整过一遍自检的工具。所以去年我干脆自己动手写了一个基于 UEFI 运行环境的整机自检工具内置 21 项测试覆盖 CPU、内存、存储、PCIe、网络、外设和板级传感器全程图形化可视跑完一键导出报告。这篇文章就把我写这个工具的完整逻辑捋一遍为什么自检要放在 UEFI 阶段做、21 项测试是怎么设计出来的、可视化界面在 UEFI 下如何实现、报告格式怎么定以及在真机平台上踩过的那些坑。适合服务器运维、二手硬件验机的朋友参考也适合对 UEFI 底层开发感兴趣的工程师拿去做个起点。1. 裸金属排障的尴尬处境系统进不去拿什么验硬件1.1 操作系统层面工具查不出的三类故障很多人习惯先用系统自带工具检测硬件但只要你在机房处理过裸金属故障就会发现有相当一部分硬件问题在操作系统里面是测不出来的或者说测出来的结果非常具有迷惑性。第一类是间歇性故障。内存位翻转就是典型系统日志里偶尔出现一次 machine check exception或者某个进程莫名 segfault你跑 memtester 跑了一晚上全绿以为没事结果过两天又崩一次。这类故障在操作系统里看起来像软件问题实际上是硬件在特定地址、特定温度下才触发的时序不稳定性。第二类是被驱动掩盖的故障。PCIe 链路不稳定时操作系统里的 AERAdvanced Error Reporting机制会在后台自动做链路降级或重训练用户根本感知不到直到某天 NVMe 固态硬盘突然掉盘dmesg 里只剩一堆 misleading 的 reset 日志。类似的情况还有网卡降速、USB 设备周期性掉线很多都是物理层问题但驱动层面的容错机制把症状吃掉了。第三类是系统根本无法启动的故障。机器通电后卡在 POST 自检阶段或者固件 logo 一闪而过就黑屏这时候任何基于操作系统的工具都是空中楼阁连 PE 引导盘都未必能进去。你只能靠 POST 蜂鸣码、诊断灯、或者一块一块拔硬件做排除法。这三种场景共同指向一个事实硬件故障排查需要一层比操作系统更底层的、独立于驱动的检测环境。UEFI 恰好就是这层环境。1.2 为什么 UEFI 阶段才是裸机体检的最佳时机UEFIUnified Extensible Firmware Interface在操作系统加载之前运行它有几个对硬件排查非常有利的特性。首先是硬件资源尚未被操作系统抽象。在 UEFI 环境下PCIe 设备还没被操作系统分配中断和 DMA 通道内存映射表也更接近物理真相。检测时看到的是设备最原始的状态比如 PCIe 链路协商宽度是 x1 还是 x16这是硬件上电后的真实握手结果不会被驱动重新协商覆盖。其次是故障暴露更直接。UEFI 下没有内核的容错机制没有设备驱动层层兜底链路不稳就是链路不稳读不到寄存器就是读不到。做内存测试时UEFI 阶段可以直接操作物理地址空间不需要考虑操作系统虚拟内存的干扰做 CPU 压力测试时所有核心都处于完全可用的裸状态不存在系统调度器的负载均衡。第三是适用范围极广。只要主板支持 UEFI无论有没有装系统、无论装的是 Linux 还是 Windows、无论硬盘是不是空的这个工具都能跑。对裸金属服务器来说还没装系统恰恰是硬件验收最关键的时机——在一台全新服务器上架之前在系统安装完成之前把所有硬件子系统过一遍比事后在系统里发现问题再返工划算得多。1.3 现有免费方案为什么都不够整机写这个工具之前我把市面上的免费方案盘了一遍结论是各有各的局限。MemTest86 免费版功能本身不错能测内存的多种寻址模式但它的定位是内存专项测试不关心 CPU 微码是不是 ES 版、不关心 NVMe 的 SMART 健康状态、不关心网卡 PHY 是否异常。UbcdUltimate Boot CD这类救援光盘把很多零散工具打包在一起但界面各异、测试结果格式混乱想在一台机器上跑完所有项目然后汇总成一份报告基本做不到。商业方案倒是有的比如 PC-Doctor 和 BIOS 厂商自带的诊断工具功能齐全、界面也漂亮但要么跟随整机厂商预装要么单独采购授权普通运维团队很难拿到更别说把它用到二手服务器验机、批量上架前体检这种场景里。所以我决定自己写一个面向裸金属整机自检的 UEFI 应用。目标很明确第一覆盖核心硬件子系统而不是只盯着内存第二全部测试在 UEFI 阶段完成不依赖操作系统第三跑完能自动出一份统一格式的报告谁都能看懂。2. 21 项测试的取舍逻辑每项测试盯住一类硬件故障2.1 21 项测试完整清单自检工具的核心不是界面而是那 21 项测试到底测什么、为什么这样测。我把硬件子系统拆成六个组每个组里再筛出最值得测的项目。完整清单如下编号测试项分组检测目标T01CPU 型号与微码读取CPU型号、步进、微码版本是否正常T02CPU 逻辑核心一致性校验CPUMP 协议枚举核心数与固件配置是否一致T03AVX2/AVX-512 计算稳定性CPU多核饱和计算下是否有指令错误T04缓存一致性遍历CPUL1/L2/L3 Cache 读写与一致性T05AES-NI 指令集自检CPU密码学指令是否有异常T06内存基础读写扫描内存全物理地址空间 64 位图案读写T07内存随机寻址测试内存地址线译码是否存在坏地址T08内存位翻转压力测试内存Walking 1s/0s 模式下的数据完整性T09ECC 错误状态读取内存内存控制器错误寄存器是否有累计 CE/UET10NVMe 设备枚举与 Identify存储NVMe 控制器是否正常响应 IdentifyT11SATA 设备识别存储端口状态、设备型号与容量识别T12存储连续读写测试存储大块顺序读写是否出现错误T13存储随机 4K 读写测试存储小块随机寻址读写延迟与正确性T14SMART 健康信息读取存储通电时间、重映射扇区、异常断电计数T15PCIe 链路宽度协商检查PCIe实际链路宽度与插槽设计值是否一致T16PCIe 设备完整枚举PCIe遍历 BDF 地址检测设备是否全部识别T17网卡 PHY 回环测试网络网卡物理层自环发包与接收T18USB 控制器与设备枚举外设根端口、设备数量与控制状态T19串口回环测试外设串口自发自收是否可用T20温度/风扇/电压读数板级传感器读数是否在合理范围T21RTC 时钟校准与 CMOS 校验板级CMOS 校验和、RTC 走时偏差2.2 内存测试的核心原理地址线、数据线与位翻转内存测试看起来简单——写一个数进去再读出来对比——但要真正暴露硬件问题测试模式设计是很讲究的。基础读写扫描T06的作用是发现数据线短路或断路。我会对每个可用的物理内存地址写入若干组固定的 64 位图案比如 0x5555555555555555 和 0xAAAAAAAAAAAAAAAA然后读回比对。如果某一位永远读出来是 0 或者永远是 1说明数据线上有物理损伤。随机寻址测试T07针对的是地址线故障。地址线的某一条如果断了或者虚焊会出现两个不同地址映射到同一个物理位置的情况。我用伪随机数生成器在地址空间里随机挑点写桩值再回到这些位置验证如果地址线有故障桩值会在错误的位置出现。位翻转压力测试T08是内存测试里最有价值的一项。做法是经典的 Walking 1s/0s让一个 1 在数据字的每一位上移动同时其他位全是 0然后反过来让 0 移动。这种模式能在相邻位之间制造最大程度的信号翻转最容易触发串扰导致的位翻转。真实场景里遇到过的内存冷热故障、电容老化导致的数据保持时间不足基本都能靠这一项暴露。需要提醒的是UEFI 阶段做内存地址扫描必须避开 MMIO 映射区域和 Runtime 服务占用的内存。我的做法是先通过 GetMemoryMap 拿到完整的物理内存描述把 EfiReservedMemoryType、EfiRuntimeServicesData 这些不可写区域全部排除只在 EfiConventionalMemory 范围内做读写否则测试过程可能直接把固件写崩。2.3 CPU 压力测试在 UEFI 下怎么做CPU 检测主要做两件事身份信息的真实性校验以及计算稳定性的压力验证。T01 的型号和微码读取是很多人会忽略的一点。在二手服务器市场ES 版Engineering SampleCPU 冒充正式版的情况并不少见我就在一台所谓全新拆机服务器上遇到过 CPUID 显示的 Stepping 和 MSR 里的微码版本对不上号的情况。通过 CPUID 指令读取 Family/Model/Stepping再和 SMBIOS Type 4 里的 Processor ID 字段交叉比对基本能判断 CPU 是不是正式版。压力测试的实现和操作系统里完全不同。操作系统里你可以开 N 个线程让调度器去分配但在 UEFI 裸环境下没有调度器需要借助 MP Services Protocol 来枚举所有应用处理器AP然后在每个 AP 上执行一个独立的自旋循环。循环里我混入三类运算整数饱和运算、AVX2 浮点运算、AES-NI 指令的回环加解密这样能同时覆盖 ALU、FPU 和专用指令单元。每次迭代都会校验结果是否与预期一致任何一个 AP 有任何一次校验失败立刻标记 FAIL 并记录失败时的核心编号。T04 缓存一致性遍历踩过一个坑如果只是在单个核心上读写 Cache并不能暴露多核之间缓存同步的问题。正确做法是通过 MP Protocol 在所有核心上同时发起对同一组缓存行的读写制造缓存一致性协议MESI的高频竞争这样才能发现某些主板在特定内存拓扑下的缓存同步隐患。2.4 存储与 PCIe容易被 OS 驱动掩盖的问题存储测试组里NVMe 的枚举T10和 SMART 健康读取T14是我在二手服务器验收里最看重的一项。通过 NVMe Admin Command 的 Identify 命令可以拿到控制器型号、固件版本、命名空间大小这些基础信息通过 SMART/Health Information 命令能直接读取通电小时数、重映射扇区数、Unsafe Shutdowns 计数等关键寿命指标。一套组合下来矿盘、清零盘基本无所遁形。存储读写测试T12/T13的实现需要非常谨慎。UEFI 阶段没有文件系统的概念至少默认没有也不能假定测试设备上有可用的分区表所以我只对块设备末端的若干个扇区做直接读写并且测试前会读取并保存这些扇区的原始数据测试完成后恢复原样。大概步骤如下枚举块设备通过 Block IO Protocol 拿到设备句柄和总扇区数。跳过设备前 1% 和系统 EFI 系统分区可能涉及的区域选择末端的 1024 个扇区作为测试区域。先读取并缓存原始内容再执行连续写读校验最后把缓存的数据写回。如果严格按照这套流程即便机器里已经装了系统也不会破坏磁盘数据。但我在文章后面会强调任何裸设备层面的读写都有风险强烈建议在确认盘上无重要数据后再跑完整存储测试。PCIe 链路宽度协商检查T15是一个常常被忽略但很有价值的测试。实现逻辑很简单遍历 PCIe 设备的配置空间读取 Link Capabilities 寄存器里的最大协商宽度和 Link Status 寄存器里的当前协商宽度两者对比。实际排障中我遇到过 x16 插槽只协商到 x1 的情况——外观上看显卡和 NVMe 转接卡都插得好好的开机进系统也一切正常但性能就是上不去。后来拆下来发现金手指上有明显氧化痕迹重新插拔后才恢复 x16。这种问题如果不在 UEFI 阶段主动检查链路状态进了系统往往容易被当成驱动问题排查半天。3. 全程可视化UEFI 环境下的图形界面是怎样搭起来的3.1 用 GOP 画界面而不是用调试文本输出很多 UEFI 工具默认用 ConOut 输出文本黑底白字的列表看起来像 BIOS 设置界面。你可以说这是可视化但和用户看到的全程可视化不是一回事。我做这个工具的时候从一开始就决定用图形模式。UEFI 标准里负责图形输出的是 GOPGraphics Output Protocol。通过 Boot Service 的 LocateProtocol 拿到这个协议后可以用 QueryMode 枚举固件支持的图形模式然后 SetMode 切换到目标分辨率。之后所有的绘制都是通过 BltBlock Transfer操作完成——本质上就是往 framebuffer 里写像素。界面布局我参照了现代检测工具的信息架构左侧是 21 项测试的分类列表右侧是当前测试项的详细信息和状态底部是整体进度条和当前操作状态。每一项测试跑完左侧对应条目会立刻变绿PASS、变红FAIL或变黄WARN视觉反馈非常直观机房现场不用凑近屏幕看细节也知道结果。3.2 双缓冲刷新、字体渲染与分辨率适配GOP 虽然能用但直接往 framebuffer 写像素有几个实际问题其中最麻烦的是闪烁。如果每一帧都先清屏再逐项绘制在高分辨率下1920x1080 甚至更高会出现明显的闪烁和撕裂。解决方案是双缓冲先在内存里开一块和屏幕分辨率对应的缓冲区所有绘制操作都在缓冲区里完成全部画完之后通过一次 Blt 操作把整帧拷贝到 framebuffer。这样既避免了闪烁也把绘制逻辑和硬件输出解耦了。字体渲染是另一个容易被低估的工作。UEFI 固件本身不提供中文字体库英文的 Glyph 也可能只是文本模式下的简易字符。我的做法是内置了一个 8x16 的 ASCII 位图字体数组再额外嵌入了大约 200 个常用汉字的最小像素字体用于界面标题和状态描述。如果你自己实现这个工具字体是绕不开的一步——可以直接把开源点阵字体转换成 C 头文件数组也可以用 UEFI 的 HII Font Protocol但后者对自定义字体的支持有限。分辨率适配方面我不会硬编码某个分辨率而是启动时枚举 GOP QueryMode 支持的列表优先选择 1920x108032bpp如果没有则按 1024x76832bpp 兜底。之所以优先 32bpp是因为这个像素格式下 Blt 效率最高同时能直接用 32 位整数做颜色混合。3.3 进度展示与长时间运行时的稳定性细节可视化不只是把界面画出来还包括让用户随时知道测试进行到哪一步、还要多久。进度条我用了两级显示一级是 21 项测试的总体进度已通过项目数/总数二级是当前测试项的内部进度比如内存测试跑到地址空间的 37%、存储读写测试完成扇区数。这里有一个在 UEFI 环境下的隐藏坑长时间在图形模式下不操作某些平台的显示控制器会进入节电状态表现为屏幕变暗甚至黑屏但实际上程序还在跑。我的对策是设置一个定时器事件每 30 秒主动触发一次全屏重绘即使画面没有变化也通过 Blt 操作保持显示控制器活跃。另一个和可视化相关的细节是崩溃回退。图形模式下如果碰到异常分支导致旧帧残留用户会误以为程序卡死实际上可能是一个测试项在等待设备响应。所以我在工具里加了一个基于串口的调试输出通道图形界面出现任何可疑状态接上串口线就能看到详细日志不至于完全黑盒。4. 一键出报告自检结果如何变成运维能直接看的文档4.1 报告写到哪里FAT32 文件系统的读写处理可视化是给人看的报告是给流程用的。自检结束后工具会把结果写到外接 U 盘上这样不需要任何网络设施也不需要额外的管理通道。写入操作依赖 UEFI 的 Simple File System Protocol但这里有一个非常现实的兼容性问题UEFI 固件对文件系统的支持是有限的。绝大多数主板内置的 FAT 驱动只支持 FAT12/FAT16/FAT32NTFS 和 exFAT 即便能识别也往往只能读不能写或者干脆不识别。所以我的工具在启动时会扫描所有 Block IO 设备找到第一个可写的 FAT32 分区作为报告输出目标如果找不到报告会暂存在内存中并持续提示用户插入 U 盘。这也是我在文档里特别标注的一点和网上UEFI 引导 U 盘到底该用 FAT32 还是 NTFS的争论一脉相承如果你要让 UEFI 应用在启动阶段读写文件老老实实用 FAT32兼容性最好NTFS 在 UEFI 阶段是个不可控因素。4.2 报告格式设计文本可读、JSON 可解析报告文件我设计了两个版本一个纯文本版report.txt直接给人和工单系统看一个 JSON 版report.json给后续自动化系统解析。文本版长这样 UEFI 整机自检报告 生成时间 : 2026-05-20 14:32:08 固件厂商 : American Megatrends 固件版本 : 2.4 机型 : Supermicro SYS-6029U-TR4 序列号 : S2930X123456 T01 CPU 型号识别 [PASS] Intel Xeon Silver 4114 2.20GHz T02 CPU 核心一致性 [PASS] 10 核心 / 20 线程 T03 AVX-512 计算稳定性 [PASS] 全部 AP 通过饱和运算校验 ... T21 RTC 时钟校准 [WARN] 偏差 1.5 秒/天 结果: 20 PASS, 1 WARN, 0 FAILJSON 版本会结构化成数组每一项包含测试编号、测试名、结果、关键参数和时间戳。运维侧可以通过解析 JSON 把它接入现有的自动化验收脚本做成自检通过才允许装机的流程节点。4.3 PASS/FAIL/WARN 判定规则与阈值设置报告不是简单地记录测试跑没跑每项测试都得有明确的判定规则否则不同的人看同一份报告会有不同的理解。我的阈值设置参考了几个方向厂商规格书、行业经验值、以及固件本身的报警阈值。举个例子RTC 时钟校准T21的判定规则是测量 10 秒实际走时偏差小于 0.5 秒/天为 PASS0.5 到 2 秒/天为 WARN超过 2 秒/天为 FAIL。这里 WARN 的意义在于提醒使用者注意主板上的 RTC 电池可能快没电了但短期内不影响服务器使用因为 NTP 能纠正。温度读数T20则结合了 CPU Tcase 规格和风扇策略CPU 温度低于 70 度为 PASS70 到 85 度为 WARN85 度以上为 FAIL。这里 WARN 的含义是当前散热条件不够好需要检查散热器安装或机柜风道而 FAIL 则意味着硬件已经在危险温度边缘必须立刻处理。判定阈值不应该写死在代码里而是放在工具内置的配置表中。不同机型可以后续通过配置文件调整阈值这样工具在不改代码的情况下也能适配台式机、工作站、刀片服务器等不同散热条件。5. 真机测试与踩坑记录从 EDK2 到实机平台移植5.1 EDK2 环境的搭建与 X64 构建流程UEFI 应用开发目前最成熟的方案是 EDK2EFI Development Kit II。我第一次接触 EDK2 的时候构建环境花了两天踩了无数坑这里直接把正确流程捋一遍。下载 edk2-stable 版本后需要安装几个基础依赖GCC 工具链、NASM 汇编器、以及 Python 3。EDK2 的构建系统依赖 Python 的 edk2-basetools 库版本匹配很重要建议直接用 pip 安装 edk2-basetools 而不是自己下源码编译。构建命令的核心逻辑很简单# 初始化子模块 git submodule update --init --recursive # 设置环境变量 . edksetup.sh # 编译基础工具 make -C BaseTools # 配置编译选项在 Conf/target.txt 里修改 TARGET_ARCH 为 X64TOOL_CHAIN_TAG 设为 GCC5 build -p MySelfTestPkg/MySelfTestPkg.dsc -b RELEASE输出是一个 .efi 文件把它放到 FAT32 的 U 盘里在 UEFI Shell 里执行即可运行。如果想开机自动运行可以在固件里注册为启动项或者在 Shell 的 startup.nsh 里加上启动命令。5.2 内存映射冲突、GOP 初始化失败与显示超时真正让我头疼的不是编译而是实机平台上的兼容性问题这里分享三个最有代表性的坑。坑一内存测试把系统测死了。第一次在 Supermicro X11 平台上跑内存扫描跑到一半系统直接挂起连串口都没有输出。定位了很久发现是我自己太蠢——我在遍历物理内存时没有过滤 RuntimeServicesData 区域直接往固件 Runtime 服务占用的内存页里写数据把固件的运行时数据写坏了。修复方案就是我前面说的任何内存测试开始之前用 GetMemoryMap 把所有非 EfiConventionalMemory 的区域标记为禁止访问测试代码里再做一个二级校验防止因内存映射变化导致越界。坑二GOP 在部分平台初始化失败。有些早期 UEFI 主板比如某些只用集成显示输出的入门级服务器主板GOP QueryMode 返回的状态码是 EFI_UNSUPPORTED或者枚举出的模式列表是空的。这时候如果程序直接崩溃退出用户看到的就是黑屏。我的处理是做了三层回退GOP 不可用就回退到 ConOut 的文本绘图用简单的 ASCII 界面展示测试进度文本输出也没有就用串口输出串口都没有那就只能靠日志文件了。这个回退链在真实排障中很有用。坑三压力测试时 UEFI 环境没有风扇转速控制。在操作系统里BIOS 和 IPMI 会协同管理风扇转速CPU 负载高时自动提转速散热。但 UEFI 应用自己跑 CPU 压力测试时有些平台的风扇策略还停留在 POST 阶段的低速模式AVX-512 满载跑 30 秒就可能温度冲到 100 度。这个我之前确实吃过亏。后来我在工具里加了一个测试前热身检测先空载读取各传感器温度如果环境温度已经超过 45 度直接建议用户先手动进 BMC 把风扇转速调到最高再跑。做压力测试的机器一定要在散热良好的环境下运行这不是免责声明是真会烧硬件的。5.3 两个实用案例工具揪出的真实硬件故障在几个月的实机测试里这个工具确实查出过一些有意思的问题。一个案例是某台用了一年多的服务器日常运行稳定但偶尔会在凌晨负载低的时候突然重启。系统日志里只能看到硬件看门狗超时没有其他信息。我用工具跑了一遍完整自检T09 ECC 错误状态读取直接发现了问题内存控制器里有几十个可纠正错误CE计数但全部集中在同一根内存条的同一个 bank。拆下来用显微镜看触点上有轻微氧化。重新插拔后清零计数问题消失。这类积累型的硬件退化在操作系统里基本无感但通过 UEFI 阶段的 ECC 寄存器读取能提前预判。另一个案例是二手平台上买的所谓99 新服务器开机正常进系统正常CPU 性能跑分也正常。但 T14 SMART 健康信息读取一跑直接露馅NVMe 盘的通电时间计数被清零过但 Wear Leveling Count 已经到 87Unsafe Shutdowns 累计了 200 多次典型的矿盘翻新。如果没有这项检测这块盘可能直到坏了才发现有问题。5.4 USB 介质与 FAT 兼容性注意事项和 USB 介质相关的细节多说两句。UEFI 阶段对 USB 设备的支持主要看 XHCI 控制器驱动是否加载完整我实测下来U 盘直接插机箱前置 USB 3.0 口偶尔会出现枚举超时插后置 USB 2.0 口反而稳定。这在做现场测试时是个很实用的建议尽量用后置 USB 2.0 口跑 UEFI 工具。另外如果 U 盘上做过多个分区比如一个 FAT32 引导分区加一个 exFAT 数据分区部分固件在识别分区表时可能会有问题。我的工具会遍历所有支持的分区而不是只认第一个但如果你在使用中遇到插上 U 盘却提示找不到 FAT32 分区先检查是不是有多分区或者 GPT 分区表损坏的问题。6. 免费方案的边界这套工具适合谁、不适合谁6.1 与现有检测工具的横向对比把自研工具的定位放在整个硬件排障工具生态里看它的位置就很清楚了。方案免费程度测试覆盖可视化报告导出适用阶段MemTest86 Free免费仅内存文本界面无内存专项排查UBCD 救援光盘免费工具集拼装各异需手工整理通用救援HWiNFO / AIDA64商业授权限制信息部分测试完善付费后支持操作系统内固件自带诊断ePSA/HP随整机附带机型相关较好部分支持品牌机用户自研 UEFI 整机自检工具免费21 项整机覆盖图形化一键导出系统前检测MemTest86 适合你已经锁定疑似内存问题后的深入排查全地址多次扫描的强度比我的工具高UBCD 适合系统彻底崩溃后的救援工具很杂但都是经典HWiNFO 在系统内做传感器监控非常强大但它替代不了系统无法启动时的检测。这个自检工具的价值在于整机 系统前 一键报告这个组合它不追求单项测试的极限深度而是追求给定时间内对整机健康状态的全面摸底。6.2 适用场景与不适用的场景我在实际使用中这套工具最称手的场景有三个。一是二手服务器验收。拿到一台机器插上 U 盘启动20 分钟跑完 21 项报告一看SMART 数据、ECC 计数、PCIe 协商状态、温度曲线全在上面硬盘有没有清零、内存有没有暗病、PCIe 插槽是否完好一目了然。二是批量上架前体检。裸金属服务器批量装机之前可以先批量跑一遍自检把 PASS 的机器放行进自动化装机流程FAIL 的机器单独检修。Reports 里的 JSON 格式可以直接对接装机系统做成硬性准入条件。三是保修期内的故障取证。服务器出现故障需要申请售后时与其在电话里和技术支持反复描述症状不如直接跑一遍自检把报告发过去。哪一项 FAIL、什么时候跑的、当时的传感器读数是多少一目了然沟通成本降一大截。但也要说清楚它不适合的场景。如果是需要七天七夜长时间烧机的压力测试或者要模拟操作系统环境下的高并发 I/OUEFI 自检工具做不到也不应该用它做。这类深度验证还是交给专业的 Burn-in 工具。另外对于没有 UEFI 的老旧平台纯 Legacy BIOS 的机器这个工具跑不了这类机器只能另想办法。6.3 后续扩展方向工具现在已经稳定运行了大半年后续我在考虑三个扩展方向。第一是网启支持。现在每次跑都要插 U 盘如果能在固件启动阶段直接通过 PXE 加载工具到内存里运行那在几十台甚至上百台机器的机柜巡检场景下会方便很多。第二是报告上传到 BMC。很多服务器自带 IPMI/BMC 管理口如果自检报告能通过 IPMI 命令直接写入 BMC 的 SEL 日志或者备份分区运维人员在远程管理界面上就能看到硬件自检结果不用再跑到机器跟前插 U 盘拷贝。第三是和自动化装机流程打通。裸金属服务器批量安装操作系统现在已经有比较成熟的方案但流程里普遍缺少装机前硬件自检这个环节。如果我的工具能作为装机流程的第一步自动判断机器是否达到上线标准达标才触发后续的 OS 安装对整个机房运维效率的提升会非常明显。硬件排查这个领域工具永远不嫌多。免费的方案能解决问题的地方其实比很多人想象的要多关键在于选对时机、用对方法。这套 UEFI 整机自检工具对我来说解决了一个非常具体的问题在操作系统接触不到硬件的时候给运维提供一个可信的、可视化的、留痕的判断依据。如果你也经常和裸金属服务器打交道特别是涉及二手硬件验收和批量上架前的体检我很建议你也尝试在 UEFI 阶段做一次整机自检。多一个底层工具兜底总比靠运气和排除法拆机器省心。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进