☰
嵌入式开发:WiFi模式下NFS与TFTP环境搭建实战
2026/10/24 4:50:15 网站建设 项目流程

1. 为什么偏偏要在WiFi模式下搭建这套环境

1.1 这套环境到底解决什么问题

做嵌入式Linux开发、uboot移植或者内核驱动调试的朋友,对NFS和TFTP这两个东西应该都不陌生。TFTP一般出现在最早期,uboot阶段从主机拉内核镜像、设备树,速度慢但胜在协议简单,实现起来也简单;NFS则是内核起来之后,直接把主机上的某个目录挂载成开发板的根文件系统,改了代码立刻生效,不用一次次烧写Flash,调试效率能提升一个量级。

那为什么要在WiFi模式下搭这套环境?很多开发板或者核心板,硬件上压根没集成有线网口,只能靠WiFi模块联网;或者调试现场条件受限,网线拉不到,只能连无线路由器;也有一部分人是因为桌面太乱,懒得再插一根网线,干脆让开发板走无线。无论哪种原因,现实需求都存在:给开发板跑通WiFi,然后在这个无线局域网里完成TFTP下载和NFS挂载。

不过这里有个很现实的问题。网上搜到的教程,十篇里有九篇是以太网直连或者路由器下有线连接,直接照搬过来在WiFi环境里往往各种不通。我最早也这么干过,把有线环境的思路原封不动挪到无线上,结果挂在无线链路上一堆莫名其妙的坑。这篇文章就把我在WiFi模式下搭建NFS和TFTP环境的完整过程、核心参数、还有排查思路整理出来,适合正在做嵌入式开发、想用无线方式调试启动流程的朋友参考。

1.2 WiFi和有线介质的本质差异决定了配置思路

WiFi不是简单的“没有网线的以太网”,它在网络行为上和有线存在几个本质差异,而这些差异直接决定了NFS和TFTP配置的走向。

第一,无线链路是共享介质,同一个AP下的设备都要竞争信道时间,再加上2.4G频段受微波炉、蓝牙、隔壁AP干扰的影响,实际有效带宽和延迟波动很大。TFTP本身基于UDP,没有拥塞控制,WiFi丢包时表现为下载超时、重试;NFS则对丢包和延迟更敏感,WiFi信号差的时候,挂载成功后的目录操作都可能卡顿。

第二,WiFi网络里普遍存在“AP隔离”这个东西。家用路由器或者企业AP,为了安全默认会把无线客户端之间、无线与有线之间的二层通信隔离开,设备都在一个网段上但谁也ping不通谁。这在有线网络里很少见,却是WiFi搭建NFS/TFTP时最容易被忽视的一票否决项。

第三,WiFi模式下设备地址通常是DHCP动态分配的,路由器一重启或租约一到期,开发板IP就变了,而uboot里的serverip、NFS挂载命令里的主机IP,甚至内核cmdline里的nfsroot,全部写的是固定的服务端地址。所以WiFi模式下必须解决“服务端地址稳定”的问题,否则每次重启都要重新配置。

理解了这三层差异,再看后面的配置步骤,就会发现每一步都是在针对WiFi特性做适应,而不是简单照抄有线教程。

2. 主机侧服务端准备:NFS与TFTP的配置与原理

2.1 NFS服务端的搭建步骤与关键参数

我用的主机是Ubuntu环境,这套流程在Debian系同样适用。先装NFS服务端:

sudo apt update sudo apt install nfs-kernel-server

接着创建准备导出的目录。这里建议不要图省事直接用家目录,单独建一个专门给开发板用的目录会更清晰,比如:

sudo mkdir -p /srv/nfs/rootfs sudo chmod 777 /srv/nfs/rootfs

然后编辑/etc/exports。这个文件就是NFS的“导出清单”,我最终用的配置如下:

/srv/nfs/rootfs 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check,insecure)

解释一下这些参数。rw是允许读写,这个好理解。sync表示写入操作同步落盘后再返回,和async相比慢一点,但掉电后不容易坏文件系统,做根文件系统挂载时我建议保留sync。no_root_squash非常关键,开发板挂载根文件系统后,里面的init进程、守护进程很多是以root身份运行的,默认情况下NFS会把远程root用户映射成匿名用户nobody,权限不够就会导致启动失败,加了这个参数才能让开发板的root保留完整权限。no_subtree_check是提高稳定性用的,导出目录的子目录被重命名或删除时能减少一些奇怪报错。insecure是允许客户端使用大于1024的端口连接NFS服务,WiFi场景下客户端端口往往不固定,加上它能少一些连接被拒的问题。

配置完成后,刷新并验证:

sudo exportfs -ra sudo exportfs -v sudo showmount -e localhost

showmount能看到当前导出的目录和允许的网段,这个命令在排查“明明配置了但挂载不上”的问题时很实用。

有一点要特意提醒:导出的网段要和开发板实际的IP段一致。如果你不确定开发板最后会拿到什么IP,可以先写成*通配,调试通了再收敛范围。不过在生产环境或者长期调试场景,我建议用固定IP加指定网段,别图省事全放开,毕竟WiFi网络下其他设备也能访问到导出目录。

2.2 TFTP服务端的搭建步骤与目录规划

TFTP服务端我用的tftpd-hpa,这是目前嵌入式调试中最常见的TFTP服务端实现。

sudo apt install tftpd-hpa

安装完成后,它的配置文件在/etc/default/tftpd-hpa,需要修改成这样:

TFTP_USERNAME="tftp" TFTP_DIRECTORY="/srv/tftp" TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="--secure --create"

重点解释两个东西。TFTP_DIRECTORY就是TFTP的根目录,开发板用tftp命令下载时,读写的所有文件都会相对这个目录去找。这个目录必须存在而且权限不能让tftp用户无法访问,通常的做法是:

sudo mkdir -p /srv/tftp sudo chmod 777 /srv/tftp

TFTP_OPTIONS里的--secure也叫chroot模式,服务端会把tftp用户限制在TFTP根目录内,不允许访问上层路径,这是安全底线,建议保留。--create允许客户端往服务端写文件,如果你只是下载内核和设备树,这个选项可以不加。

改完配置后重启服务:

sudo systemctl restart tftpd-hpa sudo systemctl status tftpd-hpa

验证服务端是否正常,最简单的方式是本地回环测试。在/srv/tftp目录放一个文件,然后用tftp客户端自己拉一下:

cd /srv/tftp echo "test tftp" > test.txt tftp localhost

进入tftp交互界面后执行:

tftp> get test.txt tftp> quit

如果当前目录下出现了test.txt,就说明服务正常。很多人装完tftp服务端后从不验证,结果真正到uboot阶段才发现服务根本没启动,这是一步很冤枉的弯路。

2.3 WiFI环境下容易被忽略的防火墙放行

服务端软件本身配好了,但开发板还是连不上,这里有个WiFi环境下特别容易被忽略的坎:主机防火墙。

NFS这个协议的端口情况比较特殊。它虽然主要工作在2049端口,但挂载前还需要通过rpcbind(端口111)查询服务信息,而且NFS的mountd、nlockmgr等组件会使用系统动态分配的高端口。如果在主机上开了防火墙,只放行2049是不够的,111端口或者动态端口被挡,开发板挂载时会直接卡在nfs server not responding。有线环境可能因为很多主机默认防火墙没开,问题暴露不出来;WiFi调试时大家习惯性去检查无线链路,反而把这个基础问题给漏了。

我这边用的是ufw,放行规则可以这么写:

sudo ufw allow from 192.168.1.0/24 to any port 111 proto tcp sudo ufw allow from 192.168.1.0/24 to any port 2049 proto tcp sudo ufw allow from 192.168.1.0/24 to any port 69 proto udp

动态端口这一块最省事的办法是直接放行NFS相关的子网所有端口访问,或者干脆在调试期间暂时禁用ufw:

sudo ufw disable

TFTP这边就简单一些,它固定走UDP 69端口,放行上面那条UDP规则即可。另外注意,TFTP有些服务端收到数据包后会从随机源端口回复,有些客户端状态防火墙可能拦掉回包,遇到这种情况优先在防火墙里加入状态跟踪规则,或者调试期先关防火墙,跑通流程后再细化。

验证Ping通不代表NFS一定能通,这句话我建议写在前面的墙上。网络层通,传输层和RPC层还各自有坎,防火墙是第一个需要排除的。

3. 开发板端的联调:从WiFi连接到底层文件系统挂载

3.1 开发板WiFi联网与固定IP调整

开发板这一侧,第一步是先把WiFi跑起来。不同板子的联网方式差异很大,有的是buildroot里已经集成了wpa_supplicant,有的需要在系统启动后用命令行手动连接。

最通用的做法是wpa_supplicant加DHCP。先编辑/etc/wpa_supplicant.conf:

ctrl_interface=/run/wpa_supplicant update_config=1 network={ ssid="你的无线网络名称" psk="无线密码" }

然后启动:

sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf sudo udhcpc -i wlan0

udhcpc是嵌入式环境里常见的DHCP客户端,跑完之后用ifconfig wlan0查看IP。这一步能通,说明开发板和AP之间的链路没问题。

不过这里涉及前面说的核心问题:DHCP动态分配下开发板IP不固定。我的做法是到路由器后台给开发板的MAC地址绑定一个固定IP分配,这样每次连上WiFi拿到的都是同一个地址,又不影响路由器其他设备。如果你手里的路由器没有这个功能,那就直接在开发板上用静态IP配置文件,把/etc/network/interfaces改成:

auto wlan0 iface wlan0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 192.168.1.1

这一步一定要做,不然后面uboot环境变量和NFS挂载参数都要跟着开发板IP一起改,尤其在内核cmdline里写死了nfsroot后,一旦动态IP换到别的网段,整个启动就可能直接失败。

3.2 通过TFTP下载内核和设备树

开发板WiFi连上之后,系统如果还停留在uboot阶段,这时的网络功能比较有限,通常依赖uboot自己的网络命令。以最常见的tftp命令为例,在uboot命令行里需要先配置两个环境变量:

setenv serverip 192.168.1.10 setenv ipaddr 192.168.1.100

serverip是主机的IP,ipaddr是开发板自己的IP。这里要注意,有些开发板的网口和WiFi在uboot阶段共用一个MAC或者不通用,具体以板子官方文档为准。配置完之后启动网络设备:

dhcp

这一步除了能拿到动态IP,通常还会自动把serverip设置成DHCP服务器的地址。如果这里用的是静态IP环境,就手动执行:

setenv ipaddr 192.168.1.100

然后ping主机试试:

ping 192.168.1.10

WiFi模式下uboot阶段ping不通用很常见。先排除AP隔离,再确认uboot的WiFi驱动是否正常加载,很多uboot的WiFi驱动是需要额外编译进去的,并非默认支持所有无线网卡。

Ping通之后,下载内核:

tftp 0x82000000 zImage tftp 0x83000000 board.dtb

这里有个注意点。有线环境下tftp超时重试几次就能成功,WiFi环境丢包率稍微高一点,大型内核镜像下载很容易在某个进度卡住。如果发现总是超时,一个可行思路是把镜像文件减小,比如先下载最小的设备树文件做连通性测试;另一个是uboot下把tftp的块大小调整大一些,减少交互次数,不过要注意板和AP的兼容性。

3.3 NFS根文件系统挂载与内核启动参数

内核起来后进NFS根文件系统,需要在uboot的bootargs里配置好nfsroot相关参数。典型的cmdline是这样的:

setenv bootargs "console=ttyS0,115200 root=/dev/nfs rw nfsroot=192.168.1.10:/srv/nfs/rootfs,proto=tcp,v3 ip=192.168.1.100:192.168.1.10:192.168.1.1:255.255.255.0::wlan0:off"

一行命令里塞了不少信息,拆开理解一下。root=/dev/nfs rw表示用NFS作为根文件系统,并且以读写方式挂载。nfsroot=192.168.1.10:/srv/nfs/rootfs,proto=tcp,v3指定NFS服务端IP、导出路径、传输协议用TCP、NFS协议版本用v3。ip=192.168.1.100:192.168.1.10:192.168.1.1:255.255.255.0::wlan0:off这一段是开发板自己的IP、服务端IP、网关、掩码、网卡名、自动配置关闭。

proto参数为什么推荐写tcp?这里和TFTP刚好相反。NFS操作包含大量数据和RPC请求,TCP有重传、有拥塞控制,在WiFi这种会丢包的链路上表现比UDP稳定得多。我最早在WiFi下用默认的UDP挂载NFS,应用程序一读大文件就报nfs server not responding,换成TCP之后明显好很多,这是我测试下来很见效果的一个改动。

如果系统已经能启动到shell,只想手动验证NFS挂载,可以在开发板的文件系统里执行:

mount -t nfs 192.168.1.10:/srv/nfs/rootfs /mnt/nfs -o nolock,proto=tcp,rsize=8192,wsize=8192

加nolock是为了避免WiFi/NFS环境下lockd相关的端口和防火墙问题,能少很多无意义的排查。

4. WiFi模式下NFS与TFTP的故障排查与提速经验

4.1 症状-原因对照速查表

WiFi环境下这套环境出问题,症状和原因之间往往不是一一对应的。我整理了一张速查表,基本覆盖我实际踩过的坑:

症状可能原因排查动作
开发板ping不通主机,但WiFi已连接AP隔离开启登录路由器后台关闭客户端隔离或联系网络管理员
dev板能ping通主机,但tftp下载超时主机防火墙拦截UDP 69放行UDP 69,或临时disable防火墙测试
tftp能下载小文件,大文件总是卡住WiFi丢包率高,uboot重传策略差改用5G频段、缩短镜像体积、调大块大小
NFS挂载超时,卡在nfs server not respondingrpcbind端口或动态端口被防火墙拦放行111和2049,测试时关闭防火墙
NFS挂载成功,但目录ls卡顿WiFi信号弱,UDP传输丢包改为proto=tcp,并检查无线信号质量
系统启动时NFS报权限拒绝忘记加no_root_squash检查exports配置,exportfs -ra刷新
重启后开发板无法挂载DHCP地址变化,服务端IP写的是旧地址给开发板绑定固定IP,或改静态配置
挂载后小文件正常,大文件写失败磁盘满或rsize/wsize过大检查主机磁盘空间,调小传输块大小

这张表不是随手写的,每一项背后都是真实发生的调试过程。比如“dev板能ping通但tftp超时”,我排查了半小时,最后发现主机上ufw把UDP 69端口挡了,而ping用的是ICMP完全不受影响。遇到现象时先从链路通断、防火墙、协议端口这三层去切,比盲目改参数有效得多。

4.2 三个隐藏最深的WiFi专属问题

第一个是AP隔离。这个前面反复提到,因为它实在是太隐蔽了。很多路由器默认不会直接叫“AP隔离”,而是叫“无线网络隔离”、“SSID隔离”或“客户端隔离”,不同品牌叫法不一样,但效果都是设备之间二层不可达。判断方法很简单:开发板能连上WiFi、能获取IP,但ping路由器之外的任何设备都不通,这时八九不离十就是这个。

第二个是频段干扰。2.4GHz频段的WiFi干扰源太多了,蓝牙、微波炉、USB 3.0设备都会挤占信道。NFS在信号强度低或干扰严重的环境下,即使挂载成功了,写文件时也会频繁卡顿。我在实测中发现,把开发板和主机AP都切到5GHz频段后,NFS大文件读写的流畅度提升明显,延迟也从几十毫秒降到了个位数。有些路由器支持双频合一,建议调试阶段直接把开发板绑定到5G频段。

第三个是DHCP租约和地址冲突。WiFi设备的MAC地址有些是随机化的,尤其是手机或者部分开发板默认开启MAC随机化,导致路由器绑定的固定IP不生效,或者两台设备抢同一个IP。排查方式是开发板上反复ifconfig wlan0查看实际地址,同时在路由器后台核对DHCP租约列表,确认绑定的MAC和开发板真实MAC一致。

4.3 NFS挂载选项调优与长期稳定运行建议

把整套环境跑通只是第一步,WiFi模式下真正头疼的是稳定性。NFS的挂载选项可以优化,我实际用下来这组参数稳定性很好:

mount -t nfs 192.168.1.10:/srv/nfs/rootfs /mnt/nfs \ -o nolock,proto=tcp,mountproto=tcp,rsize=8192,wsize=8192,timeo=50,retrans=3

说明一下这些参数的意思。timeo是RPC请求的超时时间,单位是0.1秒,WiFi链路延迟波动大,设成50相当于5秒超时,比默认值更能容忍网络抖动。retrans是RPC请求的重传次数,WiFi环境下偶尔丢一次包很正常,重传3次就能覆盖大多数瞬时抖动,再大反而会让故障恢复变慢。

主机侧也可以做一些调整。路由器的信道固定下来,不要用自动选择;关闭AP的节能模式如果选项支持的话;开发板放在离AP尽量近的位置,有时候只是挪个地方,NFS卡顿就能消失。

我个人的最终方案是:WiFi调试用于日常快速验证,涉及长时间批量写入或者关键质量测试时,会考虑用有线串口做辅助,或者做好无线环境兜底。毕竟WiFi物理层的特性摆在那里,它能给你无线的便利,但不可能做到铜缆那样的稳定。接受这个物理限制,在软件参数上做适配,这套环境还是可以很稳地为日常开发服务的。

最后分享一个实战经验:给开发板做好固定IP之后,把主机端的NFS导出目录、TFTP根目录都放在同一个服务端IP下,uboot的serverip、内核的nfsroot、开发板的ipaddr全部用静态地址写在文档里,每次开机不用再动态核对。这种做法在WiFi模式下节省的排查时间非常多,值得养成熟练习惯。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询