UOS Server 20 海光网卡不识别解决记录

UOS Server 20 海光网卡不识别解决记录

一、背景

服务器系统安装完成后,发现没有物理网卡:

ip link

只看到:

lo

但是lspci可以看到海光网卡设备:

lspci -nn | grep -i ethernet

输出类似:

06:00.4 Ethernet controller: Chengdu Haiguang IC Design Co., Ltd. 10 Gb Ethernet Controller [1d94:1458] 06:00.5 Ethernet controller: Chengdu Haiguang IC Design Co., Ltd. 10 Gb Ethernet Controller [1d94:1458] 06:00.6 Ethernet controller: Chengdu Haiguang IC Design Co., Ltd. 10 Gb Ethernet Controller [1d94:1459] 06:00.7 Ethernet controller: Chengdu Haiguang IC Design Co., Ltd. 10 Gb Ethernet Controller [1d94:1459]

系统环境:

cat /etc/os-release uname -r

关键信息:

UOS Server 20 5.10.0-79.uel20.x86_64

最终判断:PCI 设备能识别,但驱动没有正确绑定。


二、完整成功步骤

1. 确认网卡 PCI ID

先确认网卡设备:

lspci -nn | grep -i ethernet

看到:

1d94:1458 1d94:1459

其中:

1d94 = 成都海光 / Hygon / Haiguang 的 Vendor ID 1458 / 1459 = 海光 10G Ethernet Controller 的 Device ID

2. 检查系统自带 amd-xgbe 驱动

modinfo amd-xgbe

系统自带驱动存在,但只支持 AMD 的 PCI ID:

pci:v00001022d00001458... pci:v00001022d00001459...

而实际海光网卡是:

pci:v00001D94d00001458... pci:v00001D94d00001459...

所以系统自带amd-xgbe不会自动绑定这块海光网卡。


3. 下载海光 XGbE 驱动源码包

驱动包地址:[免费]成都海光网卡驱动安装包(UOS操作系统)_其它软件_软件_办公资源_资源共享网

下载后进入源码目录:

cd XGbEDriver/XGbEDriver-master/driver/xgbe

确认源码支持海光 PCI ID:

grep -RniE '1d94|1458|1459|HYGON|Hygon|Haiguang' .

正常应该能看到类似:

xgbe-pci.c:#define PCI_VENDOR_ID_HYGON 0x1d94 xgbe-pci.c:{ PCI_VDEVICE(HYGON, 0x1458), ... } xgbe-pci.c:{ PCI_VDEVICE(HYGON, 0x1459), ... }

这说明驱动包是对的。


4. 编译前确认当前内核 ethtool API

UOS Server 20 虽然是 5.10 内核,但它回移植了较新的ethtool_ops接口。

查看当前内核头文件:

sed -n '1124,1144p' /lib/modules/$(uname -r)/build/include/linux/ethtool.h

如果看到:

int (*get_coalesce)(struct net_device *, struct ethtool_coalesce *, struct kernel_ethtool_coalesce *, struct netlink_ext_ack *); int (*set_coalesce)(struct net_device *, struct ethtool_coalesce *, struct kernel_ethtool_coalesce *, struct netlink_ext_ack *); void (*get_ringparam)(struct net_device *, struct ethtool_ringparam *, struct kernel_ethtool_ringparam *, struct netlink_ext_ack *); int (*set_ringparam)(struct net_device *, struct ethtool_ringparam *, struct kernel_ethtool_ringparam *, struct netlink_ext_ack *);

说明当前内核要求 4 参数版本。


5. 修改 xgbe-ethtool.c

直接备份:

cp xgbe-ethtool.c xgbe-ethtool.c.bak

然后在xgbe-ethtool.c#include前后加入两个宏:

#define XGBE_COALESCE_GET_SET_ADD_PARAMS #define XGBE_RINGPARAM_GET_SET_ADD_PARAMS

确认是否插入成功:

grep -nE 'XGBE_COALESCE_GET_SET_ADD_PARAMS|XGBE_RINGPARAM_GET_SET_ADD_PARAMS' xgbe-ethtool.c

能看到:

#define XGBE_COALESCE_GET_SET_ADD_PARAMS #define XGBE_RINGPARAM_GET_SET_ADD_PARAMS

即可。


6. 编译驱动

make clean make

编译成功后查找模块:

find . -name '*.ko'

正常会生成:

amd-xgbe.ko

7. 安装新模块

不要直接覆盖系统原模块,放到updates目录:

mkdir -p /lib/modules/$(uname -r)/updates/drivers/net/ethernet/amd/xgbe cp amd-xgbe.ko /lib/modules/$(uname -r)/updates/drivers/net/ethernet/amd/xgbe/ depmod -a modprobe -r amd-xgbe modprobe amd-xgbe

8. 验证驱动是否生效

查看模块信息:

modinfo amd-xgbe | egrep -i 'filename|alias|vermagic'

正常应该看到:

filename: /lib/modules/5.10.0-79.uel20.x86_64/updates/... alias: pci:v00001D94d00001458... alias: pci:v00001D94d00001459... vermagic: 5.10.0-79.uel20.x86_64 ...

重点是filename来自updates目录,并且alias里出现了1D94


9. 验证网卡是否出现

ip -br link

正常会看到:

lo UNKNOWN eno1 DOWN eno2 DOWN eno3 DOWN eno4 DOWN

再查看 PCI 绑定情况:

lspci -nnk -s 06:00.4 lspci -nnk -s 06:00.5 lspci -nnk -s 06:00.6 lspci -nnk -s 06:00.7

正常应该看到:

Kernel driver in use: amd-xgbe

到这里,驱动问题就解决了。后续就是配置网络的基本步骤了。


三、踩坑记录

坑 1:lspci 能看到,不代表驱动正常

lspci能看到网卡,只能说明 PCI 总线识别到了硬件。

真正判断驱动是否正常,要看:

ip link lspci -nnk

如果ip link没有物理网卡,lspci -nnk里也没有:

Kernel driver in use

那就是驱动没有绑定。


坑 2:系统自带 amd-xgbe 不一定支持海光

系统自带的amd-xgbe只支持:

1022:1458 1022:1459

其中1022是 AMD 的 Vendor ID。

但海光网卡是:

1d94:1458 1d94:1459

所以必须使用支持1d94的海光版驱动。


坑 3:new_id 不一定能解决

尝试过:

echo "1d94 1458" > /sys/bus/pci/drivers/amd-xgbe/new_id echo "1d94 1459" > /sys/bus/pci/drivers/amd-xgbe/new_id

结果:

Invalid argument

原因是amd-xgbe不是简单加 PCI ID 就能绑定,它还依赖内部driver_data,例如xgbe_v2axgbe_v2b

所以正确做法是编译带有海光 PCI ID 支持的源码包。


坑 4:不要下错驱动

这块网卡不是:

Intel Broadcom Mellanox

正确方向是:

XGbEDriver Hygon XGbE amd-xgbe 海光 10G LOM 网卡驱动

坑 5:UOS 5.10 内核有 API 回移植

编译时报错:

-Werror=incompatible-pointer-types .get_coalesce = xgbe_get_coalesce .set_coalesce = xgbe_set_coalesce .get_ringparam = xgbe_get_ringparam .set_ringparam = xgbe_set_ringparam

不是驱动完全不能用,而是 UOS 的 5.10 内核使用了新的ethtool_ops函数签名。

解决办法就是在xgbe-ethtool.c里启用:

#define XGBE_COALESCE_GET_SET_ADD_PARAMS #define XGBE_RINGPARAM_GET_SET_ADD_PARAMS

四、最终结果

最终安装后的状态:

modinfo amd-xgbe | egrep -i 'filename|alias|vermagic'

能看到:

filename: /lib/modules/5.10.0-79.uel20.x86_64/updates/... alias: pci:v00001D94d00001458... alias: pci:v00001D94d00001459...

查看网卡:

ip -br link

能看到:

eno1 eno2 eno3 eno4

查看 PCI 绑定:

lspci -nnk -s 06:00.4

能看到:

Kernel driver in use: amd-xgbe

问题解决。