在ARM_Linux开发过程中,要向开发板传文件,通常使用2种办法,方法一使用TFTP,方式二使用NFS,两种方式各有优缺点,可配合使用。
TFTP虽然使用简单,但在传输大文件经常出现传输中断,故大文件传输还是推荐使用NFS。NFS全称Network File System,即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源,本地NFS的客户端应用可以透明的读写位于远程NFS服务器上的文件,就想访问本地文件一样,但NFS安装配置会稍复杂。
嵌入式开发中使用NFS可以带来很多便利,我常用的功能有下面2个:
a. 在主机上交叉编译完成的ARM执行文件,不需要下载到本地就可以在开发板NFS挂载目录下直接执行,大大提高工作效率
b. 直接通过cp命令在开发板与主机间传输文件
本文使用的环境是Ubuntu 16.04 64bit
1. NFS服务端安装与配置
a. 下载安装:~$ sudo apt-get install nfs-kernel-server
b. 安装完成后,创建NFS文件夹:~$ sudo mkdir /home/nfsroot
c. 修改NFS服务器配置:~$ sudo gedit /etc/exports
在exports最后一行写入:
/home/nfsroot *(rw,sync,no_root_squash,no_subtree_check)
其中:
/home/nfsroot:NFS文件夹
*:允许所有的网段访问,也可以使用具体的IP
rw:挂载此目录的客户端对该共享目录具有可读可写权限
sync:资料同步写入内存和硬盘
no_root_squash:root用户具有对根目录的完全管理访问权限
no_subtree_check:不检查父目录的权限
d. 重启服务:
重启rpcbind服务:~$ sudo /etc/init.d/rpcbind restart
重启nfs服务:~$ sudo /etc/init.d/nfs-kernel-server restart
NFS服务端配置完成。如果出现nfs重启失败,请检查/etc/exports文件修改是否正确。
2. NFS服务端自测
a. 先在/home/nfsroot下创建一个test.txt文件供测试:
~$ sudo touch /home/nfsroot/test.txt
b. 挂载NFS文件夹至/mnt下:~$ sudo mount 127.0.0.1:/home/nfsroot /mnt ,挂载成功
c. 查看挂载文件夹确认挂载情况:~$ ls /mnt ,可在/mnt文件夹下找到test.txt文件
3. VMware网络连接方式修改
VMware安装完后后默认网络连接方式为“NAT模式”,在该模式下,外部设备无法直接访问Ubuntu系统,只能通过本地电脑通过VMware虚拟网卡访问。
a. 在VMware Workstation上“虚拟机”->“设置”页面“硬件”->“网络适配器”修改网络连接方式“NAT模式”为“桥接模式”
b. 在VMware Workstation上“编辑”->“虚拟网络编辑器”页面点击“更改设置”按钮,否则没有VMnet0。
c. 修改VMnet0类型为“桥接模式”,并将“桥接到”选择为当前已联网的网卡。
以上操作需要在Ubuntu 关机情况下操作!
4. NFS客户端安装配置
NFS客户端在Ubuntu上使用~$ sudo apt-get install nfs-common 安装。ARM开发板则需要重新编译更新内核。
安装完成后输入~$ cat /proc/filesystems查看NFS客户端安装成功,有存在nodev nfsd一栏,就表示NFS客户端已经安装成功。
Ubuntu
ARM开发板
5. NFS客户端挂载
在命令行输入~$ sudo mount -t nfs 192.168.1.106:/home/nfsroot /mnt即可完成挂载
其中:
-t vfstype 指定文件系统的类型,可以不指定,mount会自动旋转正确的类型。
但在ARM开发板上操作失败,
~ # mount -t nfs 192.168.1.106:/home/nfsroot /mnt/nfsroot/
svc: failed to register lockdv1 RPC service (errno 111).
lockd_up: makesock failed, error=-111
mount: mounting 192.168.1.106:/home/nfsroot on /mnt/nfsroot/ failed: Connection refused
但在Ubuntu下可以正常挂载成功,在ARM开发板上却失败。这说明NFS Server应该是正常的,问题是在NFS客户端。
经分析可能的问题是:
Nfs mount默认选项包括文件锁,依赖于portmap提供的动态端口分配功能;
解决方法:
Kill 文件锁或添加-o nolock选项
~ # mount -o nolock -t nfs 192.168.1.106:/home/nfsroot /mnt/nfsroot/ 挂载成功!
6. ARM开发板开机自动挂载
修改/etc/init.d/rcS文件,添加开机自动挂载功能