NFS文件共享
一、NFS文件共享服务器概念:
NFS是network file sytem的缩写,他最大的特点就是可以通过网络,让不同的机器,不同的系统实现文件共享。NFS客户端可以将NFS服务器共享的目录挂载在本地的文件系统中,访问目录就如同访问自己本地目录一样。
1、进一步理解NFS服务器:
NFS并不是单独存在的,而是由NFS-server,RPC,PORTMAP这三个模块组成。
NFS-server只负责将数据通过以文件系统的方式共享出去,并进行登录管理和权限管理,并不负责数据的传输,而数据的传输则有RPC来完成。
NFS客户端要想访问NFS服务器,就必须要知道对方的ip和端口,但是NFS服务除了启动nfsd本身监听的端口2049/tcp和2049/udp,还会启动其它进程(如statd,rquotad等)以完成文件共享,这些进程的端口是由PORTMAP随机分配的(每次NFS服务启动时向RPC服务注册,RPC服务会通知PORTMAP分配剩余可用的端口)。所以NFS客户端是很难直接与NFS服务器通信的。
不难想出,NFS的工作流程是,NFS客户端rpc服务就会通过网络向NFS服务端的rpc服务的111端口发出NFS文件存取功能的询问请求,RPC服务获得请求,然后将NFS服务的各个进程端口号返给客户端的rpc请求,客户端的rpc再拿着这些进程端口与服务端的rpc通信,进行数据传输。
2、RPC知识拓展:
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
二、NFS工作原理:

1. 首先NFS服务器端开启rpcbind;
2. 然后服务端开启NFS服务,这时NFS的各项功能都需要向RPC服务注册,这时rpc会通知portmap模块将可用的端口分配给statd,rquotad等;
3. 然后NFS客户端RPC服务就会通过网络向NFS服务端的RPC服务的111端口发出NFS文件存取功能的询问请求。
4. NFS服务端的RPC服务找到对应的已注册的NFSdaemon端口后,通知NFS客户端的RPC服务。
5. 此时NFS客户端就可获取到nfs服务端各个进程的正确端口,然后通过客户端rpc就直接与NFS服务器的rpc进行存取数据了(rpc知道了nfs的具体端口,就可以实现远程调用,即传输)。
三、NFS安装部署:
服务器和客户端都关闭防火墙,装好nfs服务组件
systemctl stop firewalld && systemctl disable firewalld yum ‐y intall nfs‐utils
配置服务端:
1、编辑/etc/exports文件
/data/jfedu 192.168.0.0/24(rw,sync)
2、导出(广播)编辑的文件,并重启rpc和nfs服务
exportfs‐rsystemctlrestart rpcbindsystemctlrestart nfs
配置客户端:
1、可用showmount搜索网络中可用的共享文件
showmount ‐e 192.168.0.187
2、创建目录,用于挂载
mkdir /mnt/nfs
3、挂载
mount ‐t nfs 192.168.0.187:/data/jfedu /mnt/nfs #推荐使用: mount ‐t nfs ‐o soft,timeo=1192.168.75.128:/data/jfedu /mnt/nfs soft:软挂载,遇到报错会终止挂载,并返回信息,默认是硬挂载,一直尝试挂载。 timeo: 超时时间,如果不设置,一直链接,设置为1,为0.3秒
4、挂载完成之后,进入目录,可能会发现无法对目录中的文件进行修改。这主要是因为客户端访问服务器时,身份被压缩成nobody,相对服务器文件系统来说,就是其他用户。所以要想编辑,需要在服务端对文件授权或者更改exports文件,设置no_root_squash(不压缩客户端root身份)。
服务端的/etc/exports文件详解:
[root@localhost ~]# exportfs ‐v /data/jfedu 192.168.0.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash) 其中: rw:可读可写 ro:仅可读 sync:是指数据同步写入内存和磁盘 root_squash:如果客户端用root身份访问,则被压缩成nobody,权限也将受到限制。no_root_squash:也就是不压缩,客户端使用root身份登录,全有所有权限,很危险。all_squash:不管访问者是什么身份,包括root,全部压缩至匿名用户。 no_all_squash:保留访问用户的身份uid以及gid,一般只能查看,不能修改,权限问题,但是可以强制保存。 secure:nfs通过1024以下的安全TCP/IP端口发送
异常报错:
卸载时报错:
umount.nfs4:/mnt/jfedu: device is busy umount ‐l /mnt/jfedu 强行解除挂载
或者使用
fuser ‐m /mnt/data 将会显示使用这个模块的pid fuser ‐mk /mnt/data 将会直接kill那个pid