Nvme盘拔出后插入SATA SSD,硬盘信息不会更新,依然是NVME盘

问题描述

同一槽位上,Nvme盘拔出后插入SATA SSD,硬盘信息不会更新,依然是NVME盘

环境信息

  • 操作系统:[Ubuntu 24.04]

  • 软件版本:[OpenUBMC2509、2512]

  • 硬件配置:[如 CPU、内存等]

  • -------------- HDD Backplane INFO --------------
    DiskBP1 BoardName: BC83NHBD
    DiskBP1 BoardID: 0xffff
    DiskBP1 CUID: 00000001030302057047

重现步骤

  1. 拔出Disk1位置的SATA SSD和Disk4位置的NVME;

  2. 将SATA SSD插到Disk4位置;

  3. 检查Web存储管理中,Disk4的信息是否更新为SATA SSD的信息;

期望结果

Web存储管理中,Disk4的信息更新为SATA SSD的信息;

实际结果

Web存储管理中,Disk4的信息不会更新,依然是NVME盘

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

NVMe盘拔出后插入SATA SSD,硬盘信息未更新问题分析与解答

:magnifying_glass_tilted_left: 问题描述

在同一物理槽位上,当将一个NVMe盘拔出并插入一个SATA SSD后,OpenUBMC系统的Web存储管理界面未能正确更新该槽位的硬盘信息,仍然显示原NVMe盘的信息,而非新插入的SATA SSD信息。

  • 环境信息
    • 操作系统:Ubuntu 24.04
    • 软件版本:OpenUBMC 25.09 / 25.12
    • 硬件配置:涉及 DiskBP1 背板(BoardName: BC83NHBD, CUID: 00000001030302057047)
  • 重现步骤
    1. 拔出Disk1位置的SATA SSD 和 Disk4位置的NVMe盘;
    2. 将SATA SSD插入Disk4位置;
    3. 查看Web界面中Disk4的信息。
  • 预期结果:Disk4显示为SATA SSD的新信息。
  • 实际结果:Disk4仍显示为旧NVMe盘的信息,未发生变更。

:books: 根本原因分析

根据知识图谱和相关文档内容,该问题的根本原因如下:

1. 设备类型识别依赖于初始配置和协议加载机制

在OpenUBMC中,NVMe和SATA设备的识别与管理依赖不同的底层机制:

  • NVMe盘c_handler_nvme模块管理,其信息主要通过VPD(Vital Product Data)仓库和Connector_ComVPDConnect对象加载,并基于NVMe-MISSD_FORMAT协议进行通信。
  • SATA盘则依赖RAID卡的带外管理功能或BMA(Baseboard Management Architecture)上报信息。

:white_check_mark: 文档支持:来自“硬盘管理手册”的描述指出:

“NVMe对象配置在VPD仓库中,由硬盘背板通过Connector加载对应的CSR……NVMe对象在自己的管理服务中将属性获取更新完成后发送给Drive对象。”

这表明,NVMe对象的加载是独立于SATA路径的。

2. 热插拔后对象未正确销毁或重建

当NVMe盘被拔出时,系统虽然会收到“Disk removed”事件(如日志中记录:“The disk Disk4 removed (SN:100300771255090003)”),但对应的NVMe对象并未从系统中完全清除,导致:

  • 当前c_nvme.collection中的NVMe对象未被释放;
  • 插入SATA设备后,系统无法在该槽位上创建新的SATA Drive对象,因为:
    • 槽位已被原有NVMe对象占据;
    • 系统未触发对该槽位重新进行类型判断(SATA vs NVMe);
    • SATA设备的信息未通过BMA或RAID卡及时上报。

:warning: 知识图谱证据:

  • c_handler_nvme函数负责处理NVMe对象的查找与匹配;
  • Chip_Virtual_SSD 虚拟对象应在NVMe初始化时加载;
  • 若对象未被正确析构,则可能导致“残留信息”问题。

3. 槽位类型的静态化配置限制

在OpenUBMC系统中,物理槽位的设备类型通常在CSR(Configuration Specification Repository)文件中预定义,尤其是通过PcieAddrInfo对象配置设备类型(如ComponentType=NVMeControllerType=SATA)。

若某一槽位在设计时被固定为NVMe类型(如通过BusinessConnectorConnector_ComVPDConnect定义),则即使插入SATA SSD,系统也不会尝试加载SATA相关驱动或注册SATA Drive对象。

:pushpin: 参考:来自搜索结果中“bios相关FAQ”文档说明:

“BIOS会通过WritePcieDiskBdfToBmc等命令将设备BDF传给BMC,BMC根据BDF号向BIOS查询四元组信息,从而加载对应CSR。”

如果BIOS未上报新设备为SATA类型,或BMC未更新其类型映射,则仍沿用原有NVMe的配置模型。


:hammer_and_wrench: 解决方案与建议

:white_check_mark: 方案一:确保设备热插拔后正确移除NVMe对象

需保证在NVMe盘拔出后,系统能正确销毁其对象实例,释放资源。

建议措施

  • 检查c_handler_nvme:remove_object()是否被正确调用;
  • 验证Chip_Virtual_SSD虚拟对象是否随物理设备移除而失效;
  • 添加日志确认c_nvme.collection在设备移除后已清空该对象。

:light_bulb: 参考文档《openUBMC NVMe盘固件带外升级特性设计说明书》中提到的NVMe管理流程,应支持完整的对象生命周期管理(创建、更新、销毁)。


:white_check_mark: 方案二:启用通用Drive对象动态适配机制

应使用统一的Drive抽象对象来管理不同类型的硬盘(SAS/SATA/NVMe),并在设备插入时根据实际类型动态加载协议。

配置建议

# 硬盘背板CSR中应定义通用Drive槽位
Drive_4:
  Slot: 4
  MediaType: auto_detect  # 自动检测介质类型
  RefComponent: "#/Component_DiskBP1"

:white_check_mark: 依据“硬盘管理手册”:

“Drive对象负责上树各类协议硬盘的共同属性……包括SAS、SATA、NVMe-MI、SSD_FORMAT。”


:white_check_mark: 方案三:验证BMA是否正确上报SATA设备信息

对于直连CPU的SATA盘,信息由BMA系统通过DiskSilk机制上报。

检查点

  1. BIOS是否通过WritePcieDiskBdfToBmc上报了新设备的BDF?
  2. BMA是否基于RootBDF识别出这是一个SATA设备?
  3. storage组件是否匹配到正确的PcieAddrInfo对象?

:magnifying_glass_tilted_left: 来自“bios相关FAQ”:

“BMA基于rootBDF向BMC获取硬盘的丝印号……storage组件通过丝印号来匹配Drive对象。”


:white_check_mark: 方案四:增加类型变更检测逻辑

在槽位发生设备更换时,应强制重新探测设备类型(如读取PCIe设备Class Code或SubClass)。

实现建议

  • 在设备插入时读取PCIeDeviceClassCode
    • 0x0106 表示NVMe(NVM Express);
    • 0x0106SubClass=01 为SATA。
  • 根据实际类型重新加载相应协议文件(.sr文件)。

:puzzle_piece: 临时规避方法

  1. 重启BMC服务

    systemctl restart storage
    

    systemctl restart openubmc
    

    促使系统重新扫描所有设备。

  2. 手动触发一键式收集日志并观察drivelog目录下是否有SATA日志生成:

    • 路径:dump_info/LogDump/storage/drivelog/Disk4
    • 文件:SATA_Log, SMARTAttribute
  3. 检查RAID卡是否支持该槽位的SATA设备管理

    • 如使用SP686C等RAID卡,需确认其官方文档是否支持热插拔识别。

:white_check_mark: 结论

项目 说明
问题原因 OpenUBMC在NVMe设备移除后未正确释放其管理对象,且槽位类型未动态重检测,导致后续插入SATA SSD无法更新信息。
核心机制缺失 缺少热插拔场景下的设备类型再识别与Drive对象动态重建能力。
解决方案 1. 修复NVMe对象释放逻辑;
2. 使用通用Drive模型;
3. 强化BMA/SMBIOS上报;
4. 增加设备类型自动检测。
优先级 高 —— 影响运维人员对硬件状态的准确判断,存在误导风险。

:link: 建议跟踪 issue:AtomGit | GitCode - 全球开发者的开源社区,开源代码托管平台


:paperclip: 附加建议

  • 提交完整的一键式收集日志(LogDump),重点分析:
    • card_info
    • drivelog/Disk4
    • bios/silkconfig.json
  • 确保RAID卡支持带外管理功能,否则物理盘信息无法显示。

如需进一步调试,可提供以下信息:

  • busctl list --user | grep nvme
  • mdbctl lsobj | grep Disk4
  • journalctl -u storage.service | grep Disk4

相关链接:

  1. NVME盘信息有时候会缺失协商速率和累计通电时间
  2. 【iTestSmart】支持显示固件CSR和MCU信息,且BMC复位不丢失测试,关键字有误。
  3. 【存储】硬盘的SMARTAttribute文件是哪个地方写入的?
  4. 直通nvme盘的drive信息是如何与host_agent的信息对应上的?
  5. 硬盘背板开发指南 | 文档中心 | openUBMC

1.判断这个槽位能否插SATA盘
2.直通SATA盘依赖BMA更新信息,是否正确从IBMA获取信息
3.现在的代码在拔盘时没有清除这些静态信息

1、该槽位支持SATA、NVMe

2、当前直通盘信息依赖Bios上报

3、是看到拔出盘时静态信息未清除,这个设计是否合理,是否会优化呢

提issue优化吧 这个Q解决

好的,issue:AtomGit | GitCode - 全球开发者的开源社区,开源代码托管平台