资讯动态

WiFi模式下NFS与TFTP嵌入式调试环境搭建与优化

发布时间:2026/10/24 1:30:11 来源:尧图企业网站定制
做嵌入式开发的人应该都经历过一种纠结明明可以抱着一块开发板到处跑却总得拖着一根网线才能干活。有的板子没有有线网口有的板子放在某个现场角落拉线不现实还有些时候手里拿的是一台手机改装过的调试终端。这时候把NFS和TFTP这两个调试利器架到WiFi上就成了非常现实的需求。这篇内容我想把“WiFi模式下nfs与tftp的网络环境搭建”这件事从头到尾捋一遍。它不复杂但也不是直接把有线环境的配置搬过来就行——无线链路的延迟、丢包、IP漂移这些特性会实实在在影响NFS的挂载稳定性和TFTP的传输成功率。这篇文章适合正在用开发板做根文件系统挂载调试的工程师适合想摆脱网线束缚的嵌入式爱好者也适合那些手里只有WiFi环境、却要折腾uboot和内核镜像传输的人。先给你交个底这套环境本身并不难难的是让它稳定、可复用。下面我会从整体设计思路说起把服务端配置、客户端优化、WiFi场景下的验证和排错一路讲完。我不喜欢写那种“复制粘贴就能跑”的教程你想跑起来很容易想跑得稳就得知道参数背后的原因。1. WiFi模式下NFS与TFTP环境的整体设计与核心思路1.1 为什么非要在WiFi下搭这套环境先把场景掰开。NFSNetwork File System解决的是开发板启动时挂载根文件系统的问题TFTP解决的是uboot阶段传输内核镜像、设备树文件的问题。这两个服务在有线网络下都非常成熟但WiFi场景会引入几个有线环境几乎不会遇到的不确定因素IP地址可能是动态分配的、丢包率比网线高一个数量级、延迟抖动明显、路由器的AP隔离可能直接掐断设备间的互访。我碰到过的真实场景是某块开发板自带WiFi模块但没有以太网口项目现场又不能随便布线。当时手头只有一台笔记本电脑和一个家用路由器要在这种条件里完成内核下载、文件系统挂载的整套调试不像听起来那么轻松。特别是第一次用TFTP传内核时反复超时后来发现是WiFi基站下的丢包率偏高小文件没感觉一传到十几MB就原形毕露。WiFi天然具有“移动性”优势很多开发环境需要设备在实际摆放位置调试电脑可以就近放着但网线布不过去。把NFS和TFTP从有线迁到无线本质上是把调试链路的传输介质换掉了但服务架构没有变一台开发机服务器提供共享目录和启动文件开发板作为客户端启动时通过网络拉取资源。区别在于无线链路不允许你像有线那样“随便配配就能用”必须针对链路质量做参数层面的适配。1.2 网络拓扑与链路规划这套环境里的角色划分非常清晰开发机也被称作宿主机安装并运行NFS服务端和TFTP服务端通常通过网线或WiFi接入同一个局域网段。开发板客户端通过WiFi接入相同局域网启动过程中先从DHCP获取IP或配置静态IP然后依次通过TFTP下载内核、通过NFS挂载根文件系统。无线模式下我强烈建议给开发板固定IP而不是完全依赖DHCP动态分配。原因后面细说简单讲就是动态IP在WiFi下重新关联路由器时很容易变化而NFS挂载一旦断掉再恢复就要重新定位服务器IP这会浪费大量调试时间。实测中比较稳的搭配是路由器开启DHCP静态绑定把开发板的MAC地址和某个固定IP绑在一起。这样既不用在板子上写死IP换网络环境时还能自动适配又能保证每次重新上电后IP不变。这是整套环境的链路示意图路由器位于中间开发机通过WiFi/网线接入开发板通过WiFi接入两者处于同一网段。TFTP走的是UDP 69端口NFS走的是TCP/UDP 2049端口外加一组动态端口rpcbind。WiFi环境下如果路由器开启了AP隔离客户端隔离这两个设备的二层通信会被直接切断表现为互相ping不通——这个问题我后文还会专门说。1.3 方案选型为什么不直接用U盘或串口你可能问既然WiFi不稳定为什么不直接U盘拷贝、串口下载答案是效率和迭代速度。嵌入式调试是一个“改代码、编内核、拷过去、看现象”的循环串口传一个大内核要等几分钟U盘还得来回插拔。NFS和TFTP的价值在于把“传输”变成网络上的常态操作每次改动后重启开发板就能加载最新内容。WiFi虽然不如有线稳定但胜在没有物理束缚尤其适合移动调试和现场联调场景。这套方案解决的真实痛点其实就一句话在没有有线条件的环境里保留完整的网络调试能力。代价则是链路质量下降所以整个配置过程不能照搬有线思路要在NFS协议版本、挂载超时参数、TFTP块大小这些层面上做针对性调整。2. 服务端基础环境搭建NFS与TFTP的安装和启动2.1 确认服务端网络状态与软件源无论你用的是哪一套Linux发行版第一步都先确认开发机自身的网络状态。这一步看起来多余但确实现场翻车过很多回有人装好了NFS挂载时才发现服务端自己有两个IP开发板访问的是那个被防火墙挡住的地址。# 查看网卡IP与连接状态 ip addr show ip route show # 确认能与开发板互通先做一次基本ping ping 开发板IP我建议第一次搭建的时候用有线把开发机和路由器连接起来确认整套NFSTFTP流程走通再切换到WiFi做链路优化。这不是怂而是把变量拆开排查——有线都跑不通就上无线出了问题都不知道怪谁。软件源方面Debian系和Red Hat系装的服务名字不一样但核心组件一样发行版系NFS服务端包名TFTP服务端包名Debian/Ubuntunfs-kernel-servertftpd-hpaCentOS/RHEL/Rockynfs-utilstftp-server2.2 安装NFS服务端以Debian系为例sudo apt update sudo apt install -y nfs-kernel-server装完之后不要急着配先把服务状态确认一下sudo systemctl status nfs-server这个服务名在Debian系上是 nfs-server在部分版本上可能是 nfs-kernel-server。不管叫啥state为activerunning就行。Red Hat系的安装命令是sudo dnf install -y nfs-utils sudo systemctl enable --now nfs-server这一步的作用是让NFS在开机后自动拉起避免每次手动启动。后面你在开发板上配置开机自动挂载时服务端的自启动就是前提条件。2.3 安装TFTP服务端TFTP的阵营选择比较多我用的是 tftpd-hpa理由是它配置集中、支持systemd管理、参数语义清楚。Debian系安装sudo apt install -y tftpd-hpaRed Hat系则要装 tftp-server并通过socket激活sudo dnf install -y tftp-server sudo systemctl enable --now tftp.socket注意Red Hat系会拆成tftp.service和tftp.socket两个单元实际监听68/69端口的是socket单元部署的时候要确认socket是启动状态。我见过有人在Red Hat上配了老半天配置文件结果发现tftp.service是独立的、根本不是自己用的那个进程。2.4 防火墙策略NFS和TFTP的端口开放防火墙是NFS环境搭建里翻车率最高的环节。NFS本身不止监听2049端口它依赖rpcbind动态分配端口所以不能只放行2049还要放行rpcbind的111端口以及一系列动态端口。TFTP则相对简单固定UDP 69端口。Debian系的ufw可以这样操作sudo ufw allow 2049/tcp sudo ufw allow 2049/udp sudo ufw allow 111/tcp sudo ufw allow 111/udp sudo ufw allow 69/udpRed Hat系的firewalld更省事直接认服务名sudo firewall-cmd --permanent --add-servicenfs sudo firewall-cmd --permanent --add-servicerpc-bind sudo firewall-cmd --permanent --add-servicetftp sudo firewall-cmd --reloadfirewalld能识别nfs这个服务名会自动放行2049、111以及NFS动态端口。但有一个问题有些环境中firewalld的服务定义不包含全部动态端口范围配置完还是挂不上。保险起见可以查看自己的NFS实际使用了哪些端口rpcinfo -p | grep nfs如果发现动态端口不在防火墙放行范围内就得手动加一条规则。有种更稳的做法是固定NFS动态端口范围到某个区间再对区间放行具体做法是把下面这行写进 /etc/nfs.conf 的[nfsd]段[nfsd] vers3y vers4y动态端口固定的做法稍复杂但在部分企业路由器环境下确实更可靠。这是后话如果你只是个人开发环境放行服务名的方案通常就够了。3. NFS核心配置与WiFi链路下的参数优化3.1 导出目录配置/etc/exports 的每一项都别糊弄NFS服务端配置核心就一个文件/etc/exports。它定义了“哪些目录可以给谁用、用什么权限”。我的习惯是单独划一个目录做嵌入式调试共享区比如 /srv/nfs/rootfs里面放编译好的根文件系统。一个典型的exports条目/srv/nfs/rootfs 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)四个参数里每个都有讲究rw允许读写。调试阶段你经常要在开发板上写文件只读的话连日志都存不下来。sync服务端在响应客户端写请求前必须将数据落盘。WiFi下链路本来就不稳sync能最大限度避免数据不一致的问题。有人为了性能用async但是在嵌入式调试场景我宁可慢一点也要数据安全。no_subtree_check关闭子目录的权限检查。这个参数能降低NFS在目录重命名等场景下的延迟WiFi下尤其有价值。no_root_squash允许开发板上的root用户以root权限访问共享目录。没有这个参数开发板上的root会被映射成nobody你连创建设备节点都做不了很多根文件系统挂载后会直接启动失败。写完exports后执行sudo exportfs -ra sudo showmount -e localhostshowmount -e 输出的内容就是开发板侧能看到的共享列表。如果这里没有输出你的共享目录大概率是exports格式写错了别急着去客户端排查。3.2 WiFi场景下NFS挂载参数的选择逻辑服务端配置搞定后真正能体现“WiFi优化”的是客户端挂载参数。有线环境下很多人直接 mount -t nfs 192.168.1.10:/srv/nfs/rootfs /mnt/nfs但无线环境的丢包与延迟不允许这么粗暴。这是我实测在WiFi场景下很好用的一组参数mount -t nfs -o nolock,tcp,rsize4096,wsize4096,timeo50,retrans5,soft \ 192.168.1.10:/srv/nfs/rootfs /mnt/nfs逐项说明nolock关闭NFS的锁管理。开发板侧的NFS客户端锁机制在无线环境下容易触发问题关闭后能减少挂载失败的概率。tcp强制走TCP而非UDP。WiFi本身丢包率不低TCP的重传机制能保证数据传输完整性。有人担心TCP比UDP慢但在NFS场景下TCP的可靠优势远大于那点延迟差。rsize/wsize4096单次读写的块大小。有线环境你完全可以设成32768但WiFi下大块传输容易触发底层重传风暴4096是实践下来比较折中好用的值。timeo50超时时间单位是0.1秒也就是5秒。这个值比默认的60060秒小很多。为什么不直接用默认因为默认超时在无线链路上会让你等很久才报错调试时卡在那里非常被动。retrans5重传次数。配合timeo约5次重试后还没成功就报错。这两个参数的意义是把“等待挂载结果”的时长控制在可接受范围内。soft使用软挂载即重试超时后返回错误而不是无限阻塞。开发调试阶段用soft因为你经常改配置、调链路硬挂载一旦断连会卡死整个系统只能重启开发板。我之前在某块板子上测试过同样的NFS共享有线挂载开机到进入shell大约10秒WiFi下用优化参数大约14秒。多出的时间主要是无线链路的连接开销和NFS握手延迟这个代价可以接受。但你如果用默认的全部参数直接挂会出现一种情况挂载命令执行后没有任何反馈卡几分钟都不报错——那是硬挂载的等待重传机制在空转。3.3 客户端挂载操作与开机自动挂载手动挂载确认无误后最好把挂载动作固化到开发板的启动流程里。有两种常见做法一种是把挂载命令写进启动脚本rc.local或systemd服务另一种是写进 /etc/fstab。开发板上的文件系统如果本身在本地Flash里fstab是合适的192.168.1.10:/srv/nfs/rootfs /mnt/nfs nfs nolock,tcp,rsize4096,wsize4096,timeo50,retrans5,soft 0 0如果开发板根本没有本地根文件系统整个过程是“uboot通过TFTP下载内核 - 内核通过NFS挂载根文件系统”那挂载参数要传在内核bootargs里。比如root/dev/nfs nfsroot192.168.1.10:/srv/nfs/rootfs,tcp,nolock,rsize4096,wsize4096 rw ipdhcp注意这里的nfsroot参数列表和服务端配置是配套的。别小看这个细节我见过有人uboot能起来、TFTP也能下内核但根文件系统一直挂不上最后发现是bootargs里没写tcp、nolock内核默认用UDP挂载在WiFi下就是会莫名失败。3.4 NFS权限问题的排查思路Permission denied是NFS最常见的错误之一而在WiFi环境中多了一层配IP的干扰让问题更难定位。排查顺序是先确认客户端拿到的是否是192.168.1.0/24网段的IP再看exports里的网段是否覆盖了这个IP再看no_root_squash是否加上了。小技巧在服务器端看日志能最快定位权限问题。sudo tail -f /var/log/syslog | grep nfs日志会直接告诉你“nfsd: permission error”以及来源IP。我看到过不少人折腾半天防火墙结果全是网段写错导致的权限拒绝。还有一个坑是SELinux。Red Hat系默认SELinux强制模式会拦NFS流量表现为客户端卡在挂载、服务端日志却干干净净。临时验证可以先执行 setenforce 0如果挂载立刻成功说明就要么关SELinux要么打SELinux布尔值放行NFS。4. TFTP服务配置启动文件的分发通道4.1 TFTP与NFS的职责边界在整套启动流程里TFTP和NFS的分工是uboot阶段用TFTP下载内核镜像和设备树因为uboot里的NFS客户端太简陋性能和稳定性都差内核接管启动后再用NFS挂载根文件系统。这两个服务各管一段但文件来源可以共享同一个目录也可以分开。TFTP配置目录建议放在 /srv/tftp 或者 /var/lib/tftpboot。里面放zImage、uImage、设备树dtb文件。你可能会问这些文件都不大为什么WiFi下还偶尔传失败因为TFTP走UDP本身没有拥塞控制WiFi的随机丢包一旦触发了服务端的超时重传重传往往也一起丢——这就是TFTP在无线环境里“越传越慢、最后失败”的根因。4.2 tftpd-hpa 的配置细节tftpd-hpa的配置文件在 /etc/default/tftpd-hpa内容一般长这样TFTP_USERNAMEtftp TFTP_DIRECTORY/srv/tftp TFTP_ADDRESS:69 TFTP_OPTIONS--secure --create每个配置项的作用TFTP_USERNAME运行tftpd的进程用户建议专用低权限用户tftp。防止TFTP被攻击时拿到root权限。TFTP_DIRECTORYTFTP的根目录。--secure模式下客户端访问的所有文件都限制在这个目录里相当于chroot。TFTP_ADDRESS监听地址:69表示监听所有网卡的69端口。也可以指定开发机的IP比如192.168.1.10:69这样更安全但如果开发机IP变化会直接失联。TFTP_OPTIONS--secure是安全的chroot模式务必保留。--create允许客户端创建文件这样开发板也能把日志、临时文件传回服务端。如果只是为了启动镜像下载不一定要加--create。改完配置后sudo systemctl restart tftpd-hpa sudo ss -ulpn | grep :69看到监听在69端口就说明服务起来了。有些老教程会教你把TFTP托管给xinetd配置 /etc/xinetd.d/tftp。我不推荐新环境用xinetd因为它多了一层进程管理的复杂度systemd已经把它替代得差不多了。用tftpd-hpa的独立daemon模式启动快、日志清晰、排查方便。4.3 WiFi链路下的TFTP实测验证搭建完服务端用命令行tftp客户端做一次完整测试# 开发机上测试 tftp 192.168.1.10 tftp put testfile.txt tftp get zImage tftp quit建议传一个稍微大一点的文件几十MB级别来验证稳定性。我第一次在WiFi下传35MB的内核压缩包传了三次两次在校验阶段失败都是丢包导致的。TFTP协议有个天然限制单块数据固定512字节超时时间默认5秒。在无线链路下如果丢包率高于1%重传会频繁触发整个传输过程会拖得很长甚至超时终止。我实测的一个实用优化是按数据包模式调整虽然TFTP协议本身规定了超时重传但客户端uboot往往没给你调节超时的选项。所以更现实的办法是能用NFS就用NFSTFTP只传小文件。如果必须传大文件优先考虑从服务端角度降低链路丢包率——换5GHz频段、靠近路由器、减少无线信道干扰比在TFTP参数上做文章有效得多。4.4 与uboot结合的启动流程如果你在uboot阶段使用TFTP需要在uboot环境变量里指定服务端IP和文件名。大致流程如下setenv serverip 192.168.1.10 setenv ipaddr 192.168.1.20 setenv bootfile zImage # 下载内核到内存 tftp 0x81000000 ${bootfile} # 下载设备树 tftp 0x82000000 ${devicetree}这里有一个经常出错的地方uboot的ipaddr、serverip必须和开发板运行内核后使用的IP保持一致否则会出现“uboot下tftp成功内核启动后网络不通”的诡异状况。WiFi环境下尤其要注意如果路由器给开发板分配的是动态IPuboot阶段的固定ipaddr和内核阶段的DHCP获得的IP可能不一致导致服务器无法回包或者NFS挂载失败。最省心的方案是前面说过的路由器上绑定开发板MAC到固定IP同时uboot里把ipaddr设成同一个固定IPserverip设为开发机IP。然后把内核bootargs改成 ip192.168.1.20::192.168.1.1:255.255.255.0::wlan0:off用静态IP而不是dhcp。这样整条链路从uboot到内核IP一致不容易出幺蛾子。5. WiFi环境下的联通性验证与稳定性加固5.1 从物理层到应用层的逐级验证很多人搭完环境挂载失败第一反应就是改NFS参数实际上问题可能出在物理链路。无线环境下必须按这个顺序排查每一步都通过再进下一步先在开发板上确认无线连接本身正常ip link show wlan0 iw dev wlan0 linkiw dev 的输出能看到当前连接的SSID和信号强度。信号强度低于-70dBm就要小心了这个阈值下丢包率会剧增NFS和TFTP都会表现得不稳定。然后验证基本连通性ping -c 5 192.168.1.10不要只看“通不通”要关注延迟分布和丢包率。如果ping的丢包率超过1%后面的NFS、TFTP都不必谈先解决链路问题。第三步验证端口可达性# 开发板侧测试NFS端口 nc -vz 192.168.1.10 2049 # 测试TFTP端口 nc -vzu 192.168.1.10 69nc测TCP端口稳一点UDP端口测试不一定准确nc的UDP模式不保证能反映服务端状态但好在TFTP服务是否启动可以通过ss命令在服务端确认两端对照即可。最后验证NFS共享列表showmount -e 192.168.1.10如果能列出共享但挂载失败问题基本锁定在挂载参数或权限而不是链路。5.2 AP隔离WiFi下最容易被忽略的拦路虎很多家用路由器默认开启“AP隔离”也叫客户端隔离、无线隔离目的是防止同一WiFi下的设备互相访问。这个功能对普通家庭上网没影响但对嵌入式调试是致命的开发板和开发机都能上网、都能ping通路由器但彼此无法通信。症状是开发板ping开发机能通因为走的是路由器转发AP隔离一般只隔离WLAN客户端之间的二层直接通信不一定隔离三层转发实际上多数家用路由的AP隔离会挡掉客户端之间的所有访问包括局域网内访问。我来说一个清晰的判断方法如果开发板和开发机都能ping通路由器但互相ping不通第一优先怀疑就是AP隔离。处理方式是登录路由器后台关闭“AP隔离”或“无线AP隔离”设置位置通常在无线设置的高级选项里。有的固件把guest network默认开启并默认启用隔离如果你连接的是访客网络大概率就是这个原因。5.3 频段选择与信号质量优化2.4GHz和5GHz在这个场景里我会毫不犹豫选5GHz。原因很直接2.4GHz频段在家庭和办公环境里干扰源太多蓝牙、微波炉、USB 3.0设备、邻居WiFi都在抢信道。实测在同一个位置2.4GHz下ping延迟的抖动范围可以达到几十毫秒5GHz则稳定在个位毫秒级。如果你的开发板支持5GHz一定切到5GHz如果不支持就得在2.4GHz下做更多链路层面的补偿比如把路由器摆放得更近、选择一个不那么拥挤的信道。另外有个WiFi省电模式的坑。很多开发板的无线网卡默认开启省电模式power save这会带来明显的延迟尖峰和偶发丢包。开发板连接WiFi后通过下面的命令关闭省电iw dev wlan0 set power_save off这条命令太实用了。我之前在某块板子上遇到过NFS随机卡死的情况查了一圈发现是无线网卡每隔几秒进入一次休眠再唤醒TCP连接没断但是传输停顿了一下NFS客户端就等超时了。关掉省电模式以后问题再没出现过。5.4 动态IP场景下的挂载自恢复即使做了静态绑定WiFi断开重连后开发板的IP可能依然会变或者网络栈在重连过程中出现短暂不可用。这时候NFS挂载会卡住或报错。如果你没有做静态绑定那么在开发板上写一个小的监控脚本是必要的#!/bin/sh while true; do ip addr show wlan0 | grep 192.168.1.10 /dev/null 21 if [ $? -ne 0 ]; then IP_CHANGED1 fi mountpoint -q /mnt/nfs if [ $? -ne 0 ] [ $IP_CHANGED -eq 1 ]; then mount -t nfs -o nolock,tcp,rsize4096,wsize4096,timeo50,retrans5,soft \ 192.168.1.10:/srv/nfs/rootfs /mnt/nfs IP_CHANGED0 fi sleep 10 done这个脚本虽然是简化版本但是思路是对的检测IP、检测挂载状态、重新挂载。实际项目里你可以把它弄成一个systemd服务。有这个脚本兜底WiFi重启、路由器重启后调试环境能自动恢复省掉很多手动操作。6. 常见故障排查与个人实操心得先把这段时间积攒下来的高频问题做成一个速查表遇到的问题基本都能在里面找到入口现象可能原因排查方案开发板和开发机互ping不通AP隔离开启 / 不在同一网段检查路由器设置、检查WiFi连接ping通但NFS挂载卡住防火墙未放行 / rpcbind未启动放行111和2049端口检查rpcinfoNFS挂载报Permission deniedexports网段不对 / 缺少no_root_squash查看服务端syslog、检查exportfsNFS挂载偶尔断开无线省电模式 / 丢包率偏高关闭power_save、换5GHz频段TFTP传小文件成功大文件失败WiFi丢包触发频繁重传换有线验证、换链路、减小文件uboot能tftp但内核启动后网络不通uboot固定IP与内核IP不一致路由器静态绑定MAC、bootargs设静态IPSELinux拦截导致挂载无反应Red Hat系默认SELinux强制setenforce 0验证后配置布尔值6.1 挂载命令卡住不动怎么快速脱身NFS挂载命令一旦卡住最常见的错误操作是按CtrlC然后重试发现还是卡。原因是NFS cliente挂载进程已经进入不可中断的等待状态D state普通信号杀不掉。我的处理方式# 先等软挂载的timeo retrans周期走完 # 如果超过2分钟还无响应强制卸载 umount -lf /mnt/nfs使用 umount -lf懒惰卸载可以强制解除挂载点然后检查链路和服务端状态确认没问题再重新挂载。加了这个惰性卸载参数之后你就不用为了恢复环境而重启整个开发板了。但注意省事不代表可以乱用频繁强制卸载容易造成文件系统缓存未落盘。调试阶段没问题生产设备上不要这么干。6.2 服务端日志怎么高效利用NFS和TFTP的很多问题只在服务端日志里有线索客户端界面只能给你一个笼统的错误码。Debian系NFS在 /var/log/syslog 或 /var/log/messages 里Red Hat系在 /var/log/messages 里。每次出现问题时第一时间查这两个日志比反复重启客户端高效太多。我之前遇到过一次开发板挂载NFS失败排查了很久没头绪最后打开服务端日志看到一行 nfsd: request from unprivileged port才知道问题出在开发板把源端口映射到了高端口而服务端配置了安全端口限制。这个错误信息在客户端完全不显示不查日志根本无从入手。还有一点很多教程不会提TFTP上传失败时在/tftpboot目录下查找同名零字节文件如果存在说明上次传输失败了但残留了空文件会影响下次传输或误判文件完整性。我的习惯是每次做TFTP传输测试前先清空一下TFTP目录里同名目标文件。6.3 TFTP传输大文件容易失败的另类解法WiFi下TFTP传大文件失败已经确认是丢包引发的重传风暴后还有一个我亲测有效的思路把要传的大文件拆成若干小段用脚本循环传。比如一个35MB的镜像拆分成每段5MBTFTP逐段传输后重新拼接split -b 5M zImage zImage_part_ for part in zImage_part_*; do tftp -p 192.168.1.10 -l $part done在开发板上再把这几个部分拼接回完整镜像。这个办法有点取巧对于“WiFi链路质量不算太差但不稳定”的环境很有效。如果链路质量已经很差拆成多段依然会失败那就不如老老实实解决信号问题。这个方法不适合日常工作流只适合应急比如你人在现场手头没有网线但内核编译好了必须马上传到板子上验证。绝大多数情况下我更建议Wireless环境里能用NFS就NFS能用串口传小文件就串口传。6.4 不同开发板的WiFi行为差异市面上的开发板WiFi模块千差万别同样是WiFi有的板子连上什么都不干就很稳定有的板子省电模式关不掉、驱动有bugNFS时不时掉线。遇到后者别死磕服务端配置先查无线驱动和固件版本。我遇到过的情况是某开发板的WiFi驱动在某种路由器上场扫描行为异常表现为每隔固定时间就掉线重连。最后通过升级内核模块才彻底解决。这个经验的意思是如果你的服务端配置、防火墙、信号质量都排查完了仍然不稳定去看无线网卡驱动是不是有已知bug。还有一个再小不过但是影响链路稳定性的点无线电源管理。很多开发板默认启用省电模式启动调试时CPU是省不了多少电的但网卡会频繁休眠。在代码里加一条 iw dev wlan0 set power_save off 的成本低于后面排查随机断连的时间成本。最后分享一个我自己的习惯我会在开发机上留一个启动脚本把NFS服务、TFTP服务、防火墙状态一次检查完输出一份清晰的报告。在WiFi调试这种多环节的场景里脚本检查比手工排查可靠得多每次改完环境配置跑一遍能节省大量时间。这套WiFi模式下的NFSTFTP环境本质上就是处理好三件事服务端正确导出、客户端选用适配无线链路的挂载参数、链路质量足够可靠。从有线转到无线千万不要以为只是换了传输介质链路特征变了参数和排查思路都要跟着变。希望这些从现场踩坑里总结出来的经验能帮你少走一些弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑