前言:
最近在学习正点原子嵌入式Linux开发板uboot的移植实验,移植完之后想测试网络部分的驱动能否工作正常。最后经过测试发现tftp可以正常下载,nfs却一直报错无法下载文件,最后也是折磨了两天才解决了问题,特写下此博客进行记录、总结。
项目场景:
我的轻薄本没有网口,事先买了一个刷过固件可以连校园网的路由器。准备好路由器之后,校园网通过一根网线接路由器的wan口,剩余两个lan口,一个接到正点原子alpha开发板的ENET2、笔记本电脑连路由器的WiFi、ubuntu改为桥接静态ip,使得三者在同一网段内(windows、ubuntu、uboot(不是linux内核))
ubuntu | 192.168.10.218 | uboot | 192.168.10.220 | windows | 192.168.10.46 |
具体实物图:

然后测试了一下测试三者是否能互相ping通(只有windows和ubuntu无法ping通uboot,其余四种情况都可以正常ping通),ubuntu和windows无法ping通uboot好像是uboot没有解析ping命令,但是这个不影响后面的实验。下面是三者互相ping的截图
uboot ping ubuntu和windows
ubuntu ping windows
windows ping ubuntu
根据教程,一开始想使用nfs服务但行不通,但使用tftp服务可以正常下载、nfs没调通这个问题就没有过多理会。直到学习根文件系统测试时,根文件系统都是通过nfs进行挂载,我一开始还是想取巧避开nfs用tftp进行挂载,但是我看了看linux内核文件好像只支持nfs、没有看到tftp的字眼,而且后面的教程都是用nfs,所以就躲不掉了,只能先调通nfs才能继续往下走。
nfs服务下载失败
nfs cannot mount错误
tftp服务可以正常下载

?
解决方案:
因为我能通过tftp服务进行下载,说明我的网络拓扑应该是没有什么问题的,问题应该就在nfs服务这部分。这期间我看了正点原子常见错误的总结、还有一些大佬们的博客、咨询某宝技术客服最后才得以解决,大家可以按顺序针对下面的情况进行设置和排查。
1、关闭杀毒软件(火绒等)、关闭windows的防火墙、ubuntu的也关闭。(嫌麻烦ubuntu的我就直接卸载了)


2、uboot使用的nfs版本是version2,而ubuntu16以上默认是version3或者version4,通过sudo cat /proc/fs/nfsd/versions可以查看当前ubuntu支持的nfs版本。我用的ubuntu版本是20.04,为了兼容要修改 /etc/default/nfs-kernel-server配置文件,通过sudo vim /etc/default/nfs-kernel-server进入文件进行修改。
nfs 不支持version2

修改之后重启nfs服务(sudo service nfs-kernel-server restart)看是否能成功下载,如果还是不行继续往下看。
3、出现cannot mount或者编译一段时间后出现TTT错误,可以查看一下/etc/hosts、/etc/exports这两个配置文件
sudo vim /etc/exports????????????????sudo vim /etc/hosts
/etc/hosts 要添加的内容
/etc/exports添加的内容分为三部分
1:nfs服务共享目录绝对路径
2:*代表所有的ip都可访问
???????如果只限定一个ip只需将*改为192.168.10.220(要和ubuntu在同一网段)
???????如果要使用同一网段只需将*改为192.168.10.*
3:(rw,sync,no_root_squash)为nfs服务的一些命令参数

?
修改完exports后记得重新声明一下 sudo exportfs? -ar、重启一下nfs服务。
我看完很多人的博客到这步基本上都弄好了,nfs可以成功下载文件了,但是我的还是不行。
4:设置完上述内容后打印nfs的version还是出现-2,我用netstat看一下nfs对应端口,发现没有udp只有tcp
netstat -a | grep "nfs"

设置一下这个文件/etc/nfs.conf
sudo vim /etc/nfs.conf

注意重新启动nfs服务?sudo service nfs-kernel-server restart?重新执行netstat,出现了udp

用sudo cat /proc/fs/nfsd/versions可以发现出现了+2,即支持nfs服务的version2,接下来要做的就是验证一下

在uboot中执行命令nfs 80800000 192.168.10.218:/home/lpme/linux/nfs/zImage发现可以成功下载

其中一些T可能是网络问题,我们看一下dram里面的内容和zImage(用winhex打开)里的内容是否相同
md.b 80800000 2000

?
?进行比较两者是相同的,即nfs服务可以正常使用了。
总结:
非常感谢你能看到这里,希望这篇文章能帮你解决问题。
|