1. 问题现象
2. 问题分析
3. 解决办法
4. 解决情况
5. 总结
本文使用环境: 内核版本:Linux 5.4.31 硬件平台:armv7 / stm32mp157 编译环境:Ubuntu Linux 18.04.4 LTS / gcc version 8.4.0 (Buildroot 2020.02.3-00002-gee623e2fe0-dirty)
在使用百问网的<code>stm32mp157</code>开发板(下文简称<code>目标机</code>)挂载<code>NFS</code>(网络文件系统)时,挂载超时。挂载目录为<code>Ubuntu</code>虚拟机的<code>/home/ryan/nfs_rootfs/</code>目录,该目录在<code>/etc/exports</code>文件中配置。

<code>Ubuntu</code>虚拟机使用<code>NAT</code>方式连接以太网,映射端口为<code>2049</code>和<code>9999</code>
<code>PC</code>机(下文简称<code>宿主机</code>)<code>ip</code>地址为<code>192.168.3.2</code>,挂载命令为<code>mount -t nfs -o nolock,vers=3,port=2049,mountport=9999 192.168.3.2:/home/ryan/nfs_rootfs/ /mnt</code>
执行结果:
在<code>目标机</code>上执行<code>ping</code>命令观察是否正常收到宿主机的<code>icmp</code>报文响应
执行<code>ping 192.168.3.2</code>命令结果显示,<code>目标机</code>和<code>宿主机</code>正常通信,无丢包现象。
为便于报文分析,使用<code>wireShark</code>工具进行报文捕获,打开<code>wireShark</code>工具,双击选择<code>宿主机</code>通信网卡连接,这里用的是<code>以太网</code>连接
正常打开后即可看到<code>wireShark</code>工具捕获到的各种协议报文数据,这里只关心<code>目标机</code>相关的报文,在<code>过滤器</code>中输入过滤条件<code>ip.addr==192.168.3.28</code>并回车(<code>192.168.3.28</code>为目标机当前的<code>ip</code>地址),此时目标机执行挂载命令<code>mount -t nfs -o nolock,vers=3,port=2049,mountport=9999 192.168.3.2:/home/ryan/nfs_rootfs/ /mnt</code>,可以看到<code>wireShark</code>捕获界面显示如下
编号为<code>42</code>的数据包,为第1次从<code>ip</code>为<code>192.168.3.28</code>的机器发送给<code>ip</code>为<code>192.168.3.2</code>的<code>TCP</code>消息,此后编号为<code>47</code>、<code>55</code>、<code>69</code>、<code>112</code>的数据包都是重发的消息包,初步可以断定是宿主机没有应答导致的目标机数据重传,而宿主机没有应答的原因可能是<code>Windows</code>的防火墙阻隔了这条数据报。
经过以上分析,将<code>Windows</code>防火墙关闭,再次执行挂载命令<code>mount -t nfs -o nolock,vers=3,port=2049,mountport=9999 192.168.3.2:/home/ryan/nfs_rootfs/ /mnt</code>结果正常挂载NFS。
但将<code>Windows</code>防火墙完全关闭毕竟不是稳妥的做法,另一种选择是给<code>Windows</code>防火墙添加入站规则,满足这条规则时防火墙才放行。打开<code>Windows</code>防火墙,添加入站规则,指定本地端口为<code>2049</code>和<code>9999</code>。
设置方法:
按以上方法设置完成后,目标机能够正常挂载<code>NFS</code>,<code>wireShark</code>也没有再捕获到重传的数据报
<code>目标机</code>执行<code>ls /mnt</code>命令
服务器挂载路径下显示:
<code>目标机</code>访问到的目录内容与设置的<code>挂载目录</code>匹配,<code>目标机</code>挂载<code>NFS</code>网络超时的问题得到解决。
计算机相互之间能<code>ping</code>通仅表明<code>icmp协议</code>报文数据能正常通信,并不能表示其他协议的连通性,在遇到执行<code>ping操作正常</code>,而<code>通信异常</code>时,可以将<code>计算机防火墙</code>纳入可能影响的因素。