WSL2 + TFTP + 网络启动(Linux开发板与WSL2建立网络连接)

环境

系统:win11

wsl2:Ubuntu 24.04.3 LTS
网络拓扑分析

第一步搞清楚物理连接 在开始配置之前,我们先搞清楚网络是怎么连的。这听起来简单,但很多人第一步就搞错。

Windows 网卡情况 打开 Windows 的 PowerShell,运行 ipconfig

这里有两条关键信息:

网桥:IP 是 192.168.60.1,这是开发板实际连接的网卡

若以太网 2:媒体状态是"已断开",说明没插网

网桥设置步骤:

控制面板打开网络连接,点以太网 的属性进行ipv4修改(TCP/IPv4),因为是网线直连,网段可以随意设置,在uboot需setenv对应

这里的以太网2就是要配置的端口,右键以太网2,双击ipv4设置静态ip
**
开发板网络配置

在 U-Boot 命令行中,先 ping 一下网关:

如果看到 is alive,说明物理链路是通的。如果超时,检查:

  • 网线是否插好
  • 开发板和 Windows 是否在同一网段
  • Windows 防火墙是否允许 ping(ICMP)

WSL2 网络模式:NAT vs Mirrored

WSL2 有两种网络模式:NAT(默认)和 Mirrored。理解它们的区别是关键。

NAT 模式的问题

WSL2 默认是 NAT 模式,它的网络结构是这样的:

bash 复制代码
开发板 (192.168.60.x)
    ↓
Windows 网桥 (192.168.60.1)
    ↓
Windows NAT (虚拟交换机)
    ↓
WSL2 (172.x.x.x)

在 NAT 模式下,WSL2 处于一个独立的虚拟网段(通常是 172.x.x.x),和开发板的 192.168.60.0/24 网段完全隔离。这就导致:

  • 开发板无法直接访问 WSL2
  • WSL2 的 TFTP 服务对开发板不可见
  • 每次重启 WSL2,IP 可能会变化

Mirrored 模式的优势

Mirrored 模式让 WSL2 直接镜像 Windows 的所有网卡:

bash 复制代码
开发板 (192.168.60.x)
    ↓
Windows 网桥 (192.168.60.1)
    ↓
WSL2 (能看到 192.168.60.1/24)

在 Mirrored 模式下,WSL2 可以直接访问 Windows 的每一块网卡,包括 192.168.60.1 这个网桥。

切换到 Mirrored 模式

在 Windows 用户目录下创建或编辑 .wslconfig 文件:

文件位置:C:\Users\<你的用户名>\.wslconfig 内容:
内容:

bash 复制代码
# Settings apply across all Linux distros running on WSL 2
[wsl2]
networkingMode=mirrored     # 开启镜像网络
dnsTunneling=true           # 开启 DNS Tunneling
firewall=true               # 开启 Windows 防火墙
autoProxy=true              # 开启自动同步代理
 
[experimental]
hostAddressLoopback=true

保存后,重启 WSL

验证网络模式

重启 WSL 后,在 WSL 中运行:

bash 复制代码
ip addr

能看到类似这样的网卡:

bash 复制代码
7: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 8e:3d:ed:06:7d:af brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
9: eth4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether c8:17:f5:cf:88:d4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.60.1/24 brd 192.168.60.255 scope global noprefixroute eth4
       valid_lft forever preferred_lft forever
    inet6 fe80::ef5b:8623:c3e5:d66/64 scope link nodad noprefixroute
       valid_lft forever preferred_lft forever

关键点是 inet 192.168.60.1/24,这说明 WSL2 现在能看到开发板所在的网段了。

经验.wslconfig 是全局配置,会影响到机器上所有 WSL2 发行版。但对于普通开发使用,这通常没有副作用,上网也不受影响。

TFTP 服务搭建

现在网络通了,我们来搭建 TFTP 服务。
安装 tftpd-hpa

bash 复制代码
sudo apt update
sudo apt install tftpd-hpa

配置 TFTP

编辑配置文件:

bash 复制代码
sudo nano /etc/default/tftpd-hpa

修改为:

bash 复制代码
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/itcai/tftp"
TFTP_ADDRESS="192.168.60.1:69"
TFTP_OPTIONS="--secure"

配置说明:

  • TFTP_USERNAME:运行 TFTP 服务的用户
  • TFTP_DIRECTORY:TFTP 根目录,存放可传输的文件
  • TFTP_ADDRESS:监听地址,必须绑定到 192.168.60.1(开发板能访问的地址)
  • TFTP_OPTIONS
    --secure:安全模式,限制访问范围在TFTP_DIRECTORY
    可选:--create:允许上传文件(如果需要)
    准备 TFTP 目录
bash 复制代码
# 创建目录
mkdir ~/tftp

# 设置权限
sudo chmod 777 ~/tftp
sudo chmod o+x /home/itcai

创建测试文件

bash 复制代码
echo "Hello from TFTP!" > ~/tftp/test.txt
sudo chmod 777 ~/tftp/test.txt

**踩坑提醒:**文件本身也要有读权限!很多人改了目录权限忘记改文件权限,导致 TFTP 传输 Abort。

启动 TFTP 服务

bash 复制代码
sudo service tftpd-hpa start

bash 复制代码
sudo systemctl restart tftpd-hpa

验证 TFTP 服务

首先确认服务在监听正确的端口:

bash 复制代码
sudo ss -ulnp | grep 69

输出类似:

bash 复制代码
UNCONN 0 0 192.168.60.1:69  0.0.0.0:*  users:(("in.tftpd",pid=xxxx,fd=...))

关键是 192.168.60.1:69,说明服务绑定到了正确的网卡。

然后在 WSL 内部测试一下:

bash 复制代码
# 安装 tftp 客户端(如果没安装)
sudo apt install tftp-hpa

# 测试
echo "get test.txt" | tftp 192.168.60.1
cat test.txt

如果能看到 "Hello from TFTP!",说明 TFTP 服务本身没问题。
Windows 防火墙配置(最隐蔽的坑!)

好,TFTP 服务在 WSL 里测试通过了。现在在开发板 U-Boot 里测试:

bash 复制代码
=> tftp 0x80800000 test.txt
Using ethernet@20b4000 device
TFTP from server 192.168.60.1; our IP address is 192.168.60.200
Filename 'test.txt'.
Load address: 0x80800000
Loading: T T T T T T T T T T
Retry count exceeded; starting again

添加防火墙规则

以管理员身份打开 PowerShell,运行:

bash 复制代码
New-NetFirewallRule -DisplayName "WSL TFTP" `
                    -Direction Inbound `
                    -Protocol UDP `
                    -LocalPort 69 `
                    -Action Allow

参数说明:

• -DisplayName:规则名称,方便识别

• -Direction Inbound:入站规则(允许外部访问内部)

• -Protocol UDP:TFTP 使用 UDP 协议

• -LocalPort 69:TFTP 端口

• -Action Allow:允许通过
验证防火墙规则

bash 复制代码
Get-NetFirewallRule -DisplayName "WSL TFTP" | Format-List

或者查看防火墙日志(如果启用了日志):

bash 复制代码
Get-NetFirewallRule -DisplayName "WSL TFTP" | Get-NetFirewallPortFilter

再次测试

现在回到 U-Boot,再试一次:

bash 复制代码
=> tftp 0x80800000 test.txt
Using ethernet@20b4000 device
TFTP from server 192.168.60.1; our IP address is 192.168.60.200
Filename 'test.txt'.
Load address: 0x80800000
Loading: #
         1.5 KiB/s
Bytes transferred = 6 (6 hex)

U-Boot 网络配置

现在 TFTP 通了,我们来完整配置 U-Boot 的网络参数。
配置网络参数

在 U-Boot 命令行中:

bash 复制代码
setenv ipaddr 192.168.60.200
setenv ethaddr 00:04:9f:04:d2:35
setenv netmask 255.255.255.0
setenv gatewayip 192.168.60.1
setenv serverip 192.168.60.1
saveenv

参数说明:

• ipaddr:开发板的 IP 地址

• netmask:子网掩码

• gatewayip:网关地址(通常和 serverip 相同)

• serverip:TFTP 服务器地址(即 WSL/Windows 的 IP)

bash 复制代码
printenv serverip

验证网络连接

bash 复制代码
=> ping 192.168.60.1
Using ethernet@20b4000 device
host 192.168.60.1 is alive

如果 ping 不通,检查:

  • 网线是否连接
  • IP 地址是否在同一网段
  • Windows 防火墙是否允许 ICMP(ping)

若还是不行,手动关闭电脑的专用网络和公用网络

开发板设置

接下来设置下开发板的 IP。

这里我们将开发板 IP 设置为 192.168.10.50,和WSL2在同一网段即可。进入开发板文件系统,设置开发板 IP。

bash 复制代码
ifconfig eth0 up
ifconfig eth0 192.168.60.200
ifconfig

永久配置ip方式:

bash 复制代码
vi /etc/rc.local

加入下面这三行

bash 复制代码
ifconfig eth0 up
ifconfig eth0 192.168.60.200 netmask 255.255.255.0
route add default gw 192.168.60.1 eth0

正点原子阿尔法板子改完,配置文件如下:

bash 复制代码
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# 开机自动配置 eth0 静态IP(我加的)
ifconfig eth0 up
ifconfig eth0 192.168.60.200 netmask 255.255.255.0
route add default gw 192.168.60.1 eth0

echo 30000 >  /proc/sys/vm/min_free_kbytes
source /etc/profile
# 旧版叫QDesktop,新版UI叫systemui
/opt/ui/systemui >/dev/null 2>&1 &
exit 0

改完重启生效:

bash 复制代码
reboot

ping 测试

开发板ping WSL2

bash 复制代码
ping 192.168.60.1

WSL2 ping开发板

bash 复制代码
ping 192.168.60.200

Windows ping 开发板

bash 复制代码
ping 192.168.60.200

WSL2 ping Windows

bash 复制代码
ping 192.168.64.1

Windows ping WSL2

bash 复制代码
ping 192.168.60.1

若上述测试均成功,则网络设置完毕!

相关推荐
SP八岐大兔2 小时前
AI对话&OpenClaw全域终极指令大全
网络·人工智能·openclaw
Benszen3 小时前
Docker容器化技术全解析
运维·docker·容器
IMPYLH3 小时前
Linux 的 false 命令
linux·运维·服务器·bash
小江的记录本3 小时前
【Linux】《Linux常用命令汇总表》
linux·运维·服务器·前端·windows·后端·macos
llilian_163 小时前
信号失真度测试仪 自动失真测试仪 低失真度自动测量仪为各行业精准赋能 自动失真仪
网络·功能测试·单片机·测试工具
一匹电信狗3 小时前
【Linux我做主】进程程序替换和exec函数族
linux·运维·服务器·c++·ubuntu·小程序·开源
济6173 小时前
ARM Linux 驱动开发篇--- Linux 并发与竞争实验(原子操作)--- Ubuntu20.04
linux·嵌入式·嵌入式linux驱动开发
加农炮手Jinx3 小时前
Flutter 三方库 cli_script 鸿蒙化极简命令行执行引擎适配探索:在多维沙盒终端环境注入异构 Shell 串联逻辑彻底拔高全自动化容器脚本运维及-适配鸿蒙 HarmonyOS ohos
运维·flutter·harmonyos
JoyCong19983 小时前
纳睿雷达×ToDesk:突破时空限制,远程运维让“中国智造”雷达更高效
运维·科技·电脑·远程操作