关闭网桥的STP,解决RHEL10上qemu使用u-boot加载uImage自动加载失败的问题
1. 问题现象
在RHEL10上通过qemu使用u-boot的tftp自动加载uImage(第一次)会失败,失败后手动执行命令tftp 0x6003000 uImage;或者执行reset重启u-boot都可以加载成功。
2. 根本原因
(1) STP 协议导致网络延迟
-
STP 的工作机制:
当网桥br0
启用 STP 时,端口需要经历 阻塞(Blocking)→ 侦听(Listening)→ 学习(Learning)→ 转发(Forwarding) 的状态转换,耗时 30~50 秒(传统 STP)。-
在此期间,网桥端口不转发数据包,导致 U-Boot 的 DHCP/TFTP 请求超时。
-
-
U-Boot 的自动加载流程:
bootcmd
可能在网桥端口尚未进入 Forwarding 状态时就尝试网络操作(如tftp
),导致失败。
(2) QEMU 虚拟网桥的模拟行为
-
QEMU 默认使用 用户模式网络(
-net user
) 或 TAP 网桥(-net tap
),若宿主机网桥br0
启用了 STP,虚拟机的网络初始化可能受宿主机 STP 状态影响。
3. 解决方案
sudo nmcli connection modify br0 bridge.stp no
sudo nmcli connection reload
sudo nmcli connection up br0
4. 验证 STP 状态
nmcli -f bridge con show br0 | grep stp
输出应显示:
bridge.stp: no