我正在使用嵌入式 Debian 系统,但无法让以太网持续工作。每 5 或 10 次 eth0 启动就会出现故障,我无法通过 ssh 连接到它,并且它不响应 ping。解决方案是重新启动或通过串行控制台登录并关闭 eth0,然后再次启动。我可以通过重复重新启动或ifconfig eth0 down && ifconfig eth0 up
重复发出直到设备停止响应来复制问题。
我的 /etc/network/interfaces 是:
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.1.122
gateway 192.168.1.1
netmask 255.255.255.0
当网络工作时dmesg
说:
[ 2612.775183] PHY found at addr 7
[ 2612.776944] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[ 2614.414704] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
当它没有dmesg
说:
[ 2617.224970] PHY found at addr 7
[ 2617.227005] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
当网络工作时ifconfig
输出:
eth0 Link encap:Ethernet HWaddr 00:d0:69:46:d9:08
inet addr:192.168.1.122 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::2d0:69ff:fe46:d908/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1528 Metric:1
RX packets:3242 errors:0 dropped:0 overruns:0 frame:0
TX packets:1382 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:300701 (293.6 KiB) TX bytes:132344 (129.2 KiB)
Interrupt:22
当它不ifconfig
输出时是:
eth0 Link encap:Ethernet HWaddr 00:d0:69:46:d9:08
inet addr:192.168.1.122 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1536 Metric:1
RX packets:3355 errors:0 dropped:0 overruns:0 frame:0
TX packets:1430 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:310120 (302.8 KiB) TX bytes:136800 (133.5 KiB)
Interrupt:22
当网络工作时ip link show eth0
输出:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1528 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether 00:d0:69:46:d9:08 brd ff:ff:ff:ff:ff:ff
当事情不起作用时ip link show eth0
给出:
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1536 qdisc pfifo_fast state DOWN mode DEFAULT qlen 1000
link/ether 00:d0:69:46:d9:08 brd ff:ff:ff:ff:ff:ff
我当前的解决方案是让一个脚本解析 eth0 的输出ip link show eth0
并重新启动 eth0 直到它出现,但这看起来很hacky。
知道问题可能是什么或者我应该去哪里寻找吗?
ethtool eth0
编辑:事情正常时的输出:
Settings for eth0:
Supported ports: [ TP MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Advertised pause frame use: Symmetric
Advertised auto-negotiation: Yes
Link partner advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Link partner advertised pause frame use: Symmetric
Link partner advertised auto-negotiation: Yes
Speed: 100Mb/s
Duplex: Full
Port: MII
PHYAD: 7
Transceiver: internal
Auto-negotiation: on
Link detected: yes
ethtool eth0
不存在时的输出:
Settings for eth0:
Supported ports: [ TP MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Advertised pause frame use: Symmetric
Advertised auto-negotiation: Yes
Speed: 10Mb/s
Duplex: Half
Port: MII
PHYAD: 7
Transceiver: internal
Auto-negotiation: on
Link detected: no
我还对我一直在使用的系统进行了成像,并在第二台相同的机器上进行了测试,但使用了不同的电缆和不同的路由器,并看到了相同的行为。
编辑 2:根据 ttsiodras 的观察,我做了一些 MTU 测试。我发现当设备启动时,MTU 最初为 1508。每次我关闭 eth0 然后重新启动,MTU 都会增加 4,达到最大值 1540,此后它保持不变。不幸的是,MTU 和我何时失去网络连接之间似乎没有任何关联。我还尝试手动将 MTU 设置为 1508 到 1540 之间的各种值,但无论手动 MTU 设置如何,网络仍然偶尔会出现故障。
答案1
这可能与 Debian 稍微修补 systemd 以实现向后兼容性有关。然而,这是一种解决方法,但也存在一些问题。完整的故事可以在以下位置找到有关该主题的 Debian wiki 页面。我们的目标是通过将特定于 systemd 的代码添加到包含rcS
init 脚本的包中来修复 Stretch(下一个 Debian 版本)的问题。那里的大部分工作已经完成,但仍有少量工作尚未完成。
可能能够解决此问题的事情:
- 添加一个脚本来
rc.local
检查最重要的rcS
脚本(针对您的情况)是否成功运行,如果没有成功则修复问题(运行systemctl status foo.service
可能会有所帮助) - 为网络脚本编写一个systemd单元,或者从stretch中获取它(需要一些测试)
systemd
在您的系统上替换为sysvinit
(尽管这可能有点过分)- 检查系统日志以找出依赖循环中涉及哪些服务(网络除外),并从系统中删除其中一个或多个服务
- 安装网络管理器并使用它而不是
ifupdown
.