一、背景
服务器系统安装完成后,发现没有物理网卡:
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 ID2. 检查系统自带 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.ko7. 安装新模块
不要直接覆盖系统原模块,放到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-xgbe8. 验证驱动是否生效
查看模块信息:
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_v2a、xgbe_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问题解决。