BIOS上报的版本信息为空

问题描述

相同的BIOS版本,在部分设备上ipmcget -d v看不到BIOS版本信息

环境信息

  • 操作系统:openEuler 2203 SP3

  • 软件版本:OpenUBMC2509

  • 硬件配置:鲲鹏920模组

重现步骤

  1. 设备上电
  2. 等待BMC、OS操作系统完成启动
  3. ipmcget -d v查看版本信息

期望结果

看到正确的BIOS版本号

实际结果

ipmcget -d v看不到BIOS版本信息,关键日志如下:
2026-01-15 11:00:13.675281 bios NOTICE: bios_service.lua(480): set bios version to successfully, system is 1

答案内容由AI生成,仅供参考:

BIOS上报的版本信息为空问题分析与解决方案

问题描述

在相同BIOS版本的设备上,部分设备无法通过ipmcget -d v命令查看到BIOS版本信息,显示为空。尽管系统日志显示BIOS服务已成功设置版本信息(set bios version to successfully),但在ipmcget -d v输出中缺少Active BIOS Version和Backup BIOS Version字段。

环境信息

  • 操作系统:openEuler 2203 SP3
  • 软件版本:OpenUBMC 2509
  • 硬件配置:鲲鹏920模组

重现步骤

  1. 设备上电
  2. 等待BMC、OS操作系统完成启动
  3. 执行ipmcget -d v查看版本信息

期望结果

能够看到正确的Active BIOS Version和Backup BIOS Version信息。

实际结果

ipmcget -d v命令输出中未显示BIOS版本信息。

关键日志信息:

2026-01-15 11:00:13.675281 bios NOTICE: bios_service.lua(480): set bios version to  successfully, system is 1

问题原因分析

1. BIOS版本上报机制中断

根据知识库信息,BIOS版本信息通常通过以下路径上报至BMC:

  • EFI应用上报ReportBiosVersionToBmc.efi是在系统启动时运行的EFI应用程序,负责将BIOS版本信息发送给BMC。
  • D-Bus通信bmc.kepler.bios服务通过D-Bus接口接收并存储BIOS版本信息。
  • 命令行查询ipmcget -d version命令从BMC固件中读取并展示Active/Backup BIOS Version。

虽然日志显示bios_service.lua尝试设置BIOS版本成功,但实际值为空字符串,这表明BIOS端未正确传递版本信息。

2. D-Bus服务交互异常

  • GetSystemFirmwareVersion方法作为bmc.kepler.bios服务的一部分,用于获取系统固件版本。
  • 如果该方法未能正确获取BIOS传递的版本数据,则会导致信息缺失。

3. 固件或驱动兼容性问题

  • 不同设备可能存在CPLD、MCU或BMC固件差异,导致对BIOS版本信息的处理行为不一致。
  • 在"鲲鹏模组适配约束FAQ"中提到,拓扑信息配置错误可能导致部分功能不可用。

解决方案

方案一:检查并修复BIOS到BMC通信链路

1. 验证 EFI 应用是否正常运行

# 检查 ReportBiosVersionToBmc.efi 是否存在并可执行
ls -l /efi/tools/ReportBiosVersionToBmc.efi
# 或检查启动日志中是否调用该程序
dmesg | grep -i "ReportBiosVersionToBmc"

2. 检查 D-Bus 接口状态

# 查看 bmc.kepler.bios 服务是否注册
busctl list | grep bmc.kepler.bios

# 手动调用 GetSystemFirmwareVersion 方法测试
busctl call bmc.kepler.bios /bmc/kepler/bios bmc.kepler.bios.System.Firmware GetSystemFirmwareVersion

方案二:排查设备间差异

1. 对比有/无问题设备的硬件和固件信息

# 获取完整版本信息进行对比
ipmcget -d version

比较以下字段:

  • Uboot版本
  • Secure Bootloader版本
  • CPLD版本
  • MCU版本
  • Product Name

特别注意是否有非标准版本或测试版本存在。

2. 检查资源树加载情况

# 查看 bios 相关资源是否存在
ipmcget -t resource -d list | grep bios

如果缺少bmc.kepler.Systems.Bios相关节点,则说明BIOS管理模块未正确加载。

方案三:检查系统配置文件

1. 检查 SR 配置文件是否完整

参考"鲲鹏模组适配约束FAQ",确保SR配置中包含必要的对象:

{
  "Bios": {
    "description": "bios信息,包括bdf、bios启动阶段,bios启动项、菜单等配置信息"
  }
}

2. 检查 BIOS 版本获取脚本逻辑

检查 /usr/lib/bios_service.lua 文件第480行附近的代码逻辑:

-- 示例伪代码:需确认是否空值未做校验
if bios_version ~= nil then
    dbus_set("/bmc/kepler/bios/version", bios_version)
else
    log("BIOS version is empty!")
end

方案四:强制刷新 BIOS 版本信息

1. 手动触发版本上报(如有接口)

# 尝试重新加载 BIOS 服务
ipmcset -t maintenance -d resetchip -v bios

2. 使用 IPMI 命令获取 BIOS 版本(备选路径)

ipmitool raw 0x06 0x01 # Get System Firmware Version

临时规避措施

若短期内无法修复,可通过以下方式获取BIOS版本:

# 方法1:直接读取 flash 或文件系统中的版本信息
cat /proc/bios_version

# 方法2:使用其他工具查看(如 dmidecode)
dmidecode -t bios

根本原因总结

该问题的根本原因是 BIOS未能将有效的版本字符串传递给BMC系统,尽管BIOS服务尝试更新版本的操作被记录,但由于传入值为空,导致最终信息缺失。

可能原因包括:

  1. ReportBiosVersionToBmc.efi在某些设备上未能正确读取BIOS版本
  2. DMI/SMBIOS表中BIOS版本字段异常
  3. 不同批次设备的固件行为差异

后续建议

  1. 统一固件版本:确保所有设备使用完全一致的BIOS、BMC、CPLD和MCU版本。
  2. 增强空值检测:在bios_service.lua中增加对空版本号的日志告警。
  3. 添加健康检查:在系统启动后自动验证ipmcget -d v是否包含BIOS版本信息,并记录事件。

参考文档固件升级机制及常见问题IPMI管理定位问题鲲鹏模组适配约束FAQ

相关链接:

  1. 网页端读不到bios版本
  2. openUBMC2506 BIOS升级显示成功但是reboot后通过OS侧查看版本实际上未生效
  3. BIOS版本号获取不到
  4. 通过Smart Provisioning安装OpenEuler失败
  5. bios | 文档中心 | openUBMC

这种是带内没把正确的bios版本上报到bmc,升级个正常bios版本验证下。