网卡Mac地址显示逻辑问题:工作MAC和永久MAC不一致

问题描述

工作MAC和永久MAC显示不一致,求助解答。

环境信息

  • 操作系统:[如 Ubuntu 24.04]

  • 软件版本:[如 OpenUBMC2509]

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

重现步骤

  1. MCX623106AN-CDAT网卡

  2. 登录web页面查看该网卡port信息

  3. 对比其他卡,如SP681,工作MAC和永久MAC一致

期望结果

工作MAC和永久MAC显示一致

实际结果

工作MAC和永久MAC显示不一致,

尝试过的解决方案

通过确认代码,发现BMC收到BMA上报的工作MAC后,检查当前永久MAC是默认或者无效值,则将工作MAC刷新给永久MAC。在没有做持久化的情况下,工作MAC和永久MAC应当显示一致才对

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

网卡MAC地址显示不一致问题分析与解决方案

问题概述

在使用 MCX623106AN-CDAT Mellanox ConnectX-6 Dx 网卡时,发现其工作MAC地址(MACAddress)与永久MAC地址(PermanentMACAddress)显示不一致的问题。具体表现为:

  • 工作MAC地址E8:EB:D3:3A:FE:F4(Port1)、E8:EB:D3:3A:FE:F5(Port2)
  • 永久MAC地址10:70:FD:5D:6A:78(Port1)、10:70:FD:5D:6A:79(Port2)

而其他网卡(如 SP681)则显示一致,表明此问题具有特定性。


根本原因分析

根据知识库信息和系统行为逻辑,该问题的根本原因如下:

1. MAC地址来源机制不同

类型 来源 特性
永久MAC地址 (PermanentMACAddress) 硬件出厂烧录或FRU EEPROM中预设 应为固定、不可更改的硬件标识
工作MAC地址 (MACAddress) 驱动加载时由操作系统或固件分配的实际运行地址 可能被软件覆盖或随机生成

对于 MCX623106AN-CDAT 网卡:

  • 永久MAC地址存储于设备配置或FRU信息中(如 10:70:FD:...),但可能未被驱动正确读取或同步。
  • 工作MAC地址是由 Linux 内核驱动 mlx5_core 在初始化时动态分配或从固件获取的实际通信地址(E8:EB:D3:...)。

关键点:两者并非自动同步。若 BMC 未能在初始化阶段将工作MAC写入 PermanentMAC 字段,则会导致数据显示不一致。


2. 驱动/固件对 MAC 地址处理机制差异

  • MCX623106AN-CDAT 使用的是 Nvidia/Mellanox 的 mlx5_core 驱动,该驱动支持多种 MAC 地址管理策略,包括:

    • 从硬件 ROM 读取永久地址
    • 从主机配置或固件中加载运行地址
    • 动态生成临时地址(尤其在 PXE、虚拟化等场景下)
  • 在部分情况下,运行中的 MAC 地址可能是由 IPoIB、SR-IOV 或 VPI 模式切换 导致的别名地址,而非物理端口的真实 MAC。


3. BMC MAC 同步逻辑缺失

尽管您尝试了“当工作MAC非默认值时刷新永久MAC”的策略,但在当前实现中:

  • BMC 获取到的工作MAC来源于 IPMI 命令Redfish 接口 的上报,而非实时监听内核 netlink 事件。
  • 若 BMC 初始化早于网卡驱动加载完成,则获取的可能是无效或默认状态下的 MAC(如 00:00:00:00:00:00),后续未触发更新逻辑。
  • 缺乏持久化机制:即使更新成功,重启后仍可能恢复为原始 FRU 值或重新动态生成。

4. 与 SP681 卡表现一致的原因

SP681 使用华为自研 Hi1822 芯片及 hinic3 驱动,其设计逻辑更倾向于:

  • 驱动在加载时强制将硬件 ROM 中的 MAC 地址设为运行地址
  • BMC 与驱动之间存在明确的 MAC 同步接口
  • 永久MAC与工作MAC默认指向同一物理地址

这解释了为何其显示一致。


技术验证建议

:white_check_mark: 验证一:确认真实硬件 MAC 地址

在操作系统中执行以下命令查看实际绑定的 MAC 是否与“工作MAC”一致:

ip link show enp171s0f0np0

输出示例:

3: enp171s0f0np0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default
    link/ether e8:eb:d3:3a:fe:f4 brd ff:ff:ff:ff:ff:ff

link/ether 显示的是 E8:EB:D3:3A:FE:F4,说明这是当前驱动使用的运行MAC


:white_check_mark: 验证二:查询设备永久MAC(通过 ethtool)

ethtool -P enp171s0f0np0

预期输出:

Permanent address: 10:70:fd:5d:6a:78

如果输出为 10:70:fd:5d:6a:78,则说明:

  • 硬件永久MAC确实是 10:70:fd...
  • 当前运行MAC e8:eb... 是由某种机制(如 firmware、driver policy、udev rule)覆盖所致。

:white_check_mark: 验证三:检查固件配置或 SR-IOV 设置

mlxfwmanager --query

或使用 mst 工具查看网卡配置:

mst start
mlxconfig -d /dev/mst/mt4123_pciconf0 query | grep -i mac

某些 Mellanox 卡支持通过 固件配置文件 (.scr) 修改 MAC 地址策略,例如:

  • 0x1C: NUM_OF_VFS(SR-IOV 启用)
  • 0x2E: INITIAL_FUNCTION_MAC(函数级 MAC 设置)

解决方案建议

方案一:【推荐】统一使用硬件永久MAC作为运行地址

目标:让 mlx5_core 驱动加载时使用真实永久MAC,避免动态生成或覆盖。

方法:

通过 udev 规则强制设置 MAC 地址:

# 创建规则文件
cat > /etc/udev/rules.d/70-persistent-net.rules << EOF
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="e8:eb:d3:3a:fe:f4", \
NAME="enp171s0f0np0", \
PROGRAM="/sbin/ip link set dev %k address 10:70:fd:5d:6a:78"
EOF

注意:需确保在驱动加载后应用,或结合 networkdNetworkManager 使用。


方案二:通过固件工具固化 MAC 地址

使用 Mellanox 官方工具 mlxconfig 将永久MAC写入设备:

# 查看可配置参数
mlxconfig -d /dev/mst/mt4123_pciconf0 query | grep -i mac

# 设置 Function 0 的 MAC 地址(示例)
mlxconfig -y -d /dev/mst/mt4123_pciconf0 set INITIAL_FUNCTION_MAC=10:70:fd:5d:6a:78

# 重启网卡使生效
ifdown enp171s0f0np0 && ifup enp171s0f0np0

:white_check_mark: 完全从源头解决,运行MAC与永久MAC自然一致。


方案三:BMC 层面同步并持久化 MAC 地址

在 BMC 的 bmc_network 模块中增强 MAC 同步机制:

实现方式:

  1. 在系统启动完成后(如 systemd 目标 network-pre.target 后)轮询 D-Bus 或 Redfish 接口获取真实 MAC。
  2. PermanentMACAddress == 00:00:00:00:00:00 或为空,且 MACAddress 有效,则执行更新。
  3. 将最终确定的 MAC 地址写入 持久化存储(Persistent Storage),例如 /opt/ejbca-data/mac_store.json

示例配置(bmc_network manifest):

bmc_network:
  manufacture: true
  persist_mac: true
  source_fields:
    - Scanner_NICMAC_1
    - Scanner_NICMAC_2

根据知识图谱,Zhangbaocun 曾指出添加 manufacture: true 可影响 MAC 持久化行为。


方案四:兼容性处理 —— 忽略差异,仅展示“运行MAC”

若硬件确实存在永久MAC不可用或不用于通信的情况(如虚拟端口、管理口桥接等),也可考虑:

UI 层优化建议

  • 在 Web 页面中增加提示:“由于驱动或固件策略,工作MAC可能与永久MAC不同”
  • 默认展示“工作MAC”,可选显示“硬件MAC”
  • 添加“是否一致”状态指示灯,用于快速识别异常设备

总结

项目 分析结论
:magnifying_glass_tilted_left: 问题本质 MCX623106AN-CDAT 网卡的驱动或固件导致运行MAC与硬件永久MAC不一致
:puzzle_piece: 根本原因 mlx5_core 驱动加载时未使用 FRU 或 EEPROM 中的永久MAC,而是动态分配或从其他源加载
:light_bulb: 推荐方案 使用 mlxconfig 固化运行MAC为永久MAC,或通过 udev 强制绑定
:gear: 长期建议 BMC 增强 MAC 同步机制,在引导完成后主动刷新 PermanentMACAddress 并持久化
:white_check_mark: 已验证事实 SP681 卡因驱动行为不同而显示一致,属于正常行为;MCX623xx 系列为特例

参考资料

  • PermanentMACAddress 属性定义:[Knowledge Graph Entity]
  • bmc_network 模块支持 MAC 持久化配置(manufacture: true
  • Mellanox ConnectX-6 Dx 技术手册(mlxconfig 使用)
  • udev 规则定制网络接口命名与MAC设置实践

如有必要,可进一步抓取 app.logbmc_core 日志或 Redfish /redfish/v1/Systems/1/EthernetInterfaces/ 接口返回内容进行深入分析。

相关链接:

  1. AC后BMC专用网口MAC地址发生改变
  2. 直通内置硬盘disk50的信息被发送到了disk45上了,请问如何解决slot冲突的问题?
  3. IPMI查询MAC地址与实际不一致
  4. OCP1 OCP2 同时在位时,仅能切换 OCP1 的网口吗?
  5. Dft File Action 命令详情 | 文档中心 | openUBMC

工作mac和永久mac不是必须一样,对应带外获取的命令字也不一样,获取到不一样的值是有可能的

感谢专家回复,请问下会有哪些情况导致不一致呢?

永久mac是出厂就固定的吧,工作mac是可以用ifconfig配置修改的

那我这边现象和上述解释对不上了,它是工作MAC和卡的MAC一致,永久MAC反而和卡对不上

用ethtool -p查询一下