NFS概述
NFS是Network File System的缩写,即网络文件系统。它的主要功能是通过局域网让不同的主机系统之间可以共享文件或者目录,实现多台服务器之间数据的一致性。它和我们Windows下的网络共享和网络驱动器类似,只不过它用于局域网的环境下。而NFS多应用于企业集群架构中,作为所有前端web服务的共享存储。如果是大型的网站,可能会用到更复杂的方式,比如Moosefs、glusterfs等。
NFS通过网络进行数据传输,传输端口为2049,由于文件系统非常复杂,因此NFS还要依赖其它程序去启动额外的端口(小于1024)传输数据,将端口告知给客户端依赖于RPC(remote procedure call)协议。当NFS服务启动时,会随机选取数个端口,并向RPC注册,因此RPC就可以知道每个端口对应的 NFS功能,以便客户端连接正确的端口号。
NFS实现原理
首先服务器启动rpc服务开启111端口,当用户进程访问NFS客户端,客户端使用相应的函数对数据进行处理,再通过TCP/IP的方式传递给NFS服务器,当服务端收到请求后,会先调用portmap进程进行端口映射反馈给客户端,客户端再通过获取的端口和服务端建立连接并进行数据的传输。
服务部署
实验环境:
NFS服务端:172.16.1.51/24
NFS客户端:172.16.1.41/24
服务端:
1.安装服务软件包
[root@nfs ~]# yum install -y nfs-utils rpcbind
2.配置服务文件
[root@nfs ~]# vim /etc/exports
[root@nfs ~]# cat /etc/exports
#可以指定主机、网段或域名
/data 172.16.1.0/24(rw,sync,all_squash,anonuid678,anongid678)
参数详解:
参数 | 说明 |
---|---|
rw | 可读写 |
ro | 只读 |
root_squash | 当NFS客户端以root管理员访问时,映射为NFS服务端的匿名用户 |
no_root_squash | 当NFS客户端以root管理员访问时,映射为NFS服务端的root管理员 |
all_squash | 无论NFS客户端使用什么账户访问,映射为NFS服务端的匿名用户 |
sync | 同时将数据写入内存和磁盘,保证数据不丢失 |
async | 优先将数据保存到内存再写入磁盘;效率到,但数据可能会丢失 |
anonuid | 配置all_squash使用,指定NFS的用户UID,必须存在系统 |
anongid | 配置all_squash使用,指定NFS的用户GID,必须存在系统 |
4.修改共享目录所属主、组
[root@nfs ~]# useradd -u 678 -g 678 www
[root@nfs ~]# groupadd -u 678 -g 678 www
[root@nfs ~]# mkdir /data
[root@nfs ~]# chown -R nfsnobody:nfsnobody /data/
5.启动服务
[root@nfs ~]# systemctl start rpcbind
[root@nfs ~]# systemctl start nfs
==注意:==在启动NFS之前要先启动RPC,否则NFS就无法向RPC进行注册。另外如果RPC重新启动,原来注册的数据就会消失。所以,在重启RPC之后,它所管理的服务都要重启以重新向RPC注册。
客户端:
1.安装服务软件包
[root@localhost ~]# yum install -y nfs-utils rpcbind
2.查看服务端是否生效
[root@localhost ~]# showmount -e 172.16.1.51
Export list for 172.16.1.51:
/data 172.16.1.0/24 //可以查看到信息说明已生效.
3.挂载
[root@localhost ~]# mkdir /nfs
[root@localhost ~]# mount 172.16.1.51:/data /nfs
4.启动服务,客户端只需启动rpcbind
[root@localhost ~]# systemctl start rpcbind
nfs既然是通过网络和服务端建立通信实现挂载到本地,那如果网络中断了怎么办?强制卸载并设置永久挂载
umount -lf /nfs
[root@localhost nfs]# echo "172.16.1.51:/data /nfs nfs defaults,netdev 0 0" >>/etc/fstab