鲲鹏920S SATA直出场景仅部分盘能获取SilkScreen

问题描述

在鲲鹏920S平台上,使用2个SATA控制器直出4块SATA硬盘。
当前在BMC硬盘管理适配中发现:

ata2 能正常获取SilkScreen,其余 ata1 / ata3 / ata4 均为 null

设备信息

1. block设备

[root@localhost log]# ll /sys/block/
total 0
lrwxrwxrwx. 1 root root 0 Apr 22 13:15 sda -> ../devices/pci0000:74/0000:74:03.0/ata1/host2/target2:0:0/2:0:0:0/block/sda
lrwxrwxrwx. 1 root root 0 Apr 22 13:15 sdb -> ../devices/pci0000:74/0000:74:03.0/ata2/host4/target4:0:0/4:0:0:0/block/sdb
lrwxrwxrwx. 1 root root 0 Apr 22 13:15 sdc -> ../devices/pci0000:b4/0000:b4:03.0/ata3/host5/target5:0:0/5:0:0:0/block/sdc
lrwxrwxrwx. 1 root root 0 Apr 22 13:15 sdd -> ../devices/pci0000:b4/0000:b4:03.0/ata4/host6/target6:0:0/6:0:0:0/block/sdd

对应两个SATA控制器:

  • 0000:74:03.0(ata1 / ata2)

  • 0000:b4:03.0(ata3 / ata4)

2. 丝印配置(DiskSilk)

"DiskSilk": [
 {"PhyId": 3,"RootBDF": "0000:b4:03.0","SlotId": 3,"SocketId": 1,"ControlId": 1},
 {"PhyId": 4,"RootBDF": "0000:b4:03.0","SlotId": 4,"SocketId": 1,"ControlId": 1},
 {"PhyId": 1,"RootBDF": "0000:74:03.0","SlotId": 1,"SocketId": 0,"ControlId": 1},
 {"PhyId": 2,"RootBDF": "0000:74:03.0","SlotId": 2,"SocketId": 0,"ControlId": 1}
]

3. Redfish查询的硬盘列表

/redfish/v1/Sms/1/Systems/1/Storage/1/Drives/PCH_0000:b4:03.0_ata4
/redfish/v1/Sms/1/Systems/1/Storage/1/Drives/PCH_0000:b4:03.0_ata3
/redfish/v1/Sms/1/Systems/1/Storage/1/Drives/PCH_0000:74:03.0_ata2
/redfish/v1/Sms/1/Systems/1/Storage/1/Drives/PCH_0000:74:03.0_ata1

4块盘均已识别,PhyId已确认匹配正常。


异常现象

host_agent中仅 ata2 有SilkScreen,其余为null。

BMA丝印更新的部分日志

2026-04-22 13:15:55,200 INFO DrivesSilkScreen.py[startRequest 517] Read data result: {'0000:b4:03.0': {'Port3': 'HDDPlaneDisk3', 'Port4': 'HDDPlaneDisk4'}, '0000:74:03.0': {'Port1': 'HDDPlaneDisk1', 'Port2': 'HDDPlaneDisk2'}}
2026-04-22 13:16:53,529 INFO LibAdapter.py[generateEvent 934] Drives resource[PCH_0000:74:03.0_ata2,None] has changed, update source:{'SilkScreen': 'HDDPlaneDisk1'}.
2026-04-22 13:16:53,530 INFO DrivesSilkScreen.py[getAllInfo 406] Disk item: PCH_0000:74:03.0_ata2, silk screen: HDDPlaneDisk1.

未看到其他盘(ata1/ata3/ata4)的SilkScreen更新日志。

想了解一下,BMA更新SATA硬盘丝印的流程是什么呢,为什么仅有SATA2能更新丝印,和硬盘型号有无关联?然后PcieAddrInfo对象的ControllerID应该如何配置?会影响BMA的丝印关联流程吗?

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

项目 结论
问题根本原因 BMC 在 SilkScreen 匹配时错误地使用 PhyId 替代 PortID,导致映射错乱;以及 SR 文件可能缺少 PcieAddrInfo_SAS 对象
为何只有 ata2 成功 推测其 PhyId=2 恰好与某内部索引匹配,误取了 Port1 的值,属偶然现象
是否与硬盘型号有关 :multiply: 无关。所有 SATA 盘在直出场景下由 BMC 控制丝印,与型号无关
ControllerId 是否影响 :multiply: 无直接影响,只要一致即可
核心解决方向 :white_check_mark: 使用 PortID 配置 DiskSilk:white_check_mark: 确保 SR 文件包含完整 PcieAddrInfo_SAS:white_check_mark: 升级 BMA
点击此处查看详细分析解答

鲲鹏920S SATA直出场景下仅部分盘能获取 SilkScreen 问题分析

根据您提供的完整信息,结合知识库中的技术细节(包括KG实体、关系及文档内容),以下是对该问题的系统性分析和解答。


:magnifying_glass_tilted_left: 问题现象总结

在鲲鹏920S平台,使用两个SATA控制器(0000:74:03.00000:b4:03.0)直出4块SATA硬盘:

  • 所有4块硬盘均被系统识别(在 /sys/block/ 和 Redfish 接口可见)。
  • PhyIdRootBDFSlotId 配置正确且与带内一致。
  • ata2 能正确获取 SilkScreen,其余三块盘(ata1ata3ata4)的 SilkScreen 均为 null
  • BMA 日志中仅记录了对 PCH_0000:74:03.0_ata2 的 SilkScreen 更新,其他盘无更新日志。

:puzzle_piece: BMA 更新 SATA 硬盘 SilkScreen 的完整流程

根据文档 Chunk 2 和 Chunk 3 中描述的 DiskSilk 流程,以及 KG 中关于 BMA 与 SilkScreen 的关系,BMA 获取并更新硬盘丝印的核心流程如下:

:white_check_mark: 正常流程如下:

  1. BIOS 通过 IPMI 命令向 BMC 上报 PCIe 设备丝印配置信息

    • BMC 启动时,调用 get_pcie_silk_config()(由 bios_service.luabios_object_mutihost.lua 调用)。
    • BIOS 返回 silkconfig.json 文件中的 DiskSilk 配置列表。
  2. 生成丝印文件(SilkScreen 映射表)

    • BMC 根据 DiskSilk 配置项解析出每一块 CPU 直出盘的:
      • RootBDF
      • PortID / PhyId
      • SocketID
      • SlotID
      • ControllerType(SAS=2,SATA=3)
    • 构建映射关系:<RootBDF, PhyId> → SilkScreen
  3. BMA 定期请求丝印数据

    • BMA 通过调用 BMC 的 Redfish 接口或内部 API(如 DrivesSilkScreen.py)获取:
      {'0000:b4:03.0': {'Port3': 'HDDPlaneDisk3', 'Port4': 'HDDPlaneDisk4'}, ...}
      
    • 如您日志所示,这一步已成功执行。
  4. BMA 匹配物理盘对象并更新属性

    • BMA 根据 RootBDF + PhyId 查找对应硬盘(DRIVE)对象。
    • 匹配成功后,调用:
      LibAdapter.generateEvent(resource, {'SilkScreen': 'HDDPlaneDiskX'})
      
    • 最终更新 Redfish 资源中的 SilkScreen 字段。

:cross_mark: 问题定位:为何只有 ata2 成功?

尽管所有盘都能识别,PhyId 也已匹配,但 ata2 成功能更新 SilkScreen。结合日志和知识图谱信息,问题根源可能如下:

:magnifying_glass_tilted_right: 1. BMC 主动更新事件只触发了 ata2

关键日志:

2026-04-22 13:16:53,529 INFO LibAdapter.py[generateEvent 934] Drives resource[PCH_0000:74:03.0_ata2,None] has changed, update source:{'SilkScreen': 'HDDPlaneDisk1'}.

:warning: 注意:这里将 PCH_0000:74:03.0_ata2SilkScreen 更新为 'HDDPlaneDisk1' 是明显错误!

结论:虽然日志说“更新为 HDDPlaneDisk1”,但实际对象是 ata2 → 表明 PhyId 与 Port 映射错乱

深入分析:

Disk RootBDF PhyId PortID SilkScreen 预期 实际更新
ata1 0000:74:03.0 1 Port1 HDDPlaneDisk1 null
ata2 0000:74:03.0 2 Port2 HDDPlaneDisk2 HDDPlaneDisk1 :cross_mark:
ata3 0000:b4:03.0 3 Port3 HDDPlaneDisk3 null
ata4 0000:b4:03.0 4 Port4 HDDPlaneDisk4 null

:backhand_index_pointing_right: ata2 却获取了属于 ata1 的丝印,说明 映射表中 Port 与 PhyId 不对应


:magnifying_glass_tilted_right: 2. 根本原因:PhyId 与 PortID 混淆导致匹配失败

:white_check_mark: DiskSilk 配置中应使用 PortID 作为映射键(不是 PhyId)

从 Chunk 2 和 3 可知:

DiskSilk 是基于 PcieAddrInfo 对象实现的,其中 PortID 是 SilkScreen 匹配的关键字段。

但在实际驱动层或 BIOS 层:

  • PhyId 是 OS 层看到的 ATA Host Index(如 host2host4
  • PortID 是 BMC 层定义的逻辑端口号,必须与 SR 文件或丝印配置一致

:pushpin: 问题线索:

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

:warning: 问题在于: DiskSilk 配置项使用了 "PhyId" 字段!
然而,在标准 BIOS 丝印上报机制中,应使用 PortID 字段进行匹配

:fire: BMC 内部可能未将 PhyId 转换为 PortID,导致仅当两者数值相同时才匹配成功

因此,只有 ata2 成功,因为:

  • PhyId = 2
  • 日志中它拿到了 Port1 的丝印(即 "HDDPlaneDisk1"
  • 推测:BMC 错误地将 PhyId 当作索引去查表,导致顺序错位

:magnifying_glass_tilted_right: 3. SR 文件是否缺失 PcieAddrInfo_SAS 对象?

参考 Chunk 10:

:pushpin:14100665_00000001030302023936.sr 中没有 PcieAddrInfo_SAS 对象,因此丝印文件中没有硬盘丝印”

虽然您的场景中部分盘有丝印信息,但仍需确认 SR 文件是否完整定义了所有 SATA 控制器的信息:

# 检查路径:
/opt/bmc/sr/
# 或:
/data/opt/bmc/conf/bios/

:magnifying_glass_tilted_left: 确保:

  • 存在 PcieAddrInfo_SAS_1_4 的对象
  • 每个对象包含:
    {
      "RootBDF": "0000:74:03.0",
      "PortID": 1,
      "SlotID": 1,
      "SocketID": 0,
      "ControllerType": 3,
      "ComponentType": "SAS"
    }
    

若缺失,则 SilkScreen 不会生成。


:magnifying_glass_tilted_right: 4. BMA 版本与兼容性问题

KG 提及:

“BMA 版本 2.16.0 存在 SATA 盘 vendor 显示错误和 silkscreen 获取为空的问题”

建议检查:

  • 当前 BMA 是否为 2.16.0 或更低版本
  • 建议升级至 2.20.0+ 或 iBMA,提升直连存储支持能力

:white_check_mark: 解决方案建议

:white_check_mark: 1. 修正丝印配置字段:使用 PortID 而非 PhyId

"DiskSilk": [
  {
    "PortID": 1,
    "RootBDF": "0000:74:03.0",
    "SlotId": 1,
    "SocketId": 0,
    "ControlId": 1,
    "ControllerType": 3
  },
  {
    "PortID": 2,
    "RootBDF": "0000:74:03.0",
    "SlotId": 2,
    "SocketId": 0,
    "ControlId": 1,
    "ControllerType": 3
  },
  {
    "PortID": 3,
    "RootBDF": "0000:b4:03.0",
    "SlotId": 3,
    "SocketId": 1,
    "ControlId": 1,
    "ControllerType": 3
  },
  {
    "PortID": 4,
    "RootBDF": "0000:b4:03.0",
    "SlotId": 4,
    "SocketId": 1,
    "ControlId": 1,
    "ControllerType": 3
  }
]

:warning: 确保 BIOS 和 BMC 都识别 PortID 字段(而非 PhyId


:white_check_mark: 2. 验证 SR 文件中是否存在 PcieAddrInfo_SAS_X 对象

# 查看 SR 文件内容
cat /opt/bmc/sr/*.sr | grep -A10 -B5 "PcieAddrInfo_SAS"

若缺失,请添加:

{
  "ObjectName": "PcieAddrInfo_SAS_1",
  "ObjectClass": "PcieAddrInfo",
  "RootBDF": "0000:74:03.0",
  "PortID": 1,
  "SlotID": 1,
  "SocketID": 0,
  "ControllerType": 3,
  "ComponentType": "SAS"
}

依此类推定义 _2_4


:white_check_mark: 3. 检查 BIOS 生成的 silkconfig.json

路径:

dump_info/AppDump/bios/silkconfig.json

确认其中 DiskSilk 数组中的 PortID 是否正确,SilkScreen 标签是否匹配。


:white_check_mark: 4. 升级 BMA 或使用 iBMA

若当前为 BMA 2.16.0,考虑升级至:

  • BMA 2.20.0
  • 或直接采用 iBMA(整合式管理代理,对直通盘支持更好)

:white_check_mark: 5. 验证 PhyId 与 PortID 实际对应关系

在 OS 中运行:

# 查看每个 disk 的 link 源
ls -la /sys/block/sd[a-d]/device

# 输出类似:
ata1 → host2
ata2 → host4  ← 注意不是 host3

:warning:ata1 对应 host2ata2 对应 host4,则表示:

  • ATA Port 编号不连续
  • 可能有中间 PORT 被占用或禁用

需在 BMC 配置中 显式声明 PortID 对应关系


:pushpin: ControllerId 是否影响 SilkScreen 匹配?

:white_check_mark: 不影响。

根据 KG 和文档:

  • ControllerId 是用于标识 RAID 控制器的逻辑 ID。
  • CPU 直出、无 RAID 卡 的场景下:
    • AttachedControllerId = 255(表示不受控)
    • ControllerId 仅用于 BMC 内部资源归类,不参与 SilkScreen 匹配
  • SilkScreen 匹配关键参数是:
    • RootBDF
    • PortID(或 PhyId,若被错误替代)

:white_check_mark: 结论:ControllerId 可统一设为 1,不影响丝印获取。


:white_check_mark: 总结

项目 结论
问题根本原因 BMC 在 SilkScreen 匹配时错误地使用 PhyId 替代 PortID,导致映射错乱;以及 SR 文件可能缺少 PcieAddrInfo_SAS 对象
为何只有 ata2 成功 推测其 PhyId=2 恰好与某内部索引匹配,误取了 Port1 的值,属偶然现象
是否与硬盘型号有关 :multiply: 无关。所有 SATA 盘在直出场景下由 BMC 控制丝印,与型号无关
ControllerId 是否影响 :multiply: 无直接影响,只要一致即可
核心解决方向 :white_check_mark: 使用 PortID 配置 DiskSilk:white_check_mark: 确保 SR 文件包含完整 PcieAddrInfo_SAS:white_check_mark: 升级 BMA

:hammer_and_wrench: 建议操作清单

  1. DiskSilk 配置中的 PhyId 改为 PortID
  2. 检查并补充 SR 文件中的 PcieAddrInfo_SAS_X 对象
  3. 验证 BIOS 生成的 silkconfig.jsonPortID 正确
  4. 升级 BMA 至 2.20.0 或使用 iBMA
  5. 重启 BMC + 主机,确保 BMA 完整注册

完成以上步骤后,4 块盘应均可正常显示 SilkScreen 信息。

如有需要,可提供 silkconfig.json 和 SR 文件内容进一步诊断。

将4个PcieAddrInfo对象的PortID由1/2/3/4调整为0/1/2/3后,能够正常关联74:03.0出的两个SATA盘,但是b4:03.0出的SATA盘还是关联不到,想问一下这个PortID究竟该怎么配置?
以下为当前PcieAddrInfo的实际配置:

{
  "PcieAddrInfo": [
    {
      "Name": "SATA_1",
      "SocketID": 0,
      "SlotID": 1,
      "PortID": 0,
      "Bus": 116,
      "Device": 3,
      "Function": 0
    },
    {
      "Name": "SATA_2",
      "SocketID": 0,
      "SlotID": 2,
      "PortID": 1,
      "Bus": 116,
      "Device": 3,
      "Function": 0
    },
    {
      "Name": "SATA_3",
      "SocketID": 1,
      "SlotID": 2,
      "PortID": 2,
      "Bus": 180,
      "Device": 3,
      "Function": 0
    },
    {
      "Name": "SATA_4",
      "SocketID": 1,
      "SlotID": 4,
      "PortID": 3,
      "Bus": 180,
      "Device": 3,
      "Function": 0
    }
  ]
}

试过调整Sata_3、SATA_4的PortID调整为0、1也关联不上丝印。

与硬盘型号无关,就是白名单中的配置,具体需要pciedevice看看

白名单是说silkconfig中的DiskSilk吗,pciedevice组件生成的丝印内容我看没啥问题,=和定义的pcieaddrinfo对象一致。

这边PortId丝印生成的和PcieAddrInfo一致,具体PortId要配置多少依赖硬件链路,需要找硬件给出预期,见 docs/docs/zh/development/develop_guide/feature_development/pcie_device_topo_create.md-代码预览-docs:基于 Node.js 的社区文档中心项目 - AtomGit | GitCode中硬件提供表格示意一节。

后续排查确认是 RootBDF 大小写不一致导致iBMA无法正确关联

丝印和BDF silkconfig.json 的映射关系为:

RootBDF + Port<PhyId> -> HDDPlaneDisk<SlotId>

其中,iBMA 根据同一 RootBDF 下 SATA 设备的 ataN 编号计算 PortID:

PortID = 当前 ataN 的 N - 该 RootBDF 下最小的 N

CPU2 控制器 0000:B4:03.0 下有 ata3ata4,因此:

ata3:3 - 3 = Port0 -> PhyId 0 -> HDDPlaneDisk3
ata4:4 - 3 = Port1 -> PhyId 1 -> HDDPlaneDisk4

这里的 PortID 是 iBMA 根据磁盘枚举编号计算出的逻辑端口,不是 SerDes Lane 编号。

本次失败的直接原因是 BMC 下发的丝印文件silkconfig.json中RootBDF字典键为:

0000:b4:03.0

而 iBMA 查询时使用大写的BDF:

0000:B4:03.0

字典键区分大小写,导致丝印匹配失败。最终将 BIOS 服务生成 RootBDF 的格式从 %02x 改为 %02X,iBMA 成功生成:

'0000:B4:03.0': {
    'Port0': 'HDDPlaneDisk3',
    'Port1': 'HDDPlaneDisk4'
}

修改后 CPU2 的硬盘丝印可以正常匹配。