NFS是Network File System的缩写，即网络文件系统。客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到本地目录下。nfs为什么需要RPC?因为NFS支持的功能很多，不同功能会使用不同程序来启动，因此，NFS对应的功能所对应的端口无法固定。端口不固定造成客户端与服务端之间的通信障碍，所以需要RPC来从中帮忙。NFS启动时会随机取用若干端口，然后主动向RPC服务注册取用相关端口和功能信息，RPC使用固定端口111来监听来自NFS客户端的请求，并将正确的NFS服务端口信息返回给客户端，这样客户端与服务端就可以进行数据传输了。NFS的工作流程[scode type="share"]1、由程序在NFS客户端发起存取文件的请求，客户端本地的RPC(rpcbind)服务会通过网络向NFS服务端的RPC的111端口发出文件存取功能的请求。2、NFS服务端的RPC找到对应已注册的NFS端口，通知客户端RPC服务。3、客户端获取正确的端口，并与NFS daemon联机存取数据。4、存取数据成功后，返回前端访问程序，完成一次存取操作。[/scode]所以无论客户端，服务端，需要使用NFS，必须安装RPC服务。NFS的RPC服务。Centos5下名为portmap,Centos6下名称为rpcbind。NFS服务安装配置nfs-utils、rpcbind查看是否安装NFS> rpm -qa nfs-utils rpcbind > yum install nfs-utils rpcbind启动rpcbind服务查看服务状态> systemctl status rpcbind.service如果不知道rpcbind命令在哪> which rpcbind启动rpc服务> systemctl restart rpcbind.service查看rpc> lsof -i :111 > netstat -lntup|grep rpcbind如果出现-bash未找到命令可执行下面命令> yum install net-tools lsof查看nfs服务向rpc注册的端口信息> rpcinfo -p localhost检查rpcbind是否开机启动> chkconfig --list rpcbind启动NFS服务> systemctl start nfs.service查看状态> systemctl status nfs.service再次查看rpc注册的端口信息> rpcinfo -p localhostNFS常见进程详解> ps -ef|egrep "rpc|nfs"root 19101 2 0 14:13 ? 00:00:00 [rpciod] rpc 21231 1 0 14:52 ? 00:00:00 /sbin/rpcbind -w rpcuser 21371 1 0 14:52 ? 00:00:00 /usr/sbin/rpc.statd root 21394 1 0 14:52 ? 00:00:00 /usr/sbin/rpc.idmapd root 21395 1 0 14:52 ? 00:00:00 /usr/sbin/rpc.mountd root 21405 2 0 14:52 ? 00:00:00 [nfsd4_callbacks] root 21411 2 0 14:52 ? 00:00:00 [nfsd] root 21412 2 0 14:52 ? 00:00:00 [nfsd] root 21413 2 0 14:52 ? 00:00:00 [nfsd] root 21414 2 0 14:52 ? 00:00:00 [nfsd] root 21415 2 0 14:52 ? 00:00:00 [nfsd] root 21416 2 0 14:52 ? 00:00:00 [nfsd] root 21417 2 0 14:52 ? 00:00:00 [nfsd] root 21418 2 0 14:52 ? 00:00:00 [nfsd] root 24279 18106 0 15:49 pts/1 00:00:00 grep -E --color=auto rpc|nfsnfsd(rpc.nfsd)主进程，主要是管理客户端能否登入服务端，登入者ID判别。mountd(rpc.mountd)管理NFS文件系统，登入者的权限管理rpc.lockd(非必要)用来锁定文件，用于客户端同时写入rpc.statd(非必要)检查文件一致性rpc.idmapd 名字映射后台进程配置NFS开机自启动> chkconfig rpcbind on > chkconfig nfs on > chkconfig --list rpcbind > chkconfig --list nfsNFS服务端配置> vi /etc/exportsexports文件配置格式:NFS共享的目录 NFS客户端地址1(参数1,参数2,...) 客户端地址2(参数1,参数2,...)说明：NFS共享目录、要用绝对路径：NFS服务配置（客户端链接信息配置）、注意客户端也要安装rpcbind和nfs-utils安装包。Mac OS默认自带。（原因：mount不带有挂载远程的能力。showmount 命令也是通过安装nft-utils包获得）。exports文件配置中的—客户端地址参数选项指定IP: 192.168.0.1 指定子网所有主机: 192.168.0.0/24 指定域名的主机: test.com 指定域名所有主机: *.test.com 所有主机: *参数：ro：目录只读 rw：目录读写 sync：将数据同步写入内存缓冲区与磁盘中，效率低，但可以保证数据的一致性 async：将数据先保存在内存缓冲区中，必要时才写入磁盘 all_squash：将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody) no_all_squash：与all_squash取反(默认设置) root_squash：将root用户及所属组都映射为匿名用户或用户组(默认设置) no_root_squash：与rootsquash取反 anonuid=xxx：将远程访问的所有用户都映射为匿名用户，并指定该用户为本地用户(UID=xxx) anongid=xxx：将远程访问的所有用户组都映射为匿名用户组账户例如：/nfsfile *(rw,sync,root_squash,insecure)编写配置文件echo "/nfsfile *(rw,sync,root_squash,insecure)">>/etc/exports创建需要共享的目录> mkdir /nfsfiles > chown nfsnobody.nfsnobody /nfsfiles或者给chmod -R 777 /nfsfile/重新加载nfs配置> exportfs -rv查看nfs服务器挂载情况> showmount -e localhost客户端挂载测试一定要注意客户端也要安装nfs否则用客户端命令会报错mount: wrong fs type, bad option, bad superblock on 125.64.41.244:/data/img, missing codepage or helper program, or other error (for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program) In some cases useful info is found in syslog - try dmesg | tail or so 根据错误提示，查看/sbin/mount.<type>文件，果然发现没有/sbin/mount.nfs的文件，安装nfs-utils即可–一定要注意。。。。。showmount -e 47.105.179.215我是Mac系统如果出现：showmount: Cannot retrieve info from host: 47.105.179.215: RPC failed:: RPC: Unable to send; errno = Bad file descriptor 。基本是服务器端口没开放 （或者防火墙屏蔽）、rpcbind的默认端口是111。但是我的阿里云服务器里面有安全组，只开发111端口也不行。最后我删除了安全组的入站规则后。可以了。sudo mount 47.105.179.215:/nfsfile /Users/qidong/nfsDatamount_nfs: can’t mount /nfsfile from 47.105.179.215 onto /Users/qidong/nfsData: Operation not permitted如果出现了上面的错误。在mount 上加上参数或者/nfsfile *(rw,sync,root_squash)加上 insecure 这个参数 /nfsfile *(rw,sync,root_squash,insecure)sudo mount -o resvport 47.105.179.215:/nfsfile /Users/qidong/nfsData查看挂载：df -h卸载挂载：umount /Users/qidong/nfsData