【野火Linux移植篇】4-linux 内核移植-网络问题(tftp/nfs)不成功问题解决
参考的文章:
1. 【野火i.MX6ULL Pro开发板移植】 https://blog.csdn.net/suolong123/article/details/110824146
2. 【nfs 问题解决】https://blog.csdn.net/weixin_56646002/article/details/127388021
0. 重温网络烧录办法
①-tftp方式:
尝试用tftp加载内核和设备树文件,并启动。
tftp 80800000 zImage tftp 83000000 imx6ull-alientek-emmc.dtb bootz 80800000 - 83000000
②-nfs方式:
nfs 80800000 192.168.1.12:/home/complex/linuxnfs/zImage nfs 83000000 192.168.1.12:/home/complex/linuxnfs/imx6ull-14x14-evk.dtb bootz 80800000 - 83000000
1- uboot 可以ping通,但 tftp 传输不成功
我的uboot可以ping通,但是使用 tftp 传输的时候一直显示 T T T...
探索①.尝试重启tftp服务器----》尝试了,不成功
此时有可能是在配置主机的网段信息等以后没有重启tftp服务器。
可以使用service tftpd-hpa restart 命令进行重启尝试。
这部分问题解决摘录自:https://bbs.csdn.net/topics/399174291
解决重启命令出现错误问题-----》尝试了,仍然不成功
但是使用service tftpd-hpa restart 之后仍然出现了错误:
root@whost:~# service tftpd-hpa start
Job for tftpd-hpa.service failed because the control process exited with error code. See "systemctl status tftpd-hpa.service" and "journalctl -xe" for details.
解决办法:将 /etc/default/tftpd-hpa 中服务器ip更新为ifconfig中的ip,
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot/images" #下位机的下载目录
TFTP_ADDRESS="192.168.1.156:69" #服务器地址:端口,修改为ifconfig中的ip
TFTP_OPTIONS="--secure"
再次 service tftpd-hpa restart 成功启动tftp。
这部分问题解决摘录自:https://blog.csdn.net/u013976532/article/details/108147023
探索②. 开启 firewalld 防火墙允许通过 tftp 服务
之前不知道在哪里安装了 firewalld 这个防火墙,总之糊糊涂涂用上了,并且处于开启状态。
因此我猜想可能是防火墙拦截了 tftp 请求,因此我尝试让防火墙允许通过 tftp 服务。
首先查看 firewalld 运行状态: firewall-cmd --state
确认返回 running 后,使用命令 firewall-cmd --list-all ,查看到firewall 当前的状态列表。
或者通过 firewall-cmd --list-services 查看当前通过的服务
确认没有通过 tftp 服务后,通过命令 firewall-cmd --add-service=tftp 允许通过tftp 服务。
然后,重启fiewalld firewall-cmd --reload 。
最终 tftp 传输成功了。
2- uboot 可以ping通,但 nfs 传输不成功
如果你NFS加载根文件系统不成功,首先可以先在uboot中进行测试:试试在U-Boot中手动输入nfs 80800000 192.168.31.128:/home/mars/Linux/nfs/zImage,看看能否加载,
nfs 80800000 192.168.1.12:/home/complex/linuxnfs/zImage
nfs 83000000 192.168.1.12:/home/complex/linuxnfs/imx6ull-14x14-evk.dtb
bootz 80800000 - 83000000
然后排除网线接错问题、IP设置问题、服务器IP设置问题后,依然提示“ERROR: File lookup fail”的错误,那多半是NFS版本问题没走。
这是因为uboot中使用的NFS版本是V2,而ubuntu的NFS版本为V3或V4及以上版本,导致uboot不能在NFS服务器中找到文件, 所以需要修改ubuntu中NFS的兼容。
在Ubuntu下,找到/etc/default/nfs-kernel-server文件,修改成下面的内容:
1 # Number of servers to start up 2 3 #RPCNFSDCOUNT=8 4 5 RPCNFSDCOUNT="-V 2 8" 6 7 # Runtime priority of server (see nice(1)) 8 9 RPCNFSDPRIORITY=0 10 11 12 13 # Options for rpc.mountd. 14 15 # If you have a port-based firewall, you might want to set up 16 17 # a fixed port here using the --port option. For more information, 18 19 # see rpc.mountd(8) or http://wiki.debian.org/SecuringNFS 20 21 # To disable NFSv4 on the server, specify '--no-nfs-version 4' here 22 23 #RPCMOUNTDOPTS="--manage-gids" 24 25 RPCMOUNTDOPTS="-V 2 --manage-gids" 26 27 # Do you want to start the svcgssd daemon? It is only required for Kerberos 28 29 # exports. Valid alternatives are "yes" and "no"; the default is "no". 30 31 NEED_SVCGSSD="" 32 33 34 35 # Options for rpc.svcgssd. 36 37 RPCSVCGSSDOPTS="--nfs-version 2,3,4 --debug --syslog"
然后重启NFS服务
sudo /etc/init.d/nfs-kernel-server restart
到这时候,很多人的问题解决了;如果还不行,那么修改一下这个文件/etc/nfs.conf 下面两行代码。
sudo vim /etc/nfs.conf
这时候重新测试一下 nfs 功能,应该就成功了。
3. 移植需要修改的 uboot 驱动的文件位置
- 修改配置文件:arch/arm/configs 中的imx_v7_defconfig
- 修改设备树:arch/arm/boot/dts 中的imx6ull-开头的文件(首要文件是:imx6ull-14x14-evk.dts)
emmc驱动:
文件位置:arch/arm/boot/dts/imx6ull-embedfire-emmc.dts
LCD驱动:
文件位置:arch/arm/boot/dts/imx6ull-embedfire-emmc.dts
- 修改 Makefile:arch/arm/boot/dts/Makefile
附: nfs简介与简单配置
NFS 是 Network FileSystem 的缩写,顾名思义就是网络文件存储系统,它最早是由 Sun 公司发展出来的,也是 FreeBSD 支持的文件系统中的一个,它允许网络中的计算机之间通过 TCP/IP 网络共享资源。通过 NFS,我们本地 NFS 的客户端应用可以透明地读写位于服务端 NFS 服务器上的文件,就像访问本地文件一样方便。简单的理解,NFS 就是可以透过网络,让不同的主机、不同的操作系统可以共享存储的服务。
NFS 在文件传送或信息传送过程中依赖于 RPC(Remote Procedure Call) 协议,即远程过程调用, NFS 的各项功能都必须要向 RPC 来注册,如此一来 RPC 才能了解 NFS 这个服务的各项功能 Port、PID、NFS 在服务器所监听的 IP 等,而客户端才能够透过 RPC 的询问找到正确对应的端口,所以,NFS 必须要有 RPC 存在时才能成功的提供服务,简单的理解二者关系:NFS是 一个文件存储系统,而 RPC 是负责信息的传输。即:NFS 服务需要依赖 RPC 服务。
安装nfs服务:
sudo apt-get install nfs-kernel-server rpcbind
关键的命令:
1. 配置文件夹及读写选项:
1 $ vim /etc/exports
2 /data/share 10.222.77.0/24(rw,sync,insecure,no_subtree_check,no_root_squash)
说明一下,这里配置后边有很多参数,每个参数有不同的含义,具体可以参考下边。此处,我配置了将 /data/share 文件目录设置为允许 IP 为该10.222.77.0/24 区间的客户端挂载,当然,如果客户端 IP 不在该区间也想要挂载的话,可以设置 IP 区间更大或者设置为 * 即允许所有客户端挂载,例如:/home *(ro,sync,insecure,no_root_squash)设置 /home目录允许所有客户端只读挂载。
2. 启动RPC服务
$ service rpcbind start
# 或者使用如下命令亦可
$ /bin/systemctl start rpcbind.service
# 查看 NFS 服务项 rpc 服务器注册的端口列表
$ rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
3. 启动nfs服务
# 启动 NFS 服务
$ service nfs start
# 或者使用如下命令亦可
/bin/systemctl start nfs.service
#重启 NFS 服务
sudo /etc/init.d/nfs-kernel-server restart
4. 检查nfs的共享文件配置:
$ showmount -e localhost
Export list for localhost:
/data/share 10.222.77.0/24