一、简介
NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过网络共享资源。将NFS主机分享的目录,挂载到本地客户端当中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,在客户端端看起来,就像访问本地文件一样。
RPC,基于C/S模型。程序可以使用这个协议请求网络中另一台计算机上某程序的服务而不需知道网络细节,甚至可以请求对方的系统调用。
对于Linux而言,文件系统是在内核空间实现的,即文件系统比如ext3、ext4等是在Kernel启动时,以内核模块的身份加载运行的。
二、原理
NFS本身的服务并没有提供数据传递的协议,而是通过使用RPC(远程过程调用 Remote Procedure Call)来实现。当NFS启动后,会随机的使用一些端口,NFS就会向RPC去注册这些端口。RPC就会记录下这些端口,RPC会开启111端口。通过client端和sever端端口的连接来进行数据的传输。在启动nfs之前,首先要确保rpc服务启动。
具体过程如下:
-
本地用户要访问nfs服务器中文件,先向内核发起请求,内核处理调用nfs模块及rpc client
-
rpc client向rpc server发起连接
-
在连接之前,NFS服务除了启动nfsd本身监听的端口2049/tcp和2049/udp,还会启动其它进程(如mountd,statd,rquotad等)以完成文件共享,这些进程的端口是不固定的;是每次NFS服务启动时向RPC服务注册的,RPC服务会随机分配未使用的端口
-
完成连接,接受访问请求
-
nfs应用程序向内核发起请求
-
内核调用文件系统
然后client端通过获取的NFS端口来建立和server端的NFS连接并进行数据的传输。
以下为启动各服务的作用
rpc:远程过程调用协议,是实现本地调用远程主机实现系统调用的协议。
portmapper:负责分配rpc server的端口,并在client端请求时,负责响应目的rpc server端口返回给client端,工作在tcp与udp的111端口上。
mountd:是nfs服务的认证服务的守护进程,client在收到返回的真正端口时,就会去连接mountd,认证取得令牌。
nfsd:nfs的守护进程,负责接收到用户的调用请求后与内核发出请求并得到调用结果响应给用户,工作在tcp和udp的2049端口。
idmapd:是NFS的一个程序,用来负责远程client端创建文件后的权限问题。
quotad:用用于实现磁盘配额,当client端挂载nfs后可以限制磁盘空间的大小。
三、NFS服务搭建
# service:
# 安装 NFS 服务
rpm -qa nfs-utils rpcbind
yum install -y nfs-utils rpcbind
mkdir nfs
chmod 777 nfs
vim /etc/exports
/data/nfs *(rw,sync,no_root_squash)
# 使配置生效
sudo exportfs -r
# 查看状态
systemctl status rpcbind && systemctl status nfs
# 启动 rpcbind 和 nfs 服务
systemctl start rpcbind && systemctl start nfs
# 查看端口
rpcinfo -p localhost
# 查看服务端是否正确加载了设置的 /etc/exports 配置
showmount -e localhost
# 将 rpcbind , nfs 设置为开机自启
sudo systemctl enable rpcbind
sudo systemctl enable nfs
#################################################
# client:
# 安装 NFS 服务
rpm -qa nfs-utils rpcbind
yum install -y nfs-utils rpcbind
mkdir -p /opt/apps/faas/nfs
chmod 777 /opt/apps/faas/nfs
showmount -e ip
# 应用服务器 配置挂载,mount nfs ip:文件路径 本机文件路径
mount nfs_ip:/data/nfs /opt/apps/faas/nfs
# 开机自动挂载配置
vim /etc/fstab
nfs_ip:/data/nfs /opt/apps/faas/nfs nfs defaults 0 0