我在 Ubuntu Intel NUC 上检测到一个问题,以太网链路断开然后又出现。这是一种常规模式,其中 NIC 关闭 4 秒,启动 12 秒,然后在一个周期内再次关闭 4 秒。
这可能与物理损坏有关,但我无法更换网卡,因为它是集成的。显然,我想在更换任何昂贵的组件之前确认这一点。
如果我删除内核模块并重新插入它, kern.log 中会出现以下输出,除了最后几行之外,这对我来说是正常的。
kernel: [ 1299.003606] e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k
kernel: [ 1299.003608] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
kernel: [ 1299.004140] e1000e 0000:00:1f.6: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode
kernel: [ 1299.216578] e1000e 0000:00:1f.6 0000:00:1f.6 (uninitialized): registered PHC clock
kernel: [ 1299.288105] e1000e 0000:00:1f.6 eth0: (PCI Express:2.5GT/s:Width x1) 94:c6:91:a7:78:3f
kernel: [ 1299.288112] e1000e 0000:00:1f.6 eth0: Intel(R) PRO/1000 Network Connection
kernel: [ 1299.288256] e1000e 0000:00:1f.6 eth0: MAC: 13, PHY: 12, PBA No: FFFFFF-0FF
kernel: [ 1299.293482] e1000e 0000:00:1f.6 eno1: renamed from eth0
kernel: [ 1304.424541] e1000e 0000:00:1f.6 eno1: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx
kernel: [ 1304.424696] IPv6: ADDRCONF(NETDEV_CHANGE): eno1: link becomes ready
kernel: [ 1325.609674] e1000e 0000:00:1f.6 eno1: NIC Link is Down
kernel: [ 1330.702483] e1000e 0000:00:1f.6 eno1: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx
我尝试过的事情:
- 更换电缆
- 更改了所连接集线器上的端口(同一集线器上的另一台机器没有问题)
- 更新BIOS
- 回到旧内核
- 尝试使用调试参数加载模块
如果我查看模块信息,$ modinfo e1000e
我可以在输出中看到调试参数
parm: debug:Debug level (0=none,...,16=all) (int)
但运行 modprobe 或 insmod 例如。$ sudo modprobe e1000e debug=16
不会在 kern.log 中产生额外的信息,这正是我所期望的。
不确定下一步该去哪里。如果有人能告诉我为什么我没有从模块中获取调试信息,那将是一个很好的开始,并且非常感谢收到任何其他信息。
答案1
安装了新内核,但好消息是我似乎不必这样做。关于如何获取调试信息存在一些相互冲突的信息,但秘密在于正确配置动态调试。
首先将 e1000e 的每条调试消息转储到内核 debugFS 中
echo "module e1000e +flmpt" > /sys/kernel/debug/dynamic_debug/control
发现你必须在模块加载后执行此操作。你可以cat /sys/kernel/debug/dynamic_debug/control 看看它是如何根据这个命令修改的。看https://www.kernel.org/doc/html/v4.11/admin-guide/dynamic-debug-howto.html了解更多信息
您也可以通过这种方式启动内核日志记录,
echo 8 > /proc/sys/kernel/printk
但对我来说,在我修改上面的动态调试控制设置之前,这似乎不起作用。我怀疑此方法还会在模块加载时提供信息,但尚未查看。
这产生了两组调试信息。 kern.log 现在有大量的调试信息,加上cat /proc/kmsg
.两者似乎显示相同的信息。
答案2
如果你真的想调试内核代码,
了解如何在您的发行版上编译内核,或者至少如何在您的发行版上编译特定模块。
阅读该模块的源代码(其中还应该告诉您调试功能如何工作)。
如有必要(执行(2)后您就会知道),请在编译时更改内核配置以启用调试。
$ sudo modprobe e1000e debug=16
不会在 kern.log 中产生额外的信息,这正是我所期望的。
潜在的陷阱:您在尝试之前确实删除了旧模块吗?它被删除了,即没有自动加载回来?
NIC 循环关闭 4 秒,恢复 12 秒,然后再次关闭 4 秒。
猜测:固件(或硬件)有问题,并且您无法调试其中任何一个,因为固件是闭源的,并且您没有硬件规格。
答案3
您可能想尝试两件事:
通过添加
pcie_aspm=off
为内核参数来禁用 PCIE使用 with 禁用 TSO、GSO 和 GRO
ethtool -K eth0 gso off gro off tso off
(详细信息请参见这个错误报告)。
两者都来自旧线程,但可能仍然有效。