Ubuntu 16.04的Realtek RTL8111/8168/8411以太网驱动程序无法保持持久连接。

我这周遇到了一个糟糕的问题,就是解决我的以太网连接问题。以太网在连接1分钟后就会断开。网络图标一直显示为已连接,但我必须通过点击“有线连接1”来断开和重新连接,才能保持几秒钟/几分钟的连接。
为了解决这个问题,我设置了一个cron job,每分钟运行以下代码来断开和重新连接:
#!/bin/bash
sudo ifdown enp4s0
sudo ifup enp4s0

请帮忙。我需要一个更稳定的以太网连接的长久解决方案。
lspci | grep -i realtek

04:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. 
RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 01)

lsmod | grep r816

r8168                 499712  0

dmesg | grep r816
    [    2.207551] r8168: loading out-of-tree module taints kernel.
    [    2.207789] r8168: module verification failed: signature and/or required key missing - tainting kernel
    [    2.208146] r8168 Gigabit Ethernet driver 8.044.02-NAPI loaded
    [    2.208243] r8168 0000:04:00.0: Default use INTx.
    [    2.230190] r8168: This product is covered by one or more of the following patents: US6,570,884, US6,115,776, and US6,327,625.
    [    2.230194] r8168  Copyright (C) 2017  Realtek NIC software team <nicfae@realtek.com> 
    [    2.305436] r8168 0000:04:00.0 enp4s0: renamed from eth0
    [   23.483150] r8168: enp4s0: link up
    [  866.740512] r8168: enp4s0: link up
    [71714.965195] r8168: enp4s0: link up
    [71773.494292] r8168: enp4s0: link up

sudo ethtool enp4s0

Settings for enp4s0:
    Supported ports: [ TP ]
    Supported link modes:   10baseT/Half 10baseT/Full 
                            100baseT/Half 100baseT/Full 
                            1000baseT/Full 
    Supported pause frame use: No
    Supports auto-negotiation: Yes
    Advertised link modes:  10baseT/Half 10baseT/Full 
                            100baseT/Half 100baseT/Full 
                            1000baseT/Full 
    Advertised pause frame use: No
    Advertised auto-negotiation: Yes
    Speed: Unknown!
    Duplex: Half
    Port: Twisted Pair
    PHYAD: 0
    Transceiver: internal
    Auto-negotiation: on
    MDI-X: Unknown
    Supports Wake-on: pumbg
    Wake-on: ug
    Current message level: 0x00000033 (51)
                   drv probe ifdown ifup
    Link detected: no



ifconfig
enp4s0    Link encap:Ethernet  HWaddr 00:26:18:11:78:a8  
          inet addr:192.168.26.30  Bcast:192.168.27.255  Mask:255.255.254.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:394947 errors:0 dropped:0 overruns:0 frame:0
          TX packets:278710 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:270000748 (270.0 MB)  TX bytes:37833932 (37.8 MB)
          Interrupt:18 Base address:0xa000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:38302 errors:0 dropped:0 overruns:0 frame:0
          TX packets:38302 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:3045435 (3.0 MB)  TX bytes:3045435 (3.0 MB)

lshw

*-network
                description: Ethernet interface
                product: RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
                vendor: Realtek Semiconductor Co., Ltd.
                physical id: 0
                bus info: pci@0000:04:00.0
                logical name: enp4s0
                version: 01
                serial: 00:26:18:11:78:a8
                size: 1Gbit/s
                capacity: 1Gbit/s
                width: 64 bits
                clock: 33MHz
                capabilities: bus_master cap_list rom ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
                configuration: autonegotiation=on broadcast=yes driver=r8168 driverversion=8.044.02-NAPI duplex=full latency=0 link=yes multicast=yes port=twisted pair speed=1Gbit/s
                resources: irq:18 ioport:d800(size=256) memory:f9fff000-f9ffffff memory:f9fc0000-f9fdffff

cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo 
iface lo inet loopback



# The primary network interface
auto enp4s0
allow-hotplug enp4s0
iface enp4s0 inet dhcp

pre-up ifconfig enp4s0 hw ether 00:26:18:11:78:A8

cat /etc/NetworkManager/NetworkManager.conf
[main]
plugins=ifupdown,keyfile,ofono
dns=dnsmasq

[ifupdown]
managed=true

uname -r
4.8.0-58-generic

我做的事情:
1) 使用Synaptic安装r8168-dkms。 2) 将IPv6设置中的“方法”部分设置为“忽略”。 3) 将我的互联网DNS服务器更改为8.8.8.8、8.8.4.4等等。 4) 将“MTU”更改为9000。 5) 更改接口文件为: auto lo iface lo inet loopback auto enp4s0 iface enp4s0 inet dhcp 同样也可以用于静态IP地址。 6) 从Ubuntu 14.04有线连接频繁断开中执行sudo apt-get purge r8168-dkms。 7) 阅读https://unixblogger.com/2011/10/18/the-pain-of-an-realtek-rtl8111rtl8168-ethernet-card/上的所有内容。 8) 安装较旧版本的r8168,然后执行以下操作:
sudo update-initramfs -u 
echo "blacklist r8169" | sudo tee -a /etc/modprobe.d/blacklist.conf

9) 阅读https://ubuntuforums dot org/archive/index.php/t-2291730.html 的页面。
10) https: //ubuntuforums dot org/showthread.php?t=2248047 上的所有内容。
11) 冷启动。
12)
sudo sh -c "echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf"
sudo sh -c "echo 'net.ipv6.conf.default.disable_ipv6 = 1' >> /etc/sysctl.conf"
sudo sh -c "echo 'net.ipv6.conf.lo.disable_ipv6 = 1' >> /etc/sysctl.conf"
sudo sysctl -p
sudo sed -i 's/false/true/g' /etc/NetworkManager/NetworkManager.conf
sudo reboot -i NOW

13) https://nosemaj dot org/hardy-r8168 14) 用其他设备测试以太网电缆。 15) 哭了。 16) 问了我妈妈。
更新 #1
dkms status
bbswitch, 0.8, 4.8.0-36-generic, x86_64: installed
bbswitch, 0.8, 4.8.0-58-generic, x86_64: installed
nvidia-375, 375.66, 4.8.0-36-generic, x86_64: installed
nvidia-375, 375.66, 4.8.0-58-generic, x86_64: installed
r8168, 8.041.00: added

modinfo r8168 | grep -i version
version:        8.044.02-NAPI
srcversion:     5388F61A23A68A548D001CF
vermagic:       4.8.0-58-generic SMP mod_unload modversions 

sudo apt-get purge r8168-dkms
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  r8168-dkms*
0 upgraded, 0 newly installed, 1 to remove and 13 not upgraded.
After this operation, 1,109 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 243432 files and directories currently installed.)
Removing r8168-dkms (8.041.00-1) ...

------------------------------
Deleting module version: 8.041.00
completely from the DKMS tree.
------------------------------
Done.
Purging configuration files for r8168-dkms (8.041.00-1) ...

删除命令:
sudo apt-get remove r8168-dkms
sudo apt-get purge r8168-dkms
sudo /sbin/modprobe -r r8168

这些命令都没有移除8.044。

更新 #2

dkms status
bbswitch, 0.8, 4.8.0-36-generic, x86_64: installed
bbswitch, 0.8, 4.8.0-58-generic, x86_64: installed
nvidia-375, 375.66, 4.8.0-36-generic, x86_64: installed
nvidia-375, 375.66, 4.8.0-58-generic, x86_64: installed
r8168, 8.041.00: added

sudo dkms build r8168/8.041.00 -k "$(uname -r)/$(uname -p)"

Kernel preparation unnecessary for this kernel.  Skipping...

Building module:
cleaning build area....
make KERNELRELEASE=4.8.0-58-generic -C /lib/modules/4.8.0-58-generic/build M=/var/lib/dkms/r8168/8.041.00/build....(bad exit status: 2)
ERROR: Cannot create report: [Errno 17] File exists: '/var/crash/r8168-dkms.0.crash'
Error! Bad return status for module build on kernel: 4.8.0-58-generic (x86_64)
Consult /var/lib/dkms/r8168/8.041.00/build/make.log for more information.

cat /var/lib/dkms/r8168/8.041.00/build/make.log

DKMS make.log for r8168-8.041.00 for kernel 4.8.0-58-generic (x86_64)
Tue Jul 11 16:03:35 AST 2017
make: Entering directory '/usr/src/linux-headers-4.8.0-58-generic'
  LD      /var/lib/dkms/r8168/8.041.00/build/built-in.o
  CC [M]  /var/lib/dkms/r8168/8.041.00/build/r8168_n.o
/var/lib/dkms/r8168/8.041.00/build/r8168_n.c: In function ‘rtl8168_fix_features’:
/var/lib/dkms/r8168/8.041.00/build/r8168_n.c:4212:30: error: ‘NETIF_F_ALL_CSUM’ undeclared (first use in this function)
                 features &= ~NETIF_F_ALL_CSUM;
                              ^
/var/lib/dkms/r8168/8.041.00/build/r8168_n.c:4212:30: note: each undeclared identifier is reported only once for each function it appears in
/var/lib/dkms/r8168/8.041.00/build/r8168_n.c: In function ‘rtl8168_start_xmit’:
/var/lib/dkms/r8168/8.041.00/build/r8168_n.c:24599:12: error: ‘struct net_device’ has no member named ‘trans_start’
         dev->trans_start = jiffies;
            ^
scripts/Makefile.build:289: recipe for target '/var/lib/dkms/r8168/8.041.00/build/r8168_n.o' failed
make[1]: *** [/var/lib/dkms/r8168/8.041.00/build/r8168_n.o] Error 1
Makefile:1491: recipe for target '_module_/var/lib/dkms/r8168/8.041.00/build' failed
make: *** [_module_/var/lib/dkms/r8168/8.041.00/build] Error 2
make: Leaving directory '/usr/src/linux-headers-4.8.0-58-generic'

更新 #3

在尝试并失败了 r8168 V 8.042 后... 我尝试了版本 8.043.02 并取得了某种程度的成功,尽管我们还没有达到最终解决方案。

sudo dkms build r8168/8.043.02 -k "$(uname -r)/$(uname -p)"
Module r8168/8.043.02 already built for kernel 4.8.0-58-generic/4

sudo dkms install r8168/8.043.02 -k "$(uname -r)/$(uname -p)"
Module r8168/8.043.02 already installed on kernel 4.8.0-58-generic/x86_64

dkms status
bbswitch, 0.8, 4.8.0-58-generic, x86_64: installed
nvidia-375, 375.66, 4.8.0-58-generic, x86_64: installed
r8168, 8.043.02, 4.8.0-58-generic, x86_64: installed (WARNING! Diff between built and installed module!)

更新 #4

ls -al /var/lib/dkms/r8168
total 12
drwxr-xr-x 3 root root 4096 Jul 11 16:43 .
drwxr-xr-x 5 root root 4096 Jul 11 16:42 ..
drwxr-xr-x 4 root root 4096 Jul 11 16:43 8.043.02
lrwxrwxrwx 1 root root   32 Jul 11 16:43 kernel-4.8.0-58-generic-x86_64 -> 8.043.02/4.8.0-58-generic/x86_64

modinfo r8168 | grep -i version
version:        8.044.02-NAPI
srcversion:     5388F61A23A68A548D001CF
vermagic:       4.8.0-58-generic SMP mod_unload modversions 


ls -al /lib/modules/4.8.0-58-generic/updates/dkms
total 18624
drwxr-xr-x 2 root root     4096 Jul  1 11:01 .
drwxr-xr-x 3 root root     4096 Jul  1 11:00 ..
-rw-r--r-- 1 root root    22720 Jul  1 11:00 bbswitch.ko
-rw-r--r-- 1 root root    85488 Jul  1 11:01 nvidia_375_drm.ko
-rw-r--r-- 1 root root 16735368 Jul  1 11:01 nvidia_375.ko
-rw-r--r-- 1 root root  1086360 Jul  1 11:01 nvidia_375_modeset.ko
-rw-r--r-- 1 root root  1124728 Jul  1 11:01 nvidia_375_uvm.ko

modinfo /lib/modules/4.8.0-58-generic/updates/dkms/r8168.ko
modinfo: ERROR: Module /lib/modules/4.8.0-58-generic/updates/dkms/r8168.ko not found.

更新 5

看起来这个命令移除了8.044驱动程序,现在只剩下8.043.02驱动程序。

sudo apt-get -y dist-upgrade

1你真的需要安装r8168-dkms。重新安装它,并删除你所做的所有更改...比如MTU=9000等等。请描述一下你的网络配置。计算机的网络电缆连接到哪里?交换机/路由器/调制解调器? - heynnema
1个回答

从评论中可以看出...
1. 你确实需要在你的配置中运行r8168-dkms。 2. 撤销你所做的所有更改...它们没有修复问题,只是创建了新的问题。 3. 经过仔细检查,我发现你正在使用适用于Ubuntu 17.10(在16.04系统上)的r8168-dkms(8.044.02-NAPI)。请安装正确的版本并重新测试。 4. 在你的网络GUI中,你设置了多个"Wired Connection"配置文件。它们可能被命名为Wired Connection,Wired Connection 1,Wired Connection 2等等。删除除了Wired Connection之外的所有配置。
更新 #1:
假设当前状态是`dkms status`显示`r8168, 8.041.00 : added`...
sudo dkms build r8168/8.041.00 -k "$(uname -r)/$(uname -p)"
sudo dkms install r8168/8.041.00 -k "$(uname -r)/$(uname -p)"

注意:您可能需要通过查看/usr/src或/var/lib/dkms/r8168来确认r8168/8.041.00(模块/版本)的正确值。
dkms status

应该显示已安装的r8168,版本为8.041.0。
reboot
modinfo r8168 | grep -i version

应该显示为8.041.00

更新 #2:

  • r8168 v8.041.00对于16.04.2(内核4.8.0-58)来说太旧了
  • 我们现在使用的是r8168 v8.043.02

更新 #3:

我们将完全删除r8168-dkms并取消r8169的黑名单,然后从Ubuntu存储库重新安装r8168-dkms。

  • sudo dkms remove r8168/8.043.02 -k "$(uname -r)/$(uname -p)"
  • sudo apt-get purge r8168-dkms
  • cd /var/lib/dkms
  • ls -al
    • 不应该显示r8168
  • cd /usr/src
  • ls -al
    • 不应该显示r8168.043.02
  • find /lib -name r8168.ko
    • 不应该显示r8168.ko
  • cd /etc/modprobe.d
  • ls -al r8168*
    • 不应该显示任何文件
  • grep -i r816 *
    • 将grep的输出编辑成问题,更新为#n
  • cd
  • sudo modprobe -r r8168
  • sudo update-initramfs -u -k "$(uname -r)"
  • 到这里就可以停了,在@heynnema处联系我

抱歉回复晚了。感谢您仔细阅读我的问题。我撤销了所有更改。我有一个8.041.01的deb文件。然而,我无法切换驱动程序。我清除/删除了所有r8168驱动程序,重新安装了deb文件,但每次检查时,它仍然是8.044.02版本。我不知道如何告诉它使用旧版本。 - Gpu Center
@GpuCenter 如果你清除了较新的版本,它应该已经消失了。你使用了什么命令?编辑你的问题,包括 dkms statusmodinfo r8168 | grep -i version。给我发新的评论时,请以 @heynnema 开头,否则我可能会错过它们。 - heynnema
@heynnema 我的系统上没有以太网连接,所以我不得不转移到笔记本电脑上。要移除的命令是:sudo apt-get remove r8168-dkms、sudo apt-get purge r8168-dkms、sudo /sbin/modprobe -r r8168。所有的移除命令都会移除版本8.041。当我输入modinfo r8168时,同样存在版本8.044。在dkms状态下,r8168,8.041.00:已添加。然而,在移除/清除之后,这个版本已经不存在了。版本8.044.02 -NAPI仍然存在。 - Sterls
@GpuCenter 请更新 #1 - heynnema
@heynnema 已更新。 - Gpu Center
@GpuCenter,你没有按照我的指示操作。指示是在上次已知的dkms status显示为added的情况下编写的。现在dkms status不应该再显示r8168了。重新安装8.041的.deb文件,然后重新执行dkms status...如果它再次显示r8168 8.041已添加,请再次执行我的更新#1。 - heynnema
@heynnema 抱歉,我在执行你的指示之前发布了我的更新#1。我在第一行收到了一个错误,如我在更新#2中所示。感谢你花时间帮助我,我非常感激! - Gpu Center
1@GpuCenter 啊...你一定是在运行16.04.2版本。它比16.04版本有一个更新的内核,所以你需要一个更新的r8168驱动。再次卸载r8168-dkms。你是从Ubuntu仓库安装r8168-dkms还是从下载的.deb文件安装的?下载.042版本并重试。如果dkms status显示未安装,我们可能需要使用.043版本。 - heynnema
@heynnema 你说得对。我尝试了版本8.043.02,取得了一些成功。不过在重启后,更新#3中显示了dkms的状态。我查了一些资料,有人说要将整个dkms移除然后重新安装。你觉得呢? - Gpu Center
@GpuCenter我们快要完成了。执行sudo modprobe -r r8168然后执行sudo modprobe r8168,接着重启电脑,最后执行dkms status - heynnema
@heynnema 很遗憾,没有任何变化。我进行了更深入的搜索,但是找不到任何信息。这真的很令人沮丧。即使在执行 sudo modprobe -r r8168 后,当我检查 modinfo 时也没有任何变化。我按照你的建议做了两次,并重新启动了两次,但仍然没有任何变化。 - Gpu Center
@GpuCenter 现在我们正试图解决一个小问题。只需要正确的一系列命令就能解决它。但由于您尝试做这个的次数很多,可能会有一些残留物。请给我展示 ls -al /var/lib/dkms/r8168modinfo r8168 | grep -i version - heynnema
@GpuCenter ps: 也给我显示 ls -al /lib/modules/4.8.0-58-generic/updates/dkms - heynnema
@GpuCenter ps2: 以及 modinfo /lib/modules/4.8.0-58-generic/updates/dkms/r8168.ko - heynnema
@heynnema,请查看第4个更新以获取您所请求的信息。 - Gpu Center
你从哪里获取到版本为.043的r8168-dkms?你的Synaptic指示了什么版本?r8168构建的模块没有进入正确的目录。而且,在你的更新#3中表明该模块已经被构建了...这本不应该发生。如果你愿意坚持下去,我可能会让你移除r8168-dkms,我们会确保所有部分都真的被删除,并重新开始。告诉我你的想法。 - heynnema
@heynnema 我从https://packages.ubuntu.com/zesty/r8168-dkms下载了它,但我发现还有一个网址https://r8168dl.appspot.com,下次我会尝试这个。我打算坚持使用它。你能给我建议一个完全删除它的方法吗?即使我卸载/移除了r8168和网络管理器,版本8.044仍然存在。之前我尝试过,命令只能删除8.041,而不能删除8.044。我需要进入根目录文件并具体删除它吗?Synaptic当前显示已安装和最新版本为8.043.02。 - Gpu Center
不要使用appspot.com上的那个,请使用Ubuntu软件源中的那个。首先,我们需要彻底删除当前安装的r8168-dkms,编辑/etc/modprobe.d目录下的一些文件,并确保r8169内核模块能够再次加载。请给我几分钟时间来更新我的回答。 - heynnema
@heynnema 我使用更新5中的那行解决了问题。我当时试图做一些不相关的事情,但我注意到该命令将8.044驱动程序从系统中清除了。我不确定该命令的目的是什么,但它解决了我的问题。感谢你花费的帮助时间。如果我仍在尝试使用8.041,则该命令将无法起作用。 - Gpu Center
如果你还没做过原问题提问者所做的那些让情况变得更糟的事情,是否有一个简化版的回答告诉你该怎么办? - James_pic
@James_pic 如果这个回答对你的具体情况没有帮助,请直接提出一个新问题,我们会尽力提供帮助。 - heynnema
@heynnema 在这里提到了某人。如果您认为我的直觉是正确的,请阅读并留下评论...(然后当然要添加一份简历!)**;-)** - Fabby