MiniSas接口及其下硬盘如何适配

问题描述

载板上有个CPU2直出MiniSas接口,插了两块HDD硬盘,按照直通硬盘SATA的配法,配PcieAddrInfo_Sas。RootBDF从OS下查到配了,SocketID按照CPU2配为1,配了PcieAddrInfo_SAS_1 – PcieAddrInfo_SAS_10,分别SlotID和PortID 0-9,但是两个硬盘的SilkScreen始终为空,没有信息,请问MiniSAS接口应该怎么适配?

环境信息

  • 操作系统:KY10

  • 软件版本:OpenUBMC2509

  • 硬件配置:920模组

重现步骤

  1. cat /data/opt/bmc/conf/bios/silkconfig.json 有丝印,同时也试过将ControllerType改为3,情况一样
"DiskSilk": [{
        "ControlId": 1,
        "SlotId": 9,
        "RootBDF": "0000:b4:04.0",
        "PhyId": 9,
        "SocketId": 1
}, {
        "ControlId": 1,
        "SlotId": 0,
        "RootBDF": "0000:b4:04.0",
        "PhyId": 0,
        "SocketId": 1
}, {
        "ControlId": 1,
        "SlotId": 1,
        "RootBDF": "0000:b4:04.0",
        "PhyId": 1,
        "SocketId": 1
}, {
        "ControlId": 1,
        "SlotId": 2,
        "RootBDF": "0000:b4:04.0",
        "PhyId": 2,
        "SocketId": 1
}, {
        "ControlId": 1,
        "SlotId": 3,
        "RootBDF": "0000:b4:04.0",
        "PhyId": 3,
        "SocketId": 1
}, {
        "ControlId": 1,
        "SlotId": 4,
        "RootBDF": "0000:b4:04.0",
        "PhyId": 4,
        "SocketId": 1
}, {
        "ControlId": 1,
        "SlotId": 5,
        "RootBDF": "0000:b4:04.0",
        "PhyId": 5,
        "SocketId": 1
}, {
        "ControlId": 1,
        "SlotId": 6,
        "RootBDF": "0000:b4:04.0",
        "PhyId": 6,
        "SocketId": 1
}, {
        "ControlId": 1,
        "SlotId": 7,
        "RootBDF": "0000:b4:04.0",
        "PhyId": 7,
        "SocketId": 1
}, {
        "ControlId": 1,
        "SlotId": 8,
        "RootBDF": "0000:b4:04.0",
        "PhyId": 8,
        "SocketId": 1
}]
  1. ls -al /sys/block
    image

  2. 查看硬盘SilkScreen,硬盘信息有传过来,SilkScreen为空

期望结果

适配MiniSAS,硬盘有信息

实际结果

按照直通硬盘方法配PcieAddrInfo,实际上硬盘SilkScreen为空

尝试过的解决方案

配置0-9多个PcieAddrInfo,交叉硬盘槽位,实际结果还是这样。在代码里赋值SilkScreen后,web上就显示硬盘信息了

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

MiniSAS接口及其下硬盘适配问题分析与解决方案

根据您提供的信息,系统中存在 MiniSAS 接口连接两块 SATA 硬盘,但 SilkScreen 信息未正确显示(值为 null),尽管已配置 PcieAddrInfo_SASsilkconfig.json 文件中也生成了相关丝印数据。以下基于知识图谱和文档内容进行综合分析与指导。


:magnifying_glass_tilted_left: 问题核心:SilkScreen 为空的原因分析

尽管操作系统识别到了硬盘(通过 /sys/block 可见 sda, sdb 路径),Redfish 接口也能获取硬盘基本属性(如 SerialNumber, Protocol),但 SilkScreen 属性始终为空,说明:

:white_check_mark: 硬件通信正常
:cross_mark: 物理位置映射或配置未正确生效

根据知识图谱中的关键事实:

  • SilkScreen 的生成依赖于 PcieAddrInfo_SAS 配置是否被正确解析和应用。
  • PcieAddrInfo_SAS 必须在 HddBackplane 上正确配置 才能实现丝印标签的上报。
  • SilkConfigJson 依赖于 PcieAddrInfo_SAS 的完整性来生成最终用于显示的 silkconfig.json
  • 用户 liujie_11 曾报告:即使配置了 PcieAddrInfo_SAS,HostAgent 的 SilkScreen 字段仍为 null —— 这与当前现象一致。

:books: 根本原因分析

1. PcieAddrInfo_SAS 配置未与 HddBackplane 关联

关键关系:HddBackplane -- PcieAddrInfo_SAS
必须在 硬盘背板(HddBackplane)的 CSR 配置中引用 PcieAddrInfo_SAS,否则 BMC 不会将其用于丝印生成。

您的描述中提到“按照直通硬盘 SATA 的配法”,但 MiniSAS 是一种多盘位扩展接口,需显式声明其所在的背板拓扑结构

:warning: 错误点:仅配置了 PcieAddrInfo_SAS_1PcieAddrInfo_SAS_10,而未在背板级配置中声明 Location: HddBackplane${Slot}Drive 对象未引用 RefPCIeAddrInfo

2. 缺少 Drive 映射对象

关键关系:Drive -- PcieAddrInfo_SAS

每个实际的硬盘(Drive)必须通过 RefPCIeAddrInfo 引用对应的 PiceAddrInfo_SAS_x 条目,否则 HostAgent 无法完成物理位置与逻辑设备的匹配。

您当前只配了控制器端的 PCIe 地址映射,但没有建立从具体硬盘槽位到 PcieAddrInfo 的绑定

3. ControllerType 设置不当

您尝试将 ControllerType 改为 3 无效。

  • ControllerType = 2 表示 SAS 控制器(正确)
  • ControllerType = 3 可能是其他类型,不一定适用于 MiniSAS 直连场景

建议保持 ControllerType = 2,并确保 ComponentType 正确标识为 SEU SAS 类型或类似。

4. SR 文件未正确包含 PcieAddrInfo_SAS 定义

关键关系:SR File -- defines --> PcieAddrInfo_SAS

如果 PcieAddrInfo_SAS 条目不在正确的 .sr 配置文件中申明,BMC 将无法加载该配置,导致 bios_read_file_from_bmc 读取失败,get_pcie_silk_config 无法获取数据。


:white_check_mark: 正确适配方法:MiniSAS + HDD 的完整配置流程

请按照以下步骤进行完整配置:

:white_check_mark: 第一步:确保 CSR 中定义 HddBackplane 并启用 silk-screen 支持

参考《硬盘背板开发指南》(搜索结果 ID: 1):

# 示例:在 CSR 文件中定义 HddBackplane
HddBackplane:
  StartSlot: 0          # 必须设置,否则无效
  MaxDriveCount: 10     # 支持最多 10 个槽位
  SlotIDList: [0, 1, 2, ..., 9]
  EnableSilkScreenReport: true   # 显式开启丝印上报

:link: 关系:HddBackplane requires PcieAddrInfo_SAS for silk-screen reporting


:white_check_mark: 第二步:正确配置 PcieAddrInfo_SAS 条目(建议只定义实际使用的)

PcieAddrInfo_SAS_1:
  RootBDF: "0000:b4:04.0"
  SocketID: 1
  ControlId: 1
  PhyId: 0         # 对应物理端口 0
  SlotID: 0        # 槽位 0 上的硬盘
  ControllerType: 2
  ContainerUID: "00000001030302023935"
  ContainerUnitType: "SEU SAS"
  Location: "HddBackplane0"
  GroupPosition: 0

PcieAddrInfo_SAS_2:
  RootBDF: "0000:b4:04.0"
  SocketID: 1
  ControlId: 1
  PhyId: 1         # 物理端口 1
  SlotID: 1
  ControllerType: 2
  ContainerUID: "00000001030302023935"
  ContainerUnitType: "SEU SAS"
  Location: "HddBackplane1"
  GroupPosition: 1

:warning: 注意:

  • PhyId 应等于 MiniSAS 各通道编号(对应端口号)
  • SlotID 应与物理槽位一一对应
  • Location 必须为 "HddBackplane${Slot}" 格式

:white_check_mark: 第三步:定义 Drive 对象并引用 PcieAddrInfo

Drive:
  - SlotID: 0
    RefPCIeAddrInfo: PcieAddrInfo_SAS_1   # 关键!绑定物理地址
  - SlotID: 1
    RefPCIeAddrInfo: PcieAddrInfo_SAS_2

:link: 关系:Drive references PcieAddrInfo_SAS for silk screen labeling

否则 HostAgent 无法知道哪个硬盘对应哪个丝印标签。


:white_check_mark: 第四步:确认 SR 文件包含上述对象

确保 .sr 文件(或对应的配置源)中注册了所有 PcieAddrInfo_SAS_xDrive 定义。

:link: 关系:PcieAddrInfo_SAS defined in SR File

否则 bios_read_file_from_bmc 不会加载这些配置。


:white_check_mark: 第五步:验证 silkconfig.json 输出与 HostAgent 解析

运行:

cat /data/opt/bmc/conf/bios/silkconfig.json

应看到如下格式:

"DiskSilk": [
  {
    "ControlId": 1,
    "SlotId": 0,
    "RootBDF": "0000:b4:04.0",
    "PhyId": 0,
    "SocketId": 1
  },
  ...
]

并且:

  • SocketId 与 BIOS 报告一致(CPU2 → SocketID=1)
  • RootBDFlspci 输出一致
  • PhyId 与 OS 层 port-7:0, port-7:1 的编号一致

:white_check_mark: 第六步:重启 HostAgent 或触发刷新

有时 HostAgent 缓存旧状态,可尝试:

systemctl restart hostagent

或重新加载:

bios_read_file_from_bmc  # 手动触发读取

然后再次查看 Redfish 接口:

busctl get-property bmc.kepler.sms.redfish /xyz/openbmc_project/inventory/item/disk/slot0 xyz.openbmc_project.Inventory.Item Silkscreen

:puzzle_piece: 调试建议

1. 使用用户 caiyesheng_b48v3 的建议

caiyesheng_b48v3 用户指出:PcieAddrInfo_SAS 必须配置在 HddBackplane 上,并建议参考已有配置保持一致性。

建议:

  • 查看现有成功机型的 CSR/SR 配置
  • 复用已验证的 ContainerUIDGroupPosition 参数

2. 验证 BMC 是否识别 PCIe 路径

使用 lspci 确认 Root Port 是否为 b4:04.0

lspci | grep -i sas

并与 PcieAddrInfo_SAS.RootBDF 完全一致(注意 domain 是否为 0000:


:pushpin: 总结:解决 SilkScreen 为空的关键点

项目 是否必须 说明
:white_check_mark: HddBackplane 定义 必须设置 StartSlot, EnableSilkScreenReport
:white_check_mark: PcieAddrInfo_SAS_x 配置 逐个定义实际使用的端口
:white_check_mark: Drive.RefPCIeAddrInfo 绑定 每个硬盘必须绑定到一个 PcieAddrInfo
:white_check_mark: Location 字段格式正确 必须为 "HddBackplane${Slot}"
:white_check_mark: .sr 文件包含配置 BMC 启动时读取
:white_check_mark: silkscreen 字段由 HostAgent 自动填充 不能手动赋值,需自动解析

:books: 推荐参考资料

  1. 【硬盘背板开发指南】(ID: 1)—— 了解如何在 openUBMC 上适配硬盘背板
  2. 【openUBMC 25.12 LTS 版本发布说明】(ID: 4)—— 支持多款 NVMe 硬盘,驱动框架增强
  3. 【探索openUBMC】(ID: 8)—— 理解 BMC 在硬件管理中的角色

:white_check_mark: 最终结论

当前 SilkScreen 为空的根本原因是:虽然 PcieAddrInfo_SAS 已配置,但未通过 HddBackplaneDrive 对象建立完整的“物理槽位 → PCIe 映射”关系,导致 HostAgent 无法生成丝印信息。

建议操作:

  1. 在 CSR 中正确定义 HddBackplane
  2. 为每个硬盘创建 PcieAddrInfo_SAS_x
  3. 创建 Drive 对象并 RefPCIeAddrInfo 引用上述配置
  4. 确保 .sr 文件包含这些对象
  5. 重启 HostAgent 并验证 Redfish 输出

完成以上步骤后,SilkScreen 应能正常显示非 null 的值,Web 页面也能正确展示硬盘丝印信息。

相关链接:

  1. SAS/SATA盘信息无法获取
  2. 带内SATA盘配置问题
  3. sata盘信息获取问题
  4. M.2转接板下硬盘信息无显示
  5. 硬盘背板开发指南 | 文档中心 | openUBMC
  1. 有在背板级配置中声明 Location: HddBackplane${Slot}
  2. 按我理解,RefPCIeAddrInfo要在前置的BusinessConnector配,这个是PCIe卡配丝印才要配的吧?
  3. ControllerType = 2/ControllerType = 3都试过

同样固件,接在MiniSas下的硬盘,插到直通的SATA口下就有信息了。MiniSas是否要像PCIe卡那样配?

基于之前的配置,分别尝试将修改ControllerIndex为1,没丝印,基于ControllerIndex为1将ControllerType为3,也还是没丝印

像PCIe那样配了BusinessConnector和UnitConfiguration等,依旧没有丝印

@aliens_to_mars 帮忙回复下伙伴的问题

@yetaojie
如果silkscreen有值,就是丝印信息里的BDF、PhyId信息正确,silkscreen是拼接的丝印信息里的SlotId。
如果silkscreen没有值,就是丝印信息里的BDF、PhyId信息不正确。提问的场景从现象上看大概率是因为这个。
如果带内是可以识别到的,则可以通过redfish接口/Sms/1/Systems/1/Storage/1/Drivers去查询,BDF、PhyId
例如PCH_0000:32:04.0_disk8,其中phyid是8

如果和丝印对不上
检查修改丝印配置、PSR和硬盘背板CSR。

在尝试nvme丝印配法前,硬盘rootbdf已确定的情况下,已经穷举试过可能的组合了,SocketId 0-1、ControlId、PhyId 0-9、SlotId 0-8,依旧是没有丝印

现在的情况是有对应的PCIeAddrInfo,但是没有生成丝印文件吗?可否把配置的PCIeAddrInfo在资源树上的信息发出来,以及说明缺少了哪个槽位的丝印。

配置了PcieAddrInfo_SAS_1-10,有生成丝印文件,查看硬盘的SilkScreen为空,并非缺少哪个硬盘槽位的丝印,而是CPU直出的MiniSas接口,接了硬盘背板,其上的硬盘都没有获取到SilkScreen。而用同一份固件,SATA直出的硬盘可以获取到SilkScreen,从而显示硬盘信息
丝印如下:

[
    {
        "SlotId": 9,
        "PhyId": 9,
        "RootBDF": "0000:b4:04.0",
        "SocketId": 1,
        "ControlId": 1
    },
    {
        "SlotId": 0,
        "PhyId": 0,
        "RootBDF": "0000:b4:04.0",
        "SocketId": 1,
        "ControlId": 1
    },
    {
        "SlotId": 1,
        "PhyId": 1,
        "RootBDF": "0000:b4:04.0",
        "SocketId": 1,
        "ControlId": 1
    },
    {
        "SlotId": 2,
        "PhyId": 2,
        "RootBDF": "0000:b4:04.0",
        "SocketId": 1,
        "ControlId": 1
    },
    {
        "SlotId": 3,
        "PhyId": 3,
        "RootBDF": "0000:b4:04.0",
        "SocketId": 1,
        "ControlId": 1
    },
    {
        "SlotId": 4,
        "PhyId": 4,
        "RootBDF": "0000:b4:04.0",
        "SocketId": 1,
        "ControlId": 1
    },
    {
        "SlotId": 5,
        "PhyId": 5,
        "RootBDF": "0000:b4:04.0",
        "SocketId": 1,
        "ControlId": 1
    },
    {
        "SlotId": 6,
        "PhyId": 6,
        "RootBDF": "0000:b4:04.0",
        "SocketId": 1,
        "ControlId": 1
    },
    {
        "SlotId": 7,
        "PhyId": 7,
        "RootBDF": "0000:b4:04.0",
        "SocketId": 1,
        "ControlId": 1
    },
    {
        "SlotId": 8,
        "PhyId": 8,
        "RootBDF": "0000:b4:04.0",
        "SocketId": 1,
        "ControlId": 1
    }
]

我理解您是配置了NVME盘的PcieAddrInfo然后找不到丝印是吗?这个丝印不在DiskSilk下面,而在PCIeSilk下面,DeviceType是NVME。

不是的,接的是HDD硬盘,配置的也是DiskSilk,是host_agent资源树下硬盘资源无SilkScreen,不是没有丝印。另外配置了NVME盘的PcieAddrInfo,是配置SAS的PcieAddrInfo后没有获取到硬盘信息做的另外尝试

HDD硬盘应该也是走SAS啊?这样的话应该和SSD共用槽位才对

该载板分别有直出两个SATA接口和一个MiniSas接口,MiniSas接了一个硬盘背板,SATA接口和硬盘背板都可以接HDD,目前接在SATA接口上的硬盘有硬盘信息,接在MiniSas接口上的硬盘没有信息

对应上面哪个丝印信息呢?因为丝印信息是按照pcieaddrinfo来的,所以如果hdd盘和sas盘共享同一个槽位,他们也应该共享同一个丝印信息。

如果有对应硬盘槽位的丝印信息但是没有上报,就需要bma定位;反之如果配置了addr但是没有丝印是我这边看。

我理解minisas和sata配置拓扑白名单都是一样的,应该不会出现pcieaddrinfo没有的情况

我上述SATA和MiniSas并不是指硬盘背板上插SATA硬盘和HDD硬盘有差异,是两个不同的硬件槽位,只插了两块HDD硬盘,所以并非共享同一个槽位,而是指在同一份BMC固件以及相同的HDD硬盘情况下,SATA接口接HDD硬盘可以获取到SilkScreen和硬盘信息,所以我并不知道MiniSas接的硬盘背板正确的丝印信息是什么,理论上应该也是HddBackplane0-9吧。SATA接口接HDD盘时,丝印是HddBackplane0-1

配置了PcieAddrInfo
/data/opt/bmc/conf/bios/silkconfig.json 存在硬盘丝印
使用 busctl --user introspect bmc.kepler.host_agent /bmc/kepler/Systems/1/Sms/1/ComputerSystem/Systems/1/Storage/1/Drives/PCH_5F0000_3Ab4_3A04_2E0_5Fdisk1 查看硬盘信息,没有SilkScreen,有上报硬盘信息。代码里会比对SilkScreen,没有SilkScreen就无法将硬盘信息同步到Drive对象

这边建议如下操作:
mdbctl lsobj PcieAddrInfo查看所有的槽位,之后使用如
mdbctl lsprop PcieAddrInfo_SAS_1_010102 查看对应槽位的SlotID和PortID,和丝印文件里的DiskSilk里的一个条目SlotId和PhyId对应,如果有对应丝印条目,则说明是硬件给的预期配置不对、BMA返回不对或者storge获取的问题。

DiskSilk 中SlotId和PhyId的来源不就是PcieAddrInfo_SAS的SlotID和PortID吗


PcieAddrInfo是怎么配置的?麻烦提供一下一键收集日志