NFS
是Network File System
的缩写,即网络文件系统。客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到本地目录下。
nfs为什么需要RPC?
因为NFS支持的功能很多,不同功能会使用不同程序来启动,因此,NFS对应的功能所对应的端口无法固定。
端口不固定造成客户端与服务端之间的通信障碍,所以需要RPC来从中帮忙。
NFS启动时会随机取用若干端口,然后主动向RPC服务注册取用相关端口和功能信息,RPC使用固定端口111来监听来自NFS客户端的请求,
并将正确的NFS服务端口信息返回给客户端,这样客户端与服务端就可以进行数据传输了。
NFS的工作流程
1、由程序在NFS客户端发起存取文件的请求,客户端本地的RPC(rpcbind)服务会通过网络向NFS服务端的RPC的111端口发出文件存取功能的请求。
2、NFS服务端的RPC找到对应已注册的NFS端口,通知客户端RPC服务。
3、客户端获取正确的端口,并与NFS daemon联机存取数据。
4、存取数据成功后,返回前端访问程序,完成一次存取操作。
所以无论客户端,服务端,需要使用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 localhost
NFS常见进程详解
> 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|nfs
- nfsd(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 nfs
NFS服务端配置
> vi /etc/exports
exports文件配置格式:
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/nfsData
mount_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