作为一名嵌入式开发工程师,我深知网络启动在开发流程中的重要性。每次修改内核后反复烧录SD卡的等待时间,足以消磨掉一个开发者的大部分耐心。正因如此,我决定在正点原子i.MX6ULL开发板上搭建一套完整的网络启动环境。
这个方案的核心在于利用WSL2作为开发环境,通过TFTP协议实现内核和设备的快速传输。听起来简单,但实际搭建过程中我遇到了无数坑——从WSL2的网络隔离到Windows防火墙的隐蔽拦截,从权限问题到配置错误。本文将完整记录这套方案的实现过程,包括每个环节的原理解析和避坑指南。
在开始任何软件配置前,我们必须先确保物理连接正确。这是最基础却最容易被忽视的一步。
使用Windows PowerShell执行ipconfig命令,我得到了以下关键信息:
code复制以太网适配器 网桥:
IPv4 地址......: 192.168.60.1
子网掩码.......: 255.255.255.0
以太网适配器 以太网2:
媒体状态.......: 媒体已断开
这里有两个常见误区:
在U-Boot命令行中执行ping测试:
code复制=> ping 192.168.60.1
Using ethernet@20b4000 device
host 192.168.60.1 is alive
如果出现超时,建议按以下顺序排查:
printenv ipaddr)默认情况下,WSL2使用NAT网络模式,其网络架构如下:
code复制开发板(192.168.60.x) → Windows网桥(192.168.60.1) → WSL2(172.x.x.x)
这种架构导致开发板无法直接访问WSL2内的服务,因为两者处于不同网段。
通过创建C:\Users\<用户名>\.wslconfig文件并添加以下内容:
code复制[wsl2]
networkingMode=mirrored
然后执行重启命令:
bash复制wsl --shutdown
wsl
验证配置是否生效:
bash复制ip addr show eth9 | grep "inet 192.168.60.1"
正确的输出应包含开发板所在网段的IP地址。
安装TFTP服务端:
bash复制sudo apt update
sudo apt install tftpd-hpa
配置文件/etc/default/tftpd-hpa的关键参数:
ini复制TFTP_DIRECTORY="/home/user/tftp"
TFTP_ADDRESS="192.168.60.1:69"
TFTP_OPTIONS="--secure"
这是最容易出错的环节之一。必须确保:
bash复制chmod 777 ~/tftp
bash复制sudo chmod o+x /home/user
bash复制chmod 777 ~/tftp/zImage
在WSL内部测试TFTP:
bash复制echo "get test.txt" | tftp 192.168.60.1
如果测试失败,使用以下命令检查服务状态:
bash复制sudo ss -ulnp | grep 69
以管理员身份运行PowerShell执行:
powershell复制New-NetFirewallRule -DisplayName "WSL TFTP" `
-Direction Inbound `
-Protocol UDP `
-LocalPort 69 `
-Action Allow
检查规则是否生效:
powershell复制Get-NetFirewallRule -DisplayName "WSL TFTP" | Format-Table -AutoSize
在U-Boot中配置网络参数:
code复制setenv ipaddr 192.168.60.200
setenv serverip 192.168.60.1
saveenv
创建自动启动命令:
code复制setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-evk.dtb; bootz 80800000 - 83000000'
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 持续T T T | 防火墙拦截 | 检查Windows防火墙规则 |
| 传输后Abort | 权限不足 | 检查文件和目录权限 |
| 速度极慢 | 网络质量差 | 更换网线或降低MTU |
物理层:
网络层:
传输层:
安装NFS服务:
bash复制sudo apt install nfs-kernel-server
配置/etc/exports:
code复制/home/user/nfsroot *(rw,sync,no_subtree_check,no_root_squash)
code复制setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=${nfsroot},v3,tcp ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}::eth0:off'
使用脚本自动化编译和部署:
bash复制#!/bin/bash
make zImage dtbs && cp arch/arm/boot/zImage ~/tftp/ && cp arch/arm/boot/dts/*.dtb ~/tftp/
在U-Boot中设置快捷键:
code复制setenv load_kernel 'tftp 80800000 zImage'
setenv load_dtb 'tftp 83000000 imx6ull-14x14-evk.dtb'
使用网络抓包分析:
bash复制sudo tcpdump -i eth9 udp port 69 -vv
启用TFTP服务详细日志:
修改/etc/default/tftpd-hpa:
code复制TFTP_OPTIONS="--verbose --secure"
经过这套环境的搭建,我的开发效率得到了显著提升。内核修改后的测试周期从原来的几分钟缩短到了几秒钟。虽然初始配置过程遇到不少挑战,但一旦搭建完成,它将为嵌入式Linux开发带来极大的便利性。