linux--嵌入式网络文件系统(NFS)搭建原理

2019-07-13 01:56发布

嵌入式网络文件系统(NFS)搭建原理

一. 网络文件系统简介

1.1.What is NFS ?         NFS就是Network FileSystem的缩写,是由Sun公司发展出来的。其目的是让linux 机器之间彼此分享文档。NFS可以让服务器端共享的目录挂载到本地客户机上,对于本地客户机器来说,远程服务器上的目录就好像自己的一部分。 1.2 whatis NFS, In embedded development engineer ‘s eyes?        它的功能是把NFS服务器(即Linux主机)的某个目录挂载到开发板的文件系统上。这样,开发板就可以执行该目录中的可执行程序。这样做的优点在于:不用将程序写入开发板的Flash,减少了对Flash的损害,同时也方便调试 在嵌入式系统开发中主要用于NFS网络根文件系统启动或者网络加载调试应用程序。 1.3  NFS工作原理         NFS是基于客户/服务器模式的。NFS服务器是输出一组文件的计算机,而NFS客户端是访问文件的计算机。客户和服务器端通过远程过程调用通信,当客户主机上的应用程序访问远程文件时,客户主机内核向远程NFS服务器发送一个请求,等待服务器响应,而NFS服务器一直处于等待状态,如果接收到客户请求,就处理请求并将结果返回给客户机。NFS服务器上的目录如果可以被远程用户访问,就称为”导出(export)”;客户主机访问服务器导出目录的过程称为“安装(mount)”,或者称为“挂载”,“导入”等。 特点: (1)Linux主机之间的共享 (2)开发板和开发主机之间的共享 (3)服务器可以是虚拟机,也可是是独立的Linux服务器 (4)在服务器上建立多个账户,多人共享,节省资源 (5)可以有独立的个人目录,安全可靠。

二.NFS server端的设定

NFS服务器的配置包括四个主要的步骤: (1)安装NFS软件包、rpcbind (2)在/etc/exprots文件中配置NFS服务器上要导出的文件系统或目录。 (3)启动NFS服务。 (4)导出/etc/exports中配置的文件系统或目录。 2.1 安装NFS (1)在ubuntu下安装NFS可以通过如下命令: #sudo  apt-get  install nfs-kernel-server #sudo  apt-get  install rpcbind (2)NFS的启动和停止是通过/etc/init.d目录中的脚本文件nfs-kernel-server实现的。 (3)在命令行重启NFS的命令为/etc/init.d/nfs-kernel-server  restart note: 在启动NFS服务器之前,先要启动rpcbind #/etc/init.d/rpcbind restart 2.2  配置NFS服务器 (1)配置NFS主要涉及配置文件/etc/exports,它用于NFS服务器端,其中列出了NFS服务器中要导出的目录、可以访问这些目录的NFS客户机及其访问权限。 (2) /etc/exports文件的格式如下: [cpp] view plaincopy
  1. dir_to_export  NFS_client (permissions)  [NFS_client (permissions)…]  
实例: #vim  /etc/exports [cpp] view plaincopy
  1. /tmp       192.168.100.0/24(ro)  localhost(rw)  *(ro,sync)  
  2. [分享目录]  [第一个客户端(权限)]    [可用主机名]     [可用通配符]  
       该实例表示将将/tmp 分别分享给三个不同的主机或网域。        格式中的输出目录和客户端之间,客户端与客户端之间都使用空格分隔,但是客户端和权限参数之间不能有空格。当若权限参数不止一个时,则以逗号(,) 分开。 输出目录:dir_to_export是要导出的文件系统或目录名称,也就是要共享给客户端使用的目录。该目录必须是一个绝对路径。 客户端:NFS_client是可以访问该NFS服务器的客户机名称。客户机的指定非常灵活,可以是单个主机的IP地址或域名,也可以是某个子网或域中主机等。 选项:该设置主要是权限(permissions),这是NFS客户机访问导出目录的访问权限,它的可选值为ro(只读)或rw(读写)。 note: 关于以上参数的详细解释,附件一:exportfs中各元素的详细说明。 2.3exportfs维护NFS服务的输出目录列表 (1)当修改了/etc/exprots文件的内容后,不需要重新启动NFS服务,而直接使用命令exportfs就可以使设置其立即生效。 (2)exportfs命令就是用来维护NFS服务的输出目录列表的,命令格式如下: exportfs  [options] -a :全部挂载(或卸载)/etc/exports文件中的所设置的所有目录 -r:重新挂载/etc/exports文件中的设置,并使设置立即生效,而不需要重新启动NFS服务。 -u:卸载某一目录 -v:在export的时候,将分享的目录显示到屏幕上。 (3)当修改了/etc/exports文件中的内容后,在命令执行如下命令使其配置立即生效: # exportfs  -rv (4)全部卸载共享目录时,可以使用如下命令: #exportfs -au

三.NFS客户端的设定

       NFS服务器通过/etc/expors共享,并用exportfs发布。目录共享之后,可以用命令shownmount来显示共享目录。 NFS客户端配置需要以下几个步骤: (1)编译内核时,选择NFS选项。 (2)使用showmount扫描NFS服务器分享的目录有哪些,并了解我们是否可以使用。 (3)在客户端建立预计要挂载的挂载点目录。 (4)利用mount将远程主机直接挂载到相关目录。 (5)查看挂载情况 3.1  NFS客户端的安装(在内核中支持NFS的配置in) 要在目标板上运行nfs,必须编译内核,使得其支持NFS [cpp] view plaincopy
  1. File systems   
  2.        netwok file systems  
  3.                 <*>nfs file system support  
  4.                 <*>provide nfsv3 client support  
  5.                 <*>nfs server support  
3.2 showmount查看NFS服务器信息       在客户端,要查看NFS服务器上有哪些共享目录,可以使用showmount命令。 (1)showmount的命令格式如下: showmount  [-ade] [hostname] -a:列出所有远程加载 -d:列出被远程加载的目录 -e:列出所有共享的文件系统 (2)例如:如果NFS服务器的IP地址为192.168.1.101,可以使用如下命令查看: #showmount  -e192.168.1.101 3.3连接NFS服务器(mount)        在利用showmount命令得知远程NFS服务器上的共享资源后,接下来就是进行实际的挂载操作。 (1)挂载NFS服务器上的输出目录的命令格式如下: [cpp] view plaincopy
  1. mount -t nfs NFS_server_name :exported-directory  mount_point  
-t nfs:指定文件系统类型。 NFS_server_name:是NFS服务器名称; exported_directory:是要共享的目录; mount_point:是在本机的安装位置。 (2)实例:     例如NFS客户端把远程文件系统tiger上导出的/share1目录安装在自己的文件系统/mnt/nfs目录下,以实现共享。 #mount  tiger:/share1  /mnt/nfs (3)将共享目录挂接进来后,只要键入/mnt/nfs就等于进入了远程主机tiger上的/share1目录中了。 3.4 检查是否加载成功 (1)df可以显示目前系统的盘符,包括挂载的NFS目录。 (2)另外也可以直接查看挂载之后的目录,即可以知道挂载是否成功。 3.5 NFS 文件系统的卸载 使用umount命令 umount /home/think/test 卸载前需要退出当前挂载的目录,否则提示: the device is busy 3.6 NFS开机自动挂载 开机就挂载的挂载点与相关参数是写入 /etc/fstab 中的,那 NFS 能不能写入 /etc/fstab 当中呢?不可以!!!分析一下开机的流程,我们可以发现网络的启动是在本机挂载之后,因此当你利用 /etc/fstab 尝试挂载 NFS 时,系统由于尚未启动网络,所以肯定是无法挂载成功的啦!不过,我们可以将其就写入到 /etc/rc.d/rc.local 即可! #vim /etc/rc.d/rc.local         开机就挂载的挂载点与相关参数是写入 /etc/fstab 中的,那 NFS 能不能写入 /etc/fstab 当中呢?不可以!!!分析一下开机的流程,我们可以发现网络的启动是在本机挂载之后,因此当你利用 /etc/fstab 尝试挂载 NFS 时,系统由于尚未启动网络,所以肯定是无法挂载成功的啦!不过,我们可以将其就写入到 /etc/rc.d/rc.local 即可! #vim /etc/rc.d/rc.local [cpp] view plaincopy
  1. mout  -t  nfs  192.168.1.100:/home/think//EmbeddedWork  /mnt -o nolock  

四. Execption

4.1 开发板和主机的网络不通       连接后若网络端了,则出现 nfs:server 192.168.0.12 not responding ,still trying 4.2连接超时 portmap: server localhost not responding, timed out 解决办法: #mount -t nfs -o nolock node1:/public /public 即增加-o nolock参数,原因: Unfsd doesn't support NLMlocking, and it's causing the lockd daemon to be started (which again requiresthe portmapper to be installed。 4.3 访问受限 access denied by server while mounting        可能的原因就是防火墙的问题或者是在配置文件中设置的那个IP段范围设置错了或者设置小了,如果修改之后还没有好的话,那就直接使用一个“*”代替之前的 那个整个IP号,虽然不是很安全,但是一定能解决办法。 4.5 服务器或客户端某些服务未启动 1mount: xxxxx failed: System Error:Connection refused 解决方法: 如果使用ping却发现网路与服务器都是好的,那么就是rpcbind没有开启。启动方法: # /etc/init.d/rpcbind restart. 2mout: xxxxx  failed:RPCError:Program not  registered.         重新启动了rpcbind服务后,没有重启启动NFS服务。 解决方法: # /etc/init.d/rpcbind restart. #/etc/init.d/nfs  restart.

五.实例

5.1.嵌入式系统的典型设置 (1)嵌入式系统服务器端设定 由于嵌入式系统都是自己的电脑跟开发板相连来开发,对访问IP及权限等都没有太大的安全考虑,所以设置较为简单,一般使用如下的配置: [cpp] view plaincopy
  1. /home/think/EmbeddedWork  *(rw,sync,no_root_squash)  
表示任意客户端都可以挂载服务器/home/think/EmbeddedWork目录。这样就不会因为IP设置问题使得开发板不能访问主机,具备可读写的权限,对于开发板上登陆的root用户,其拥有和主机root一样的权限。 (2)客户端(开发板)使用如下mount命令进行挂载 #mount -t nfs 192.168.1.100:/home/think//EmbeddedWork  /mnt -o nolock

附件一:exportfs中各元素的详细说明

1.客户端常用的指定方式 : [cpp] view plaincopy
  1. 客户端                               说明  
  2. 192.168.16.20                          指定IP地址的主机  
  3. 192.168.16.0/24(或192.168.16.*)       指定子网中的所有主机  
  4. pc1.gdvcp.net                          指定域名的主机  
  5. *.gdvcp.net                            指定域中的所有主机  
  6. *(或缺省)                          所有主机  
2.选项用来设置输出目录的访问权限,用户映射等,在/etc/exports文件中选项,比较多一般可以分成3类 (1)访问权限选项: 用于控制输出目录访问权限的选项 [cpp] view plaincopy
  1. 访问权限选项        说明  
  2. ro               设置输出目录只读  
  3. rw               设置输出目录可读写  
(2)用户映射选项: [cpp] view plaincopy
  1. 用户映射选项     说明  
  2. all_squash           不论登入 NFS 的使用者身份为何,他的身份都会被压缩成为匿名使用者,通常也就是nobody  
  3. no_all_squash        不将远程访问的所有普通用户及所属用户组都映射为匿名用户或用户组(默认设置)  
  4. root_squash          将root用户及所属用户组都映射为匿名用户或用户组(默认设置)  
  5. no_root_squash     不将root用户及所属用户组都映射为匿名用户或用户组  
  6. anonuid=xxx          将远程访问的所有用户都映射为匿名用户,并指定该匿名用户账户为本地用户账户(UID=xxx)  
  7. anongid=xxx          将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx)  
(3)常用的其他选项 其他选项比较多,可用于对输出目录进行更全面的控制 [cpp] view plaincopy
  1. 其他选项          说明  
  2. secure                    限制客户端只能从小于1024的TCP/IP端口连接NFS服务器(默认设置)  
  3. insecure                 允许客户端从大于1024的TCP/IP端口连接NFS服务器  
  4. sync                      将数据同步写入内存缓冲区与磁盘中,虽然这样做效率较低,但可以保证数据的一致性  
  5. async                    将数据先保存在内存缓冲区中,必要时才写入磁盘。  
  6. wdelay                    检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可提高效率(默认设置)  
  7. no_wdelay                 若有写操作则立即执行,应与sync配合使用  
  8. subtree_check             若输出目录是一个子目录,则NFS服务器将检查其父目录的权限(默认设置)  
  9. no_subtree_check          即使输出目录是一个子目录,NFS服务器也不检查其父目录的权限,这样做可提高效率  
转载:http://blog.csdn.net/tigerjibo/article/details/9748561