Ubuntu 16.10 配置无线网卡驱动的问题,同样适用14.04和16.04。针对的设备是Realtek RTL8111/8168 PCI Express Gigabit Ethernet Controller,表现为网络不稳定,经常掉线,且网速较慢,分析后认为是驱动不匹配。

Ubuntu自带的驱动为r8169,高于此类网卡,导致兼容性差,影响了网络连接效果。 解决方法如下,参考链接见文末。

1. Check driver and device info

查看系统为网卡型号和对应的驱动,利用如下指令

1
$ lspci -vv >> device.txt

打开device.txt,找到网卡设备,样例如下。其中驱动部分显示为r8169,与现有网卡不吻合

1
2
3
4
5
6
7
8
9
10
11
12
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 0b)
Subsystem: Acer Incorporated [ALI] RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B-DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0, Cache Line Size: 64 bytes
Interrupt: pin A routed to IRQ 27
Region 0: I/O ports at d000 [size=256]
Region 2: Memory at f7104000 (64-bit, prefetchable) [size=4K]
Region 4: Memory at f7100000 (64-bit, prefetchable) [size=16K]
Capabilities: <access denied>
Kernel driver in use: r8169
Kernel modules: r8169

2. Download driver of r8168

Realtek官网下载rtl8168驱动, 需要根据Linux的内核版本进行选择,例如我的内核是4.9.1,则选择4.7以上的驱动。

更新[2019-07-28]:Realtek的官方链接貌似打不开了,而且在我的系统更新到18.04以及内核更新以后出现了奇怪的编译错误(如下),Google以后发现是因为内核4.15以后,setup_timer函数被更新为timer_setup,因此出现了编译错误的问题。参考建议,安装更新后的r8168.045.08-2驱动能够解决问题,该驱动的下载链接为这里

1
2
3
4
error: implicit declaration of function ‘setup_timer’; did you mean ‘sk_stop_timer’? [-Werror=implicit-function-declaration]
setup_timer(timer, rtl8168_esd_timer, (unsigned long)dev);
^~~~~~~~~~~
sk_stop_timer

3. Install driver

安装驱动,用如下指令,安装完成后要重启系统。

1
2
3
4
$ tar -xvf 0010-r8168-8.045.08.tar.bz2
$ cd r8168-8.045.08
$ sudo ./autorun.sh
$ sudo reboot

重启以后,理论上网络连接恢复正常。重新查看系统设备信息,有如下结果,驱动已经更新为r8168

1
2
3
4
5
6
7
8
9
10
11
12
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 0b)
Subsystem: Acer Incorporated [ALI] RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B-DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0, Cache Line Size: 64 bytes
Interrupt: pin A routed to IRQ 27
Region 0: I/O ports at d000 [size=256]
Region 2: Memory at f7104000 (64-bit, prefetchable) [size=4K]
Region 4: Memory at f7100000 (64-bit, prefetchable) [size=16K]
Capabilities: <access denied>
Kernel driver in use: r8168
Kernel modules: r8168

Reference

[1] Ubuntu 16.04 RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller” 不能上网