【野火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

 

posted @ 2023-05-30 20:44  FBshark  阅读(496)  评论(0编辑  收藏  举报