ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

UEFI裸金属硬件自检:免费开源21项诊断工具设计与实现

UEFI裸金属硬件自检:免费开源21项诊断工具设计与实现 1. 为什么裸金属硬件故障排查这么痛1.1 服务器报错的“薛定谔”状态先说说这个工具的起因。我在一家做基础设施的团队里干了挺多年日常打交道最多的就是裸金属服务器——就是那种没有虚拟化层、操作系统直接跑在物理机上的玩意儿。裸金属好是好性能拉满、隔离彻底但一到硬件出问题的时候那叫一个折腾。最常见的场景是这样的一台机器刚上架或者从机房角落翻出来准备复用结果开机起不来。这时候你面对的是一台没有操作系统、没有带外管理页面、连个响都不带的铁盒子。你说它坏了它POST偶尔还能过你说它没坏它就是进不了系统。这种“薛定谔的故障”我遇到过不下十次。每次都要搬显示器、接键盘然后对着黑底白字的BIOS界面发呆能做的无非是看看内存条有没有认全、硬盘有没有掉线、风扇转速正不正常全靠眼睛和手。后来我养成了一个习惯凡是新到的、或者准备重新投入使用的裸金属机器一律先做一轮硬件自检再交付。但问题来了——用什么工具做这直接引出了标题里那个问题有没有免费的裸金属硬件故障排查工具当时我搜了一圈结论是有但要么太重型要么太封闭要么干脆不好使。这个工具就是我自己写的一个跑在UEFI环境下的整机自检程序21项测试、全程可视化、一键出报告免费、开源、可定制。这篇文就是把整个设计和实现过程拆开来讲适合做运维、搞服务器交付验收、或者经常折腾物理机的朋友参考。1.2 现有免费手段的边界在哪里先把我试过的免费方案捋一遍你会发现各有各的尴尬。第一类是UEFI固件自带的功能。现在的服务器主板比如常见的超微、华硕、技嘉的板子BIOS里多少会带一点硬件诊断项。有的能测内存、有的能看SMART信息、有的能扫PCIe设备。但问题在于这些功能分散在不同菜单层级里测试项不全结果也不能导出截图全靠手机拍。你要是做批量验收比如一次来20台机器逐台进BIOS点菜单能把人点疯。第二类是跑一个Linux启动盘装smartmontools、memtest86、lshw这些组合拳。这套方案功能是最全的但也很重。你得先有一个能用的Linux live环境然后手动跑一堆命令再把输出汇总成报告。批量操作倒是能脚本化但每台机器都要插U盘、启动、等脚本跑完、拔U盘流程依然繁琐。而且很多测试工具是“单点”的——测内存的只管内存测硬盘的只管硬盘没有一个统一的入口把整机过一遍。第三类是商业工具和OEM诊断工具。像是PC-Doctor、或者戴尔、惠普服务器自带的诊断分区确实做得专业但要么收费不菲要么绑定品牌——你在超微的板子上没法跑人家戴尔的诊断工具反过来也一样。这时候我就想与其到处找工具凑合不如自己写一个UEFI下跑的诊断程序。反正UEFI环境下能直接访问硬件内存、存储、网络、外设都能枚举到做自检再合适不过。1.3 为什么选择UEFI这个战场写硬件诊断工具有几条路写Linux内核模块、写用户态工具、写UEFI Application。我最终选了UEFI理由很现实。第一UEFI环境足够“裸”。它跑在操作系统之前没有驱动的干扰、没有操作系统的缓存和调度测出来的硬件状态最接近真实。第二UEFI Application可以直接调用固件提供的Protocol来访问硬件比如Block IO读硬盘、Graphics Output Protocol画界面、Loaded Image Protocol拿自己的启动路径开发效率比我预想的高。第三目标裸金属服务器基本都是UEFI启动兼容性有保证不需要额外装什么东西——只要把程序放到FAT32的U盘里开机从U盘引导就进了自检环境。选型上我也有过纠结UEFI开发主流有两条路EDK2和gnu-efi。EDK2功能全、生态好但工程结构非常重光是环境搭建就能劝退一半人。gnu-efi则轻量很多本质就是告诉你UEFI里那套ABI和结构体定义你直接写C然后链接成.efi文件就行。考虑到我这个工具的核心逻辑其实不复杂——枚举设备、读写内存、画界面、写文件——gnu-efi完全够用而且编译链简单一个Makefile搞定。后面我会把具体流程展开讲。2. 工具整体设计与21项测试的拆解2.1 架构一个UEFI Application怎么跑起来先把这工具的运行逻辑说清楚。它是标准的UEFI Application入口函数是efi_main签名长这样EFI_STATUS EFIAPI efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab) { // 在这里初始化全局的SystemTable指针 gST systab; gBS systab-BootServices; // 后面所有操作比如输出文字、访问协议、绘图都是通过这两个全局结构体 }程序跑起来之后做了三件事第一初始化图形输出环境获取GOPGraphics Output Protocol把屏幕切成图形模式第二遍历系统里的设备逐项执行测试第三把测试结果写进报告文件保存在启动U盘的FAT分区里。这里面最重要的架构决策是测试逻辑和界面逻辑完全分离。每个测试项都是一个独立函数返回结构体test_result包含测试ID、名称、状态、耗时、详情字符串。界面层只负责把结果画出来报告模块只负责把结果序列化。这样后续加测试项非常方便写一个新函数注册进去就行不用动界面和报告代码。typedef struct { uint16_t id; const char *name; uint8_t status; // 0PASS, 1WARN, 2FAIL, 3SKIP uint64_t elapsed_ms; char detail[256]; } test_result;2.2 21项测试分类一张表看明白21项测试我按硬件层次分了5大类基础信息、处理器、内存、存储与外设、系统功能。下面这个表是完整清单类别测试项核心验证点基础信息SMBIOS读取主板型号、BIOS版本、序列号是否可读基础信息固件版本识别UEFI规范版本、固件厂商识别处理器CPU型号与核心枚举CPUID指令解析型号、核心数处理器CPU特性标志虚拟化、AES、AVX等关键特性处理器缓存信息L1/L2/L3大小与关联性内存内存容量识别SMBIOS与内存控制器读数是否一致内存基础读写测试逐字节写读、块写读校验内存地址线测试高位地址翻转探测寻址异常内存内存压力循环连续多轮写0xAA/0x55/随机数存储NVMe设备枚举PCIe枚举NVMe控制器读型号容量存储SATA设备枚举AHCI控制器下识别硬盘/光驱存储USB存储识别枚举USB Mass Storage设备存储分区表检查读取MBR/GPT签名校验分区合法性网络网卡PHY链路检测检查网卡是否探测到链路网络MAC地址读取从UNDI/SNP协议读取MAC外设PCIe设备枚举遍历总线输出设备Vendor/Device ID外设USB设备枚举列出根Hub下所有USB设备外设串口回环测试通过串口发送数据并回读系统RTC实时时钟读取时间校验日期合理性系统定时器中断BootService定时器回调验证系统ACPI表完整性定位RSDP/XSDT检查关键表存在分类的逻辑很直白一台服务器能不能用首先得知道它是什么——SMBIOS和CPU信息解决这个然后确认它能算——内存和CPU测试再确认能存——存储设备测试再确认能连——网络和外设测试最后确认能长时间稳定跑——RTC和定时器这种基础系统功能。2.3 几个核心测试项的实现原理挑几个实现上有代表性的测试项展开说说你会发现UEFI下做这些事比想象中直接。CPU型号与核心枚举用的是CPUID指令。这个在UEFI环境下可以直接执行不需要任何权限。关键代码逻辑是static void get_cpu_brand(char *buf, size_t buf_size) { uint32_t regs[4] {0}; // CPUID leaf 0x80000000: 获取最大扩展leaf cpuid(0x80000000, regs[0], regs[1], regs[2], regs[3]); if (regs[0] 0x80000004) { // leaf 0x80000002~0x80000004: 拼接品牌字符串 for (int leaf 0x80000002; leaf 0x80000004; leaf) { cpuid(leaf, regs[0], regs[1], regs[2], regs[3]); memcpy(buf (leaf - 0x80000002) * 16, regs, 16); } buf[48] \0; } }这段代码在裸机环境下跑起来非常快基本瞬间出结果。内存地址线测试这个是我踩过坑之后加进去的。原理很简单往某个地址写一个特征值然后去读更高位的地址看有没有“镜像”——如果高位地址线断了或者短路低地址的数据会“影射”到高地址这样就能检测出寻址异常。测试时会先探测实际可用内存大小然后从大到小依次往1MB、2MB、4MB...这样的边界地址写值再读回来比对。这个测试对数据中心的二手服务器特别管用很多机器看起来内存容量正常但实际高位地址线有虚焊跑大内存应用就随机崩溃。NVMe设备枚举走的是PCIe路径。UEFI的PCIe Host Bridge Protocol可以遍历总线找到Class Code为0x010802NVMe控制器的设备然后读取BAR0寄存器映射MMIO空间从NVMe控制器寄存器里读出设备能力。读取型号字符串则要走Admin Command的Identify命令在UEFI环境下不算复杂但要处理好内存的对齐和映射关系。第一次跑通的时候看着屏幕上把一块三星PM9A3的型号和容量正确打出来还是挺有成就感的。3. 可视化界面与一键报告的实现3.1 UEFI下做可视化难在哪说实话UEFI Application写文字界面简单Print函数一调就输出一行字想怎么打就怎么打。但要做“可视化”难度会上一个台阶。因为UEFI环境下没有现成的GUI框架没有窗口系统没有字体库你要面对的就是一块裸的帧缓冲——一块连续的内存里面每个像素点的颜色由你直接控制。我的可视化方案分了三层。第一层是底层的像素绘制。通过GOP拿到帧缓冲的基地址和分辨率之后就可以直接操作内存来画图了static void draw_pixel(efi_gop_t *gop, uint32_t x, uint32_t y, uint32_t color) { uint32_t *fb (uint32_t *)gop-Mode-FrameBufferBase; fb[y * gop-Mode-Info-PixelsPerScanLine x] color; }第二层是图形原语。基于draw_pixel往上封装了画矩形、画水平线、垂直线、画边框这些操作。界面上的背景色、卡片区域、进度条、状态点全部由这些原语组合出来。说实话这让画面看起来有一种“工业复古”的风格但胜在可控、稳定、不依赖任何外部库。第三层是文字渲染。UEFI自带的OutputString只能输出等宽字符文本想在图形模式上精确定位文字位置就不行了。我用了一个8x8的点阵字体把ASCII字符0x20到0x7E的位图数据存在一个静态数组里然后实现了一个draw_text函数可以把字符串画在任意坐标。这是整个可视化里最花时间的一部分主要难点是字体数据的准备——我找了一个公共领域的点阵字体源文件转成C数组然后逐个字符验证渲染效果。3.2 界面长什么样自绘GUI的设计思路整个界面我设计成了“总览列表进度条”的形式。顶部是工具名称和版本号中上部是当前测试项的卡片显示测试名称、状态、耗时中间是一排滚动显示的测试日志底部是一个总进度条和汇总统计。运行时的视觉逻辑是这样的每个测试项执行时日志区会滚动输出该测试的关键信息比如“NVMe识别到设备 SN12345容量 3.84TB”测试完成后状态点会变成绿色通过、黄色警告或红色失败。整个流程自动从第1项跑到第21项不需要人工干预。跑完之后界面上会显示一个PASS/FAIL汇总页同时自动把报告写入U盘。交互我只实现了三个键上下方向键切换查看测试详情、回车重新运行指定测试、任意键退出回到固件。因为我的定位是“自动化巡检工具”不是交互式诊断终端所以界面越简单越好。测试员插上U盘开机等两分钟拔U盘走人看报告就行。这种现场环境没有人愿意在屏幕前做复杂操作。3.3 一键出报告不止是文本那么简单“一键出报告”这个功能我花了挺多心思。最初版只往U盘写一个纯文本的hardware_report.txt但用了一段时间发现纯文本太不方便了——你没法直接程序解析也不能快速定位关键字段。后来我改成一次生成三个文件第一个是report.txt人类可读的完整报告直接从程序里格式化输出保留所有细节。第二个是report.json结构化数据方便写脚本做二次处理——比如批量采集20台机器的报告然后统一汇总看哪些批次有同样的问题。第三个是report.html一个自包含的单文件网页样式写死在HTML里用浏览器打开就能看有汇总表、有每项测试的状态标签、还有设备信息概览。JSON的结构大致是这样{ tool: baremetal-diagnostics, version: 1.2.0, timestamp: 2025-01-15T10:24:37Z, system: { manufacturer: Supermicro, product: X12DPi-N6, bios_version: 2.4, cpu: Intel(R) Xeon(R) Gold 6338 CPU 2.00GHz, cores: 32, ram_mb: 262144 }, tests: [ { id: 1, name: SMBIOS读取, status: PASS, elapsed_ms: 12, detail: ... } ], summary: { total: 21, pass: 20, warn: 1, fail: 0 } }报告文件的写入位置也做过调整。最初写死在FS0:\但有的机器U盘可能识别成FS1:程序找不到文件系统就报错。后来改成遍历所有文件系统句柄找一个同时具备可写和可移动介质属性的卷来写基本上能稳定落在U盘上。这个细节在量产部署时特别重要否则就容易出现“测试完了但报告没生成”的尴尬。4. 实操过程从编译到部署使用4.1 编译环境搭建整个工具源码量不大大概3000行C依赖gnu-efi的库。我是在Ubuntu 22.04上编译的步骤很简单# 安装依赖 sudo apt-get install gnu-efi gcc-x86-64-linux-gnu qemu-system-x86 ovmf # 克隆源码 git clone https://github.com/yourname/baremetal-diagnostics.git cd baremetal-diagnostics # 编译 makeMakefile的核心部分就是把gnu-efi的头文件和库路径指对然后链接生成可启动的EFI程序ARCH x86_64 GNUEFI_DIR /usr/include/efi GNUEFI_LIB /usr/lib/x86_64-linux-gnu/efi CFLAGS -I$(GNUEFI_DIR) -I$(GNUEFI_DIR)/$(ARCH) \ -fno-stack-protector -fno-strict-aliasing \ -ffreestanding -fno-pic -maccumulate-outgoing-args \ -DEFI_FUNCTION_WRAPPER -DGNU_EFI LDSCRIPT $(GNUEFI_LIB)/elf_$(ARCH)_efi.lds CRT0 $(GNUEFI_LIB)/crt0-efi-$(ARCH).o all: BOOTX64.EFI BOOTX64.EFI: main.o tests.o gfx.o report.o ld -shared -Bsymbolic -L$(GNUEFI_LIB) -T$(LDSCRIPT) \ -o diagnostic.so $^ -lgnuefi objcopy -j .text -j .sdata -j .data -j .dynamic \ -j .dynsym -j .rel* -j .rela* -j .reloc \ --target efi-app-x86_64 diagnostic.so BOOTX64.EFI编译完成后得到一个BOOTX64.EFI文件这就是罪魁祸首……不对这就是整个工具的本体不到400KB。看到这个体积我挺满意的一个U盘512MB的剩余空间能装满好几千份副本。4.2 制作启动U盘制作启动盘有一个关键细节U盘必须是FAT32格式。这是UEFI规范的要求——UEFI固件只能加载FAT12/16/32分区上的EFI程序。很多人在这里栽过跟头把启动U盘格式化成NTFS然后开机黑屏报“No Bootable Device”。这是因为NTFS是微软的专有格式UEFI固件正常情况下根本不认。具体步骤# 确认U盘设备名假设是 /dev/sdb务必确认清楚 lsblk # 格式化 sudo mkfs.fat -F 32 -n DIAG /dev/sdb1 # 创建目录结构并拷贝文件 sudo mkdir -p /media/boot/EFI/BOOT sudo cp BOOTX64.EFI /media/boot/EFI/BOOT/ # 同时放一份到根目录方便使用UEFI Shell手动执行时访问 sudo cp BOOTX64.EFI /media/boot/diag.efi # 卸载 sudo umount /media/boot目录结构必须是/EFI/BOOT/BOOTX64.EFI这是UEFI固件在找不到Windows Boot Manager之类的系统启动项时最后会去找的默认路径。到了这里把U盘插到目标机器上开机按启动菜单键常见的是F11/F12/F2/F7各家板子不一样选择U盘启动项就行了。4.3 在裸机上跑一圈实际运行过程比我预想的顺利但也不是没出过幺蛾子。第一次在真机上跑的时候内存压力循环跑到一半机器直接重启了。排查了半天发现问题出在我的测试代码上不是硬件问题——我在做块写测试时把一个指针算错了直接写到了保留内存区域导致三重故障引发了系统重启。后来加了一道内存地址合法性检查所有写入操作发生之前先调用gBS-AllocatePages申请一块测试专用内存测试只在这块区域里进行绝不越界碰别的地址。工具跑完一轮的耗时取决于内存大小和存储设备数量。以一台双路至强、256GB内存、6块NVMe的机器为例全部21项跑完大约3分钟。其中大头在内存压力循环和NVMe Identify命令的遍历上。这个时长对批量验收来说是可以接受的——一台机器3分钟一个小时能过20台。运行结束时屏幕会显示汇总界面 Bare-Metal Diagnostics v1.2.0 [PASS] SMBIOS读取 [12ms] [PASS] CPU型号与核心枚举 [8ms] [FAIL] 内存压力循环 [45123ms] - 地址 0x82345000 写入 0xAA 读取 0x55 [PASS] 内存读写测试 [2341ms] ... ---------------------------------------------------------- Summary: PASS18 WARN2 FAIL1 Result: FAIL - 详见报告文件 注意看那个FAIL项的详情——“地址写入0xAA读取0x55”这一行才是关键。它说明这个地址的某一位数据线出了问题写1读0或者反过来典型的单比特错误。拿到这个信息现场工程师可以直接定位到具体内存槽位而不是漫无目的地拔插内存条。5. 常见问题与排查技巧实录5.1 启动黑屏、进不了工具的排查思路我在不同品牌的板子上都跑过这个工具遇到最多的问题就是“U盘插了也选了启动项但就是黑屏”。这个问题的优先级排序应该是这样的先看安全启动。如果固件开启了Secure Boot而我的EFI程序没有签名固件会拒绝加载。方案有两个进BIOS关掉安全启动或者给自己的EFI程序做一个简单签名。个人测试环境直接关掉最省事但如果是给客户交付最好做一个签名说明文档。再看CSM设置。CSM是UEFI固件里为兼容旧系统保留的Legacy BIOS模拟层。有些主板默认CSM是开启的在启动的时候会优先尝试Legacy引导而不是UEFI引导。如果启动U盘做成了UEFI方式但固件在CSM模式下不识别它同样会黑屏或者跳过。这跟热词里“超微主板不支持UEFI固件如何处理”对应的情况类似——老一点的超微板子或者在BIOS模式下初始化的机器需要进BIOS把启动模式切成UEFI Only、或者关掉CSMU盘才能正常引导。然后检查U盘格式和分区表。确认FAT32分区是主分区、分区表类型是GPT或者MBR都可以但一定不能被格式化成NTFS或exFAT。一个小技巧用lsblk -f看输出如果FSTYPE列是vfat才对。最后才考虑硬件问题。有的旧机器USB口供电不足U盘识别一会儿掉一会儿。换个USB口试试通常后面板的直连口比前置面板口稳定得多。这几个步骤按顺序走一遍基本能解决九成启动问题。5.2 测试误报的几个经典案例工具用久了会遇到一些“假阳性”——明明机器是好的测试却报了FAIL。我总结了三个最常见的误报来源。第一个是内存压力循环与ECC的关系。服务器内存大部分是ECC内存单比特错误会被硬件自动纠正。但我的测试代码用普通内存读写指令遇到ECC纠正的瞬时错误时读到的是纠正后的正确值还是原始错误值取决于硬件行为。有几次测试报了FAIL但重启后跑同样的测试又全过。后来我在报告中把内存测试单独标注“建议重跑确认”并在详情里加了错误地址和期望值/实际值方便人工判断是否偶发。第二个是NVMe识别时的命名空间问题。有些NVMe盘支持多命名空间默认命名空间不是0xFFFFFFFF我的枚举逻辑如果不考虑命名空间管理命令读容量会读到0。修这个问题的过程比较曲折最后是通过读取Identify Namespace数据结构从NSZE字段拿正确容量才算稳定下来。第三个是串口回环测试。这个测试需要串口线的TX和RX短接形成一个物理回环。但有的服务器串口没有引出到外面或者引出了但没有跳线测试就会误报。我在界面上特别注明“串口回环测试需要跳线短接未接跳线时跳过”避免现场工程师看到红色FAIL直接慌。5.3 兼容性在不同固件版本间的血泪经验UEFI这个东西规范是统一的但不同厂商的实现总有微妙差异。我遇到最典型的一个问题是某品牌服务器固件版本在2.1和2.2之间对GOP的QueryMode返回的分辨率列表顺序完全相反——新版把最高分辨率排在第一个旧版把最低分辨率排第一个。我的工具初始化图形模式时如果直接选索引0在旧版固件上会得到一个640x480的奇怪界面图形全部错位。解决办法是做一个分辨率自适应枚举所有模式选择宽高比最接近16:9且分辨率最大的一项。核心代码如下static void select_best_mode(efi_gop_t *gop) { UINTN best_index 0, best_pixels 0; for (UINTN i 0; i gop-Mode-MaxMode; i) { EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info; UINTN size; if (gop-QueryMode(gop, i, size, info) EFI_SUCCESS) { UINTN pixels info-HorizontalResolution * info-VerticalResolution; if (pixels best_pixels) { best_pixels pixels; best_index i; } } } gop-SetMode(gop, best_index); }类似的兼容性坑还有内存映射描述符的Attribute标志在不同固件上含义不同、ACPI表的物理地址在某些设备上需要Translate、USB枚举的Hub层级深度差异等等。我的经验是在真机环境大规模跑之前先在QEMU里用OVMF固件验证一遍逻辑再拿到至少两种不同厂商的物理机上冒烟确认界面、测试、报告三个环节都正常然后才批量部署。这个过程省掉了很多现场抓狂的机会。6. 这个工具真正适用的场景与价值边界6.1 最适合直接用的三类人这个工具做出来之后首先在我们内部用了起来。用着用着我发现适用人群比预期要广大致分三类。第一类是数据中心运维和交付工程师。批量验收裸金属服务器、排查上架前的问题机器是这个工具的目标场景。插U盘、开机、等三分钟、拔U盘一台机器的硬件健康报告就到手了。配合JSON报告还能批量采集汇总效率提升非常明显。第二类是二手硬件买家和卖家。二手服务器水很深卖家发来的机器看起来一切正常但你不知道它内存有没有单比特错误、PCIe链路有没有降速、RTC电池是不是快没电了。跑一轮自检这些问题基本能暴露出来。我就见过一台机器SMBIOS显示产品名称是某品牌定制款但PCIe枚举出来全是非标准供应商ID——这很可能是一块从整机拆下来的OEM板对不上号。这种信息对判断机器来源和价值很有参考意义。第三类是硬件爱好者和极客玩家。家里搞了一台退役工作站想确认各个部件状态用这个工具跑一遍比拆机箱翻标签直观多了。尤其是那些没有显示输出、纯靠IPMI管理的机器——你以为它一切正常结果RTC时间停在两年前ACPI表读取失败这些小问题这个工具一眼就能看出来。6.2 它解决不了什么把丑话说在前面工具虽好但也有明确的能力边界。写这篇的时候我不想把它吹成万能药丑话说在前面。第一它测的是“静态健康状态”测不了“长期稳定性”。内存压力循环跑几分钟能抓出明显的位翻转但抓不住那些需要跑几小时才会出现的热稳定性问题。真正的高负载上线前压力测试还是得靠Linux下的stress-ng、fio这些工具长时间跑。第二它不覆盖带外管理通道。BMC/IPMI的固件版本、传感器状态、日志记录这些不在UEFI环境下能访问的范围内。如果你的机器是IPMI失联、或者在BMC日志里看到大量传感器告警得用专门的BMC工具去查。第三非UEFI启动的老机器用不了。有些2015年以前的古董服务器只有Legacy BIOS没有UEFI固件接口这个工具就跑不了。对于这类机器还是用传统的光盘工具或者Linux live系统吧。我在设计的时候也没有打算支持它们因为新交付的机器标准就是UEFI把精力聚焦在主干路线上收益最大。6.3 后续可以怎么扩展这个工具目前的版本是1.2.0但我已经在规划下一步了。最迫切的需求是把内存压力循环做成可配置模式——现场验收和深度老化测试需要的内存压力等级差别很大。第二个方向是支持PXE/HTTP引导这样批量部署时甚至不用插U盘机器从网络启动直接跑自检报告自动传回服务器效率还能再上一个台阶。第三个方向是中文界面现在界面是英文的国内有些现场工程师更习惯看中文多语言方案已经在做了。另一个扩展思路是把它改造成“硬件信息采集器”而不是单纯的测试工具。比如在报告里加入整机的功耗估算、温度传感器读数如果UEFI暴露了相关的Protocol、还有固件设置项的快照。这样就不仅仅是“坏没坏”的判断工具而是一台机器的完整健康档案。这个工具从最初的想法到能用前后花了我三个周末。回头看看用UEFI做自检这个方向选对了。如果你的工作也需要频繁接触裸金属硬件又苦于没有趁手的免费工具不妨也试试这条路。写一个UEFI Application没有想象中那么难——它就是个跑在开机阶段的小程序能访问硬件、能画界面、能写文件。有了这些能力很多的排查和验收场景都能自动化。最后再分享一个小技巧开发阶段一定要多用QEMUOVMF模拟很多问题在虚拟环境里复现和调试比真机快得多等模拟环境跑稳了再上真机验证能省掉大把的调试时间。
返回列表