问题分析
拿到手的 10G 网卡让我感到非常激动, 但在上机测试后, 我发现内网两台电脑传输文件时, 只能传输约 48MB, 之后就出现了报错并停止传输。然而, 换回之前的网卡后, 这个问题就不再出现。经过多次测试后, 我怀疑问题可能出在网卡驱动上, 并且在亚马逊的用户评价中, 发现有类似的情况。
通过进一步查找, 了解到在亚马逊上看到了几条评价也遇到了丢包问题, 紧接着网卡就停止工作了, 这与我遇到的情况非常相似。
亚马逊用户评论
Red Hat Bugzilla – Bug 1499321
驱动更新
CentOS 7 系统默认的驱动版本是 v2.0.4.0
, 网卡芯片组为 Aquantia AQC107
确认网卡信息
用 lspci
可以看到网卡的芯片组是 AQC107
这个也是我们要去下载的驱动的信息
lspci -s 09:00.0 -vv
09:00.0 Ethernet controller: Aquantia Corp. AQC107 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] (rev 02)
Subsystem: ASUSTeK Computer Inc. Device 8741
使用 ethtool
可以查看当前网卡使用的驱动版本
ethtool -i enp2s0
driver: atlantic
version: 2.0.4.0-kern
firmware-version: 3.0.33
expansion-rom-version:
bus-info: 0000:09:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no
在上一步的信息里面找到了 驱动名称 atlantic
接下来就可以查看驱动详细信息
modinfo atlantic
filename: /lib/modules/4.20.11-1.el7.elrepo.x86_64/kernel/drivers/net/ethernet/aquantia/atlantic/atlantic.ko
description: aQuantia Corporation(R) Network Driver
author: aQuantia
version: 2.0.4.0-kern
license: GPL v2
srcversion: 65B2095FA0FFCABF9686A7B
alias: pci:v00001D6Ad000052B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000051B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000092B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000091B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000089B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000088B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000087B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000080B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000012B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000011B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000009B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000008B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000007B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000000B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad0000D109sv*sd*bc*sc*i*
alias: pci:v00001D6Ad0000D108sv*sd*bc*sc*i*
alias: pci:v00001D6Ad0000D107sv*sd*bc*sc*i*
alias: pci:v00001D6Ad0000D100sv*sd*bc*sc*i*
alias: pci:v00001D6Ad00000001sv*sd*bc*sc*i*
depends:
retpoline: Y
intree: Y
name: atlantic
vermagic: 4.20.11-1.el7.elrepo.x86_64 SMP mod_unload modversions
parm: aq_itr:Interrupt throttling mode (uint)
parm: aq_itr_tx:TX interrupt throttle rate (uint)
parm: aq_itr_rx:RX interrupt throttle rate (uint)
这一步可以看到我的内核是自己升级过的 4.20.11
还有就是网卡的驱动版本是 2.0.4.0-kern
下载驱动
华硕自家的支持 (XG-C100C Support) 里面也有驱动工具, 但是里面的版本非常低是 v2.0.15.0
截止本文发布的时候 AQC107 驱动版本是 v2.2.6.0.178
华硕的 XG-C100C 使用的芯片组是 Aquantia AQC107 所以可以直接安装 Aquantia 的驱动 (Aquantia Driver Downloads)
安装基础工具
安装步骤在 README.txt
写的很详细. 这里只讲一种方法
如果是自己升级内核就需要同时安装内核的 kernel-devel
我这个则需要修改安装脚本在 kernel-devel
中间加上 -ml
才可以正常安装
这个可以查看当前安装的内核
rpm -qa | grep kernel-ml
安装前需要安装必要依赖工具
yum install kernel-devel-`uname -r` gcc gcc-c++ make dkms
解压并安装驱动
安装好基础工具之后解压驱动程序
tar zxf Aquantia-AQtion-x.y.z.tar.gz
cd ~/aquantia
执行安装脚本
./dkms.sh install
驱动安装位置在
/lib/modules/`uname -r`/extra/atlantic.ko
在使用 modinfo
查看版本就是新的了
modinfo atlantic
filename: /lib/modules/4.20.11-1.el7.elrepo.x86_64/extra/atlantic.ko
description: aQuantia Corporation(R) Network Driver
author: aQuantia
version: 2.2.6.0
license: GPL v2
firmware: aquantia/91B1.fw
firmware: aquantia/87B1.fw
firmware: aquantia/80B1.fw
srcversion: 3BD2BA33B9C3E4A2B0556D9
alias: pci:v00001D6Ad000092B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000091B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000089B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000088B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000087B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000080B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000012B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000011B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000009B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000008B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000007B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad000000B1sv*sd*bc*sc*i*
alias: pci:v00001D6Ad0000D109sv*sd*bc*sc*i*
alias: pci:v00001D6Ad0000D108sv*sd*bc*sc*i*
alias: pci:v00001D6Ad0000D107sv*sd*bc*sc*i*
alias: pci:v00001D6Ad0000D100sv*sd*bc*sc*i*
alias: pci:v00001D6Ad00000001sv*sd*bc*sc*i*
depends: crc-itu-t,ptp
retpoline: Y
name: atlantic
vermagic: 4.20.11-1.el7.elrepo.x86_64 SMP mod_unload modversions
parm: aq_ptp_offset_forced:Force to use the driver parameters (uint)
parm: aq_ptp_offset_100:PTP offset for 100M (uint)
parm: aq_ptp_offset_1000:PTP offset for 1G (uint)
parm: aq_ptp_offset_2500:PTP offset for 2,5G (uint)
parm: aq_ptp_offset_5000:PTP offset for 5G (uint)
parm: aq_ptp_offset_10000:PTP offset for 10G (uint)
parm: aq_itr:Interrupt throttling mode (uint)
parm: aq_itr_tx:TX interrupt throttle rate (uint)
parm: aq_itr_rx:RX interrupt throttle rate (uint)
parm: aq_rxpageorder:RX page order override (uint)
parm: aq_rx_refill_thres:RX refill threshold (uint)
parm: aq_fw_did:Use FW image for this DID (array of uint)
parm: aq_fw_sid:Use provisioning data for this SID (array of uint)
parm: aq_force_host_boot:Force host boot (array of uint)
这里结束后还需要使用 ethtool
查看一下当前使用的版本. 发现正在使用的版本没有变化
ethtool -i enp2s0
driver: atlantic
version: 2.0.4.0-kern
firmware-version: 3.0.33
expansion-rom-version:
bus-info: 0000:09:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
加载新驱动模块
首先移除旧模块
rmmod atlantic
加载新模块
# 推荐使用绝对路径
insmod /lib/modules/4.20.11-1.el7.elrepo.x86_64/extra/atlantic.ko
# 或者
insmod /lib/modules/`uname -r`/extra/atlantic.ko
分析模块依赖
depmod -a
重启网络服务
service network restart
验证驱动更新
最后使用 ethtool
查看当前使用的版本. 现在版本已经变成 2.2.6.0
新的了, 成功!
ethtool -i enp2s0
driver: atlantic
version: 2.2.6.0
firmware-version: 3.0.33
expansion-rom-version:
bus-info: 0000:09:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: yes
命令解释
modprobe atlantic
这个命令用于加载指定的内核模块 (这里是 atlantic
模块)。modprobe
会自动处理模块的依赖关系, 如果该模块依赖其他模块, modprobe
会自动加载它们。它是一个高级命令, 适合大多数情况。
modprobe atlantic
可以替代 insmod atlantic
insmod
insmod
命令用于手动加载指定的内核模块。与 modprobe
不同, insmod
只会加载指定的模块, 而不会自动处理依赖关系。所以如果该模块有其他依赖模块, 你需要手动加载这些依赖模块, 否则加载会失败。
depmod -a
这个命令用于更新内核模块的依赖数据库。它扫描系统中的模块并生成或更新 /lib/modules/$(uname -r)/modules.dep
文件, 该文件记录了模块之间的依赖关系。通常在安装新模块后执行, 确保系统知道所有模块的依赖关系。
rmmod atlantic
rmmod
用于卸载指定的内核模块。它会将已加载的模块从内核中移除。如果有其他模块依赖这个模块, 卸载操作会失败, 除非依赖的模块也被卸载。
原文