Systemd-networkd无法配置以太网接口速率与双工模式求助
解决systemd-networkd/udev无法强制以太网接口10M半双工的问题
你遇到的核心问题是自动协商(AutoNegotiation)默认处于开启状态,导致你通过.link文件或udev规则设置的速率/双工被设备与链路伙伴的协商结果覆盖,再加上xilinx_axienet驱动在链路up时会重新触发协商,进一步覆盖了你的配置。下面是具体的解决方案:
一、修改systemd .link文件(推荐方案)
systemd-networkd的.link文件支持直接禁用自动协商,这是强制固定速率和双工的必要前提。修改你的/lib/systemd/network/20-eth0.link,添加AutoNegotiation=no配置:
[Match] Name=eth0 [Link] MTUBytes=1450 BitsPerSecond=10M Duplex=half AutoNegotiation=no
注意事项:
- 如果
/etc/systemd/network目录下存在同名或更高优先级的.link文件(比如数字编号更小的文件名),会覆盖/lib下的配置,请检查并确保没有冲突。 - 应用配置的步骤:
# 重新加载systemd-networkd systemctl reload systemd-networkd # 重启网卡接口 ip link set eth0 down && ip link set eth0 up # 验证配置结果 ethtool eth0
二、修复udev规则(备选方案)
udev规则中,必须先禁用自动协商,再设置speed和duplex参数,否则驱动会忽略你的手动设置。修改/lib/udev/rules.d/10-persistent-network.rules为:
ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth0", ATTR{autoneg}="0", ATTR{speed}="10", ATTR{duplex}="half", ATTR{mtu}="1450"
然后触发udev规则生效:
udevadm trigger /sys/class/net/eth0 ip link set eth0 down && ip link set eth0 up
三、为什么之前的配置不生效?
你看到的dmesg日志xilinx_axienet xilinx_axienet eth0: Link is Up - 100Mbps/Full正是自动协商的结果:
- 你的
.link/udev规则仅设置了速率和双工,但没有关闭自动协商; - 网卡与链路伙伴(比如交换机)协商后,选择了双方都支持的最高速率(100M全双工);
- 驱动在链路up时完成协商流程,直接覆盖了你之前的配置。
而手动执行ethtool -s eth0 speed 10 duplex half之所以生效,是因为这条命令自动帮你关闭了自动协商(你可以执行后用ethtool eth0查看,Auto-negotiation会变成off)。
内容的提问来源于stack exchange,提问作者Odysseus




