本文使用环境:
内核版本:Linux 5.4.31
硬件平台:armv7 / stm32mp157
编译环境:Ubuntu Linux 18.04.4 LTS / gcc version 8.4.0 (Buildroot 2020.02.3-00002-gee623e2fe0-dirty)
1. 问题现象
在使用百问网的stm32mp157
开发板(下文简称目标机
)挂载NFS
(网络文件系统)时,挂载超时。挂载目录为Ubuntu
虚拟机的/home/ryan/nfs_rootfs/
目录,该目录在/etc/exports
文件中配置。
Ubuntu
虚拟机使用NAT
方式连接以太网,映射端口为2049
和9999
PC
机(下文简称宿主机
)ip
地址为192.168.3.2
,挂载命令为mount -t nfs -o nolock,vers=3,port=2049,mountport=9999 192.168.3.2:/home/ryan/nfs_rootfs/ /mnt
执行结果:
[root@100ask:~]# mount -t nfs -o nolock,vers=3,port=2049,mountport=9999 192.168.3.2:/home/ryan/nfs_rootfs/ /mnt
mount: mounting 192.168.3.2:/home/ryan/nfs_rootfs/ on /mnt failed: Connection timed out
2. 问题分析
在目标机
上执行ping
命令观察是否正常收到宿主机的icmp
报文响应
[root@100ask:~]# ping 192.168.3.2
PING 192.168.3.2 (192.168.3.2) 56(84) bytes of data.
64 bytes from 192.168.3.2: icmp_seq=1 ttl=64 time=0.791 ms
64 bytes from 192.168.3.2: icmp_seq=2 ttl=64 time=0.790 ms
64 bytes from 192.168.3.2: icmp_seq=3 ttl=64 time=0.726 ms
64 bytes from 192.168.3.2: icmp_seq=4 ttl=64 time=0.743 ms
64 bytes from 192.168.3.2: icmp_seq=5 ttl=64 time=0.716 ms
64 bytes from 192.168.3.2: icmp_seq=6 ttl=64 time=0.811 ms
64 bytes from 192.168.3.2: icmp_seq=7 ttl=64 time=0.805 ms
^C
--- 192.168.3.2 ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6157ms
rtt min/avg/max/mdev = 0.716/0.768/0.811/0.036 ms
执行ping 192.168.3.2
命令结果显示,目标机
和宿主机
正常通信,无丢包现象。
为便于报文分析,使用wireShark
工具进行报文捕获,打开wireShark
工具,双击选择宿主机
通信网卡连接,这里用的是以太网
连接
正常打开后即可看到wireShark
工具捕获到的各种协议报文数据,这里只关心目标机
相关的报文,在过滤器
中输入过滤条件ip.addr==192.168.3.28
并回车(192.168.3.28
为目标机当前的ip
地址),此时目标机执行挂载命令mount -t nfs -o nolock,vers=3,port=2049,mountport=9999 192.168.3.2:/home/ryan/nfs_rootfs/ /mnt
,可以看到wireShark
捕获界面显示如下
编号为42
的数据包,为第1次从ip
为192.168.3.28
的机器发送给ip
为192.168.3.2
的TCP
消息,此后编号为47
、55
、69
、112
的数据包都是重发的消息包,初步可以断定是宿主机没有应答导致的目标机数据重传,而宿主机没有应答的原因可能是Windows
的防火墙阻隔了这条数据报。
3. 解决办法
经过以上分析,将Windows
防火墙关闭,再次执行挂载命令mount -t nfs -o nolock,vers=3,port=2049,mountport=9999 192.168.3.2:/home/ryan/nfs_rootfs/ /mnt
结果正常挂载NFS。
但将Windows
防火墙完全关闭毕竟不是稳妥的做法,另一种选择是给Windows
防火墙添加入站规则,满足这条规则时防火墙才放行。打开Windows
防火墙,添加入站规则,指定本地端口为2049
和9999
。
设置方法:
4. 解决情况
按以上方法设置完成后,目标机能够正常挂载NFS
,wireShark
也没有再捕获到重传的数据报
目标机
执行ls /mnt
命令
[root@100ask:~]# ls /mnt
drv_code usb
服务器挂载路径下显示:
目标机
访问到的目录内容与设置的挂载目录
匹配,目标机
挂载NFS
网络超时的问题得到解决。
5. 总结
计算机相互之间能ping
通仅表明icmp协议
报文数据能正常通信,并不能表示其他协议的连通性,在遇到执行ping操作正常
,而通信异常
时,可以将计算机防火墙
纳入可能影响的因素。