最近我购买了两张 SuperMicro AOC-STGN-I2S 局域网卡(两个 10Gb\s SFP+ 端口)。其中一张在 Windows(我的测试 PC)和我的服务器上的 FreeBSD 下都可以正常工作。第二张是完全相同的卡,但上面贴着“Coraid”的标签。问题是我根本无法使用它(在 Windows 和 FreeBSD 中它不起作用):
引导加载程序在启动过程中给出错误:
PXE-E01: PCI Vendor and Device IDs do not much!
在 Windows 设备管理器中,我有两个没有驱动程序的未知设备,我无法从 SuperMicro 网站安装官方驱动程序。设备 ID 为:
PCI\VEN_8086&DEV_0001&CC_0200
据我了解,Coraid 标签意味着此网卡已刷新为另一个固件,以支持 Coraid 软件提供的网络存储功能。是否可以将此卡刷新回原始 SuperMicro 固件并将其用作普通网卡?
答案1
我至少有 3 张卡有同样的问题,可能还有很多。我们最近购买了大约 20 张这样的卡,以便将我们的部分生产环境迁移到 10G。其中 3 张卡上贴有 Coraid 标签,但更多的卡根本无法识别为 Supermicro AOC-STGN-I2S。其中一些卡被正确识别,因此我可以通过测试系统中的测试轻松识别它们。
如果你找到了刷新它们的方法,请告诉我。一旦我找到方法,我也会这样做。
扬·雨果·普林斯
答案2
我联系了 Supermicro 和 Coraid 的支持人员。他们的回答是:1. Supermicro 给了我实用工具,但它无法与 Coraid 局域网卡配合使用。2. Coraid 说,只有我寄给他们卡,他们才能帮我。他们要价每张卡 100 美元 + 运费。O_o 疯子们……所以最简单的方法就是把 Coraid 卡扔到垃圾桶,然后找一些带有原始 Supermicro 固件的卡。
答案3
我现在知道如何纠正这个问题,但我无法找出神奇的关键,以下是我迄今为止的尝试:
要在 Ubuntu 下访问卡,请执行以下操作:
sudo chmod 777 /sys/bus/pci/drivers/ixgbe/new_id
sudo echo 8086 0001 >/sys/bus/pci/drivers/ixgbe/new_id
现在您可以使用这些命令来“验证”该表:
sudo ethtool -e enp1s0f0 offset 0x0340 length 0xb
sudo ethtool -e enp1s0f0 offset 0x0340 length 0xc
sudo ethtool -e enp1s0f0 offset 0x0350 length 0x7
sudo ethtool -e enp1s0f0 offset 0x0350 length 0x8
__ __
>0x0340: 93 aa e2 6a 03 00 05 00 3f 06 fb 10 00 00 04 14
<0x0340: c1 f6 e2 6a 03 00 05 00 3f 06 01 00 00 00 04 14
b c
__ __
>0x0350: 00 00 05 00 3f 16 fb 10 00 00 04 14 00 00 07 00
<0x0350: 00 00 05 00 3f 16 01 00 00 00 04 14 00 00 07 00
7 8
问题是我无法找出覆盖错误设备 ID 的神奇值:
sudo ethtool -E enp1s0f0 magic 0x00018086 offset 0340x0b value 0xfb
sudo ethtool -E enp1s0f0 magic 0x00018086 offset 0x0340 value bxfb
sudo ethtool -E enp1s0f0 magic 0x00018086 offset 0x0340 value 0bxfb
答案4
我在 Intel X520-DA2 上遇到了同样的问题。为了解决这个问题,我使用 Ubuntu 18.04 服务器来更改卡的 EEPROM 内容ethtool
。
modinfo
显示 ixgbe 驱动程序的以下内容:
modinfo ixgbe.ko
filename: /lib/modules/5.4.0-131-generic/kernel/drivers/net/ethernet/intel/ixgbe/ixgbe.ko
version: 5.1.0-k
...
lspci
显示我们得到的结果。它将 x520-DA2 的两个端口作为单独的以太网卡返回:
lspci|grep Eth
01:00.0 Ethernet controller: Intel Corporation Device 0001 (rev 01)
01:00.1 Ethernet controller: Intel Corporation Device 0001 (rev 01)
为了查询卡的供应商和子系统 ID,我们lspci
再次调用并附加上面的 PCI 总线 ID。我们可以使用其中任何一个 ID(例如 01:00.0)。
lspci -vns 01:00.0|head -2
01:00.0 0200: 8086:0001 (rev 01)
Subsystem: 1b52:10fb
“8086”是供应商 ID(对于 Intel)。“0001”是子供应商 ID。它通常表明它是哪个设备。在我们的例子中,“0001”肯定是错误的。由于子供应商 ID 错误,驱动程序模块 ixgbe 不认为对卡负责。但我们仍然可以说服它。我们只需加载模块,然后告诉它照顾我们的卡。它是这样完成的:
modprobe ixgbe
echo 8086 0001 > /sys/bus/pci/drivers/ixgbe/new_id
执行此操作后,dmesg
应显示以下输出:
dmesg
[ 213.983160] ixgbe: Intel(R) 10 Gigabit PCI Express Network Driver - version 5.1.0-k
[ 213.983161] ixgbe: Copyright (c) 1999-2016 Intel Corporation.
[ 214.151320] ixgbe 0000:01:00.0: Multiqueue Enabled: Rx Queue count = 8, Tx Queue count = 8 XDP Queue count = 0
[ 214.151607] ixgbe 0000:01:00.0: 32.000 Gb/s available PCIe bandwidth (5.0 GT/s PCIe x8 link)
[ 214.151946] ixgbe 0000:01:00.0: MAC: 2, PHY: 20, SFP+: 5, PBA No: G73129-006
[ 214.151946] ixgbe 0000:01:00.0: a0:36:9f:xx:xx:xx
[ 214.154111] ixgbe 0000:01:00.0 enp1s0f0: renamed from eth0
[ 214.175253] ixgbe 0000:01:00.0: Intel(R) 10 Gigabit Network Connection
[ 214.347439] ixgbe 0000:01:00.1: Multiqueue Enabled: Rx Queue count = 8, Tx Queue count = 8 XDP Queue count = 0
[ 214.347730] ixgbe 0000:01:00.1: 32.000 Gb/s available PCIe bandwidth (5.0 GT/s PCIe x8 link)
[ 214.348051] ixgbe 0000:01:00.1: MAC: 2, PHY: 20, SFP+: 6, PBA No: G73129-006
[ 214.348052] ixgbe 0000:01:00.1: a0:36:9f:xx:xx:xx
[ 214.350172] ixgbe 0000:01:00.1 enp1s0f1: renamed from eth0
[ 214.379294] ixgbe 0000:01:00.1: Intel(R) 10 Gigabit Network Connection
[ 332.357800] ixgbe 0000:01:00.1: complete
[ 332.381819] ixgbe 0000:01:00.0: complete
识别卡后,有两个新的以太网适配器。我们用它ip
来列出它们。
ip a
...
1: enp1s0f0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether a0:36:9f:xx:xx:xx brd ff:ff:ff:ff:ff:ff
2: enp1s0f1: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether a0:36:9f:xx:xx:xx brd ff:ff:ff:ff:ff:ff
这些卡通常显示为 enp1s0f0 和 enp1s0f1。因此,让我们使用以下命令查看 EEPROM 的内容ethtool
:
ethtool -e enp1s0f0
我的EEPROM的内容如下(摘录):
0x0320: 03 00 1f 00 00 00 00 2b 03 53 fb 10 52 1b 01 00
0x0330: 01 00 f5 07 ed 10 35 00 64 6e 01 00 90 e2 ba 4c
0x0340: 8f dc e2 6a 03 00 05 00 3f 07 01 00 00 00 04 14
0x0350: 00 00 05 00 3f 17 01 00 00 00 04 14 00 00 07 00
根据 @JustKoz 的说法,子供应商 ID 位于 0x034a 和 0x034b 以及 0x0356 和 0x0357。我们的子供应商 ID“0001”存储为“01 00”,并进行了字节交换。
0x0340: xx xx xx xx xx xx xx xx xx xx 01 00 xx xx xx xx
0x0350: xx xx xx xx xx xx 01 00 xx xx xx xx xx xx xx xx
X520-DA2 的正确子供应商 ID 是 10fb。为了使用 更改上述地址ethtool
,要发出的命令如下:
ethtool -E enp1s0f0 magic 0x00018086 offset 0x034a value 0xfb
ethtool -E enp1s0f0 magic 0x00018086 offset 0x034b value 0x10
ethtool -E enp1s0f0 magic 0x00018086 offset 0x0356 value 0xfb
ethtool -E enp1s0f0 magic 0x00018086 offset 0x0357 value 0x10
我注意到我的卡上显示的“1b52:10fb”值也出现在@JustKoz 附加的 BIOS 图片中。这是错误的子系统 ID。
子系统 ID 存储在 0x032a-0x032d 中。lscpi
输出中的子系统 ID 可在此处再次找到,但字节已交换且顺序错误。
0x0320: xx xx xx xx xx xx xx xx xx xx fb 10 52 1b xx xx
我们看到的不是 1b52:10fb,而是“fb 10 52 1b”
修复子系统 ID 的方法与修复子供应商 ID 的方法相同。由于我没有另一张卡作为 ID 的参考,因此我使用了此地点。因为我重新启动来测试卡的子供应商 ID 是否设置正确,所以ethtool
从现在开始我们需要在调用中使用 0x10fb8086 作为魔法。
ethtool -E enp1s0f0 magic 0x10fb8086 offset 0x032c value 0x86
ethtool -E enp1s0f0 magic 0x10fb8086 offset 0x032d value 0x80
ethtool -E enp1s0f0 magic 0x10fb8086 offset 0x032a value 0x02
ethtool -E enp1s0f0 magic 0x10fb8086 offset 0x032b value 0x00
0x032x 块的最后两个字节也已被篡改(我认为),所以我也更正了它们。我从 Supermicro 卡以及此卡的 DELL 变体中获取了这些值。其他两张卡上的值相同,但这并不意味着原装 Intel 卡也是如此。因此,请谨慎对待它们的内容。(旁注:Windows 下的“Intel(R) PROSet 适配器配置实用程序”检查了 EEPROM,结果显示为绿色。)
ethtool -E enp1s0f0 magic 0x10fb8086 offset 0x032e value 0xa6
ethtool -E enp1s0f0 magic 0x10fb8086 offset 0x032f value 0x10
应用上述所有更改后,我将卡切换到 Windows 计算机。驱动程序安装顺利,我看到了 10Gbs 链接。 司机 地位
总结一下。修复完所有问题后,我的卡的 EEPROM 的内容如下:
0x0320: 03 00 1f 00 00 00 00 2b 03 53 02 00 86 80 a6 10
0x0330: 01 00 f5 07 ed 10 35 00 64 6e 01 00 90 e2 ba 4c
0x0340: 8f dc e2 6a 03 00 05 00 3f 07 fb 10 00 00 04 14
0x0350: 00 00 05 00 3f 17 fb 10 00 00 04 14 00 00 07 00