我家里的以太网端口连接出现了一个奇怪的问题。我在家里用适当的工具和测试完成了自己的以太网布线。一切似乎都正常。ping 速度很快,传输速度很快(千兆连接),没有丢失任何数据包。在确信一切正常后,我开始使用我的以太网。我的树莓派在以太网上工作正常,但是,联想 T450s 上的 Ubuntu 14.04 LTS 会随机断开连接。以下是症状:
- 以太网连接指示器不显示连接丢失。
- 它主要发生在我浏览时以及打开新页面/单击新链接时。
- 网站需要很长时间才能加载,最终导致浏览器出现错误。
- 每当我看到网站加载时间异常长时,我就会 ping 我的电缆调制解调器,数据包会到达调制解调器并返回。然后连接恢复经过一些测试,我意识到仅当 ping 调制解调器后,连接才能恢复!有趣的是,第一个包(在连接问题之后)需要约 1007 毫秒,其余的需要约 0.5 毫秒。不知何故,第一个包花费的时间太长了。此外,我开始每隔 2-3 秒对调制解调器进行 ping 操作, 哪个已预防任何进一步的干扰。
- 通过 WiFi 或以太网连接到调制解调器和互联网的所有其他设备均可正常工作!包括树莓派、Windows 机器等。
- 同一台笔记本电脑,在以太网上工作时也能正常工作。
不知何故,我的 Ubuntu 笔记本与我的小型家庭以太网网络出现了问题。我当时的假设是 Ubuntu 关闭了我的以太网卡或进行了一些省电,这导致它无法访问。ping 可以恢复或保持唤醒状态。但我在给笔记本电脑充电时遇到了这个问题。
我该如何解决这个问题?有什么想法吗?
忘了说了……我编写了一个脚本来通过ethtool连接丢失和恢复后立即显示(用于比较)。没有明显差异(使用 diff 检查)。但这是连接丢失后(期间)的输出。
--version
_________
ethtool version 3.13
-a
_________
Pause parameters for eth0:
Autonegotiate: on
RX: on
TX: on
-c
_________
Coalesce parameters for eth0:
Adaptive RX: off TX: off
stats-block-usecs: 0
sample-interval: 0
pkt-rate-low: 0
pkt-rate-high: 0
rx-usecs: 3
rx-frames: 0
rx-usecs-irq: 0
rx-frames-irq: 0
tx-usecs: 0
tx-frames: 0
tx-usecs-irq: 0
tx-frames-irq: 0
rx-usecs-low: 0
rx-frame-low: 0
tx-usecs-low: 0
tx-frame-low: 0
rx-usecs-high: 0
rx-frame-high: 0
tx-usecs-high: 0
tx-frame-high: 0
-i
_________
driver: e1000e
version: 2.3.2-k
firmware-version: 0.2-3
bus-info: 0000:00:19.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no
-g
_________
Ring parameters for eth0:
Pre-set maximums:
RX: 4096
RX Mini: 0
RX Jumbo: 0
TX: 4096
Current hardware settings:
RX: 256
RX Mini: 0
RX Jumbo: 0
TX: 256
-S
_________
NIC statistics:
rx_packets: 4923045
tx_packets: 2764542
rx_bytes: 6044576522
tx_bytes: 515265291
rx_broadcast: 140452
tx_broadcast: 1805
rx_multicast: 34355
tx_multicast: 972
rx_errors: 0
tx_errors: 0
tx_dropped: 0
multicast: 34355
collisions: 0
rx_length_errors: 0
rx_over_errors: 0
rx_crc_errors: 0
rx_frame_errors: 0
rx_no_buffer_count: 0
rx_missed_errors: 0
tx_aborted_errors: 0
tx_carrier_errors: 0
tx_fifo_errors: 0
tx_heartbeat_errors: 0
tx_window_errors: 0
tx_abort_late_coll: 0
tx_deferred_ok: 0
tx_single_coll_ok: 0
tx_multi_coll_ok: 0
tx_timeout_count: 0
tx_restart_queue: 0
rx_long_length_errors: 0
rx_short_length_errors: 0
rx_align_errors: 0
tx_tcp_seg_good: 41837
tx_tcp_seg_failed: 0
rx_flow_control_xon: 0
rx_flow_control_xoff: 0
tx_flow_control_xon: 0
tx_flow_control_xoff: 0
rx_csum_offload_good: 4888272
rx_csum_offload_errors: 69
rx_header_split: 0
alloc_rx_buff_failed: 0
tx_smbus: 0
rx_smbus: 1274
dropped_smbus: 0
rx_dma_failed: 0
tx_dma_failed: 0
rx_hwtstamp_cleared: 0
uncorr_ecc_errors: 0
corr_ecc_errors: 0
-t (test)
_________
The test result is PASS
The test extra info:
Register test (offline) 0
Eeprom test (offline) 0
Interrupt test (offline) 0
Loopback test (offline) 0
Link test (on/offline) 0
编辑: 我尝试编译并安装最近的3.3.5版本 e1000e... 两者都运行正常,没有任何错误。但无论是否重新启动,
ethtool -i eth0
都告诉我我仍然有2.3.2-k。以下是 make install 的输出:
make -C /lib/modules/3.13.0-93-generic/build CC=gcc SUBDIRS=/home/<username>/Desktop/IT/e1000e-3.3.5/src modules
make[1]: Entering directory `/usr/src/linux-headers-3.13.0-93-generic'
Building modules, stage 2.
MODPOST 1 modules
make[1]: Leaving directory `/usr/src/linux-headers-3.13.0-93-generic'
gzip -c ../e1000e.7 > e1000e.7.gz
# remove all old versions of the driver
find /lib/modules/3.13.0-93-generic -name e1000e.ko -exec rm -f {} \; || true
find /lib/modules/3.13.0-93-generic -name e1000e.ko.gz -exec rm -f {} \; || true
install -D -m 644 e1000e.ko /lib/modules/3.13.0-93-generic/updates/drivers/net/ethernet/intel/e1000e/e1000e.ko
/sbin/depmod -a 3.13.0-93-generic || true
install -D -m 644 e1000e.7.gz /usr/share/man/man7/e1000e.7.gz
man -c -P'cat > /dev/null' e1000e || true
e1000e.
信息: 我终于创建了 dkms.conf
MAKE="make -C src/ KERNELDIR=/lib/modules/${kernelver}/build"
CLEAN="make -C src/ clean"
BUILT_MODULE_NAME=e1000e
BUILT_MODULE_LOCATION=src/
DEST_MODULE_LOCATION="/kernel/updates/dkms"
PACKAGE_NAME=e1000e
PACKAGE_VERSION=3.3.5
REMAKE_INITRD=yes
我也关注了这些指示。
遗憾的是,新的驱动程序也存在同样的问题。
答案1
正如我们上面讨论的...下载较新的 e1000e 驱动程序https://sourceforge.net/projects/e1000/files/e1000e%20stable/3.3.5/,使用以下方法编译制作和进行安装。这将安装新的内核模块,但旧内核模块仍加载在当前内核中。因此,在终端中,执行sudo rmmod e1000e(你的以太网连接现在会断开),然后执行sudo modprobe e1000e,这将加载新的内核模块并重新启动以太网连接。然后你可以执行sudo modinfo e1000e确认您正在运行新的内核模块。
那么,您是否在源代码的顶层找到了 dkms.conf 文件?如果找到了,那么使用 dkms 的艰苦工作已经完成。使用 Synaptic 安装 dkms(如果尚未安装)。简短的回答是……您将源代码复制到 /usr/src,然后执行 dkms add、build、install。您必须查看 man 以了解更多信息。dkms 状态命令将显示当前状态。