核心工具是ethtool,它直接读取网卡phy芯片与对端实际协商结果;日常应保持autoneg on,仅在协商失败或对接老旧设备时慎用sudo ethtool -s强制设置speed/duplex/autoneg off,并须两端同步配置。

Linux 修改网卡双工模式与协商速率,核心工具是 ethtool。它直接与网卡驱动和 PHY 芯片交互,读取的是真实链路协商结果,不是配置值,也不是理论能力。日常应保持自动协商开启(autoneg on),仅在协商失败、对接老旧设备或调试时才手动强制设置。
确认网卡名和当前协商状态
先找到物理网卡名称,再查看实际工作参数:
- 查网卡名:运行
ip -br link | grep LOWER_UP,常见如ens1f0、enp3s0f0、eth0 - 查当前状态:执行
sudo ethtool ens1f0(替换为你的网卡名) - 重点关注三行输出:
-
Speed:当前协商速率(如
1000Mb/s),这才是“现在跑多快” -
Duplex:应为
Full;若显示Half,易引发丢包和性能下降 -
Link detected:必须为
yes,否则物理链路未通
-
Speed:当前协商速率(如
- 注意:
Supported link modes是网卡支持的能力列表,不代表当前速率
临时修改双工模式与速率(慎用)
仅当自动协商失败、对端不支持协商或需对接老设备时使用。必须确保交换机/对端设备也设为相同模式,否则链路中断或大量错误帧。
- 关闭自动协商并设为千兆全双工:
sudo ethtool -s ens1f0 autoneg off speed 1000 duplex full - 设为百兆全双工:
sudo ethtool -s ens1f0 autoneg off speed 100 duplex full - 设为百兆半双工(极少用):
sudo ethtool -s ens1f0 autoneg off speed 100 duplex half - 验证是否生效:
ethtool ens1f0 | grep -E "(Speed|Duplex|Auto-negotiation|Link detected)" - 若
Link detected: no,说明对端不匹配,需同步调整交换机端口配置
持久化设置(重启后仍生效)
临时命令在重启、网卡重载或网络服务重启后会失效。推荐用 systemd 服务方式固化:
- 创建服务文件:
sudo nano /etc/systemd/system/ethtool-fix.service - 写入内容(以 ens1f0 为例):
[Unit] Description=Fix ethtool settings for ens1f0 Wants=network-pre.target Before=network-pre.target [Service] Type=oneshot ExecStart=/sbin/ethtool -s ens1f0 autoneg off speed 1000 duplex full RemainAfterExit=yes [Install] WantedBy=multi-user.target
- 启用服务:
sudo systemctl daemon-reload && sudo systemctl enable --now ethtool-fix.service - Debian/Ubuntu 用户也可在
/etc/network/interfaces中添加post-up ethtool -s ens1f0 ...行,但 systemd 方式更通用稳定
排查协商异常与稳定性验证
如果 Speed 明显低于预期(如万兆卡只跑 1G),或出现间歇性降速,可进一步诊断:
- 动态刷新观察速率变化:
watch -n 1 'ethtool ens1f0 | grep Speed' - 读 sysfs 接口(仅链路 UP 时有效):
cat /sys/class/net/ens1f0/speed(单位 Mbps,如输出1000) - 查错误计数:
ethtool -S ens1f0 | grep -i "error\|drop\|fail",重点关注rx_errors和negotiation_failures - 查内核日志:
dmesg | grep -i "ens1f0\|link\|phy",留意autoneg failed或link down提示 - 重启协商过程(仅当
Auto-negotiation: on时有效):sudo ethtool -r ens1f0











