使用NFS进行网络文件挂载

由于最近在学习Linux系统和使用ZYNQ开发板进行摄像头数据采集的相关开发,用到了挂载的问题,一开始是使用TF卡进行挂载文件的,利用TF卡进行文件拷贝,然后放在开发板上进行挂载运行,速度还是相当快的,但是就是数据的拷贝比较麻烦,对于小的文件系统比较实用,但是大的文件系统就无能为力了,尤其是运行一个程序要使用相关的库文件调用起来很麻烦,所以使用网络挂载,在Linux系统中建立一个专门的文件夹进行目录共享,然后将所需要的目录放在里面,将其一块挂载到开发板的Linux中的一个文件夹,这样操作起来就方便快捷,就是对网络要求比较高。

下面简单介绍NFS以及他的用法。

NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。

     NFS 的基本原则是“允许不同的客户端及服务端通过一组RPC分享相同的文件系统”,它是独立于操作系统,允许不同硬件及操作系统的系统共同进行文件的分享。

 NFS 文件系统的原理: 通过网络将 PCubuntuLinuxNFSserver 上的文件,mount 到开发板上,使得开发板操作这些远端文件,就像是
操作使用本地文件一样。简单一点说,就是在 PCubuntuLinuxserver 的 NFS 文件夹下,编译一个 Linuxapp 如 hello.c->hello,在开发板
上也能看的见 hello 文件,并且执行这个文件。这样我们在编写驱动的时候就不需要老是插拔 SD 卡了。


NFS的安装和配置:

sudo apt-get install portmap#这个客户端和服务器都需要,是网络传输协议。
sudo apt-get install nfs-kernel-server#在服务器上安装nfs,客户端不需要。

sudo apt-get install nfs-kernel-common #客户端要安装这个包


服务器端的配置:
输入命令"sudovim/etc/exports", 用 vim 打开 exports 文件。(当然也可以用其他的编辑命令,vi,gedit 等)

在该文件的末尾加上共享的文件位置,以及一些对文件的访问属性;

如:/home/nfs_server 192.168.11.*(rw,sync,no_root_squash)

其中/home/nfs_server表示要共享的目录 192.168.11.*表示要共享的网段地址,也就是说要共享的开发板一定要着这个网段下,也可以直接用*,这表示对所有网段共享,括号后面的是文件的访问属性

  • all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
  • no_all_squash:与all_squash取反(默认设置);
  • root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);
  • no_root_squash:与rootsquash取反;
  • anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
  • anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);

其它选项

  • secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
  • insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
  • sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
  • async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
  • wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
  • no_wdelay:若有写操作则立即执行,应与sync配合使用;
  • subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
  • no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;

配置好之后保存启动服务器:
  /etc/init.d/nfs-kernel-server start

 输入"showmount-e"命令可以查看 nfsserver 路径

开发板 nfs server 同步 :
保证开发板可以上网,然后进行文件挂载,如:
mount -t nfs 192.168.1.27:/home/nfs_server/mnt " 意思是将共享目录挂载到开发板的/mnt目录中,192.168.1.27表示的是共享主机的ip。
如此就可以在开发板的mnt目录下进行文件的相关操作啦。

 在使用网络挂载的时候,常会由于各种原因,遇到这个问题: nfs:server is not responding,still trying.
首先检测自己的网络是不是能够ping 通,其次确定是不是服务器端的nfs没有启动,然后看看是不是主机的ip地址发生了变化,如果是的话就改成变化后的地址挂载。
如果以上都没问题,仍然有这个问题的话,那很可能就是网络挂载的目录比较大,加载的时候需要时间,可以在挂载的时候加一些限制:如
mount -t nfs -o intr,nolock,rsize=1024,wsize=1024  192.168.1.27:/home/nfs_server/mnt
这样做的话可以指定传输速率(也就是限定传输时一次读写的数据的大小)

当然, 由于传送的数据太大,出现数据包丢失现象。NFS 的默认传输协议是 UDP,而PC机与嵌入式系统通过UPD交互时就会出现严重的网卡丢包现象。在客户端改用TCP协议,使用下面的命令:
mount -t nfs-o tcp noblock 192.168.1.27:/home/nfs_server/mnt

  简单写到这里,本人新手,如有纰漏,还望指正。




猜你喜欢

转载自blog.csdn.net/snow_rain_1314/article/details/75205734