本文描述了在Ubuntu22.04的环境下利用QEMU模拟开发板,通过RT-thread以及该系统自带的软件包实现网络通信的过程。
shellscons --menuconfig
图1 开启网卡驱动
图2 开启LWIP组件
事实上我发现开启网卡驱动后会自动开启LWIP组件
shellscons
图3 编译结果
在执行脚本前先安装相关工具
shellsudo apt-get install bridge-utils sudo apt-get install uml-utilities
br0和tap0的ip要和无线网卡处在同一网段下,并且br0的ip作为tap0的网关
shell#!/bin/bash
# 1. 初始化sd.bin文件(保留原逻辑)
if [ ! -f "sd.bin" ]; then
dd if=/dev/zero of=sd.bin bs=1024 count=65536
fi
# 2. 检测是否可上网(保留原逻辑,优化返回值注释)
function network() {
local ret_code=`curl -I -s --connect-timeout 1 www.baidu.com -w %{http_code} | tail -n1`
if [ "x$ret_code" = "x200" ]; then
return 1 # 网络畅通
else
return 0 # 网络不通
fi
}
# 3. 核心网络配置(统一逻辑,放弃绑定无线网卡到网桥,改用静态IP+NAT)
network
if [ $? -eq 0 ]; then
echo "网络不通畅,使用静态IP+NAT配置网桥"
else
echo "网络畅通,使用静态IP+NAT配置网桥"
fi
# 4. 清理原有可能存在的网桥/接口(避免冲突)
sudo ifconfig br0 down 2>/dev/null
sudo brctl delbr br0 2>/dev/null
sudo ifconfig tap0 down 2>/dev/null
sudo tunctl -d tap0 2>/dev/null
# 5. 创建并配置br0网桥(关键:不绑定无线网卡,仅作为内网桥接)
sudo brctl addbr br0 # 创建br0网桥
sudo brctl stp br0 off # 关闭生成树协议
sudo brctl setfd br0 1 # 设置转发延迟
sudo brctl sethello br0 1 # 设置hello时间
sudo ifconfig br0 192.168.10.100 netmask 255.255.255.0 promisc up # 给br0配置静态内网IP
# 6. 启用内核IP转发(NAT必需)
sudo sysctl -w net.ipv4.ip_forward=1 >/dev/null 2>&1
# 7. 配置NAT规则(让br0的流量通过无线网卡wlp0s20f3转发)
# 清除原有同类型规则,避免重复
sudo iptables -t nat -F POSTROUTING 2>/dev/null
sudo iptables -F FORWARD 2>/dev/null
# 添加NAT转发规则
sudo iptables -t nat -A POSTROUTING -o wlp0s20f3 -j MASQUERADE
sudo iptables -A FORWARD -i br0 -o wlp0s20f3 -j ACCEPT
sudo iptables -A FORWARD -i wlp0s20f3 -o br0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# 8. 创建tap0并加入br0(供QEMU使用)
sudo tunctl -t tap0 -u root
sudo brctl addif br0 tap0
sudo ifconfig tap0 0.0.0.0 promisc up
# 9. 打印网桥信息(验证配置)
echo "=== 网桥br0配置信息 ==="
sudo brctl show br0
sudo brctl showstp br0
echo "=== br0 IP配置 ==="
ip addr show br0 | grep inet
echo "=== NAT规则 ==="
sudo iptables -t nat -L POSTROUTING -n
# 10. 启动QEMU虚拟机(保留原参数,网络已通过br0/tap0+NAT配置)
sudo qemu-system-arm \
-M vexpress-a9 \
-smp cpus=2 \
-kernel rtthread.bin \
-serial stdio \
-sd sd.bin \
-net nic -net tap,ifname=tap0
由于我的电脑目前只用了无线网卡,于是采用让br0的流量通过无线网卡wlp0s20f3转发的方案。如果有网线连接路由器,可以采用绑定有线网卡到网桥的方案具体参考https://www.bilibili.com/read/cv24368022/?opus_fallback=1
mshifconfig e0 192.168.10.200 192.168.10.100 255.255.255.0 #设置ip 网关(br0) 子网掩码 dns e0 0 114.114.114.114 #设置DNS服务器
图4 配置网络并测试