NFS工作原理

NFS是Network File System的缩写,即网络文件系统。客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到本地目录下。
1、由程序在NFS客户端发起存取文件的请求,客户端本地的RPC(rpcbind)服务会通过网络向NFS服务端的RPC的111端口发出文件存取功能的请求。
2、NFS服务端的RPC找到对应已注册的NFS端口,通知客户端RPC服务。
3、客户端获取正确的端口,并与NFS daemon联机存取数据。
4、存取数据成功后,返回前端访问程序,完成一次存取操作。
所以无论客户端,服务端,需要使用NFS,必须安装RPC服务。
NFS的RPC服务,在Centos5下名为portmap,Centos6/7下名称为rpcbind。

 

部署环境

Server端:192.168.21.35
Client端 :192.168.21.230

Server端软件:nfs-utils、rpcbind
Client端软件 :安装NFS文件系统模块

 

部署操作

服务端操作

1、关闭selinux

sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config
sh-4.2# reboot

 

2、卸载防火墙

sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps
sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps

  

3、配置本地源

sh-4.2# cat GuGe.repo 
[GuGe]
name=GuGe
baseurl=file:///mnt
gpgcheck=0
enable=1

 

 4、安装部署NFS

sh-4.2# yum install nfs-utils rpcbind
sh-4.2# systemctl restart rpcbind.service               # 启动rpcbind
sh-4.2# systemctl status rpcbind.service
sh-4.2# systemctl enable rpcbind
sh-4.2# ss -anpt | grep "111"
LISTEN     0      128          *:111                      *:*                   users:(("rpcbind",pid=18264,fd=4),("systemd",pid=1,fd=39))
LISTEN     0      128         :::111                     :::*                   users:(("rpcbind",pid=18264,fd=6),("systemd",pid=1,fd=41))

sh-4.2# rpcinfo -p localhost                            # 向rpc注册nfs信息
sh-4.2# systemctl start nfs.service                     # 启动nfs服务
sh-4.2# rpcinfo -p localhost                            # 查看启动nfs服务之后的rpc状态

 

 5、进程详解

sh-4.2# ps -ef|egrep "rpc|nfs"
rpc       18264      1  0 22:46 ?        00:00:00 /sbin/rpcbind -w
rpcuser   18319      1  0 22:51 ?        00:00:00 /usr/sbin/rpc.statd
root      18320      2  0 22:51 ?        00:00:00 [rpciod]
root      18332      1  0 22:51 ?        00:00:00 /usr/sbin/rpc.idmapd
root      18366      1  0 22:51 ?        00:00:00 /usr/sbin/rpc.mountd
root      18371      2  0 22:51 ?        00:00:00 [nfsd4_callbacks]
root      18377      2  0 22:51 ?        00:00:00 [nfsd]
root      18378      2  0 22:51 ?        00:00:00 [nfsd]
root      18379      2  0 22:51 ?        00:00:00 [nfsd]
root      18380      2  0 22:51 ?        00:00:00 [nfsd]
root      18381      2  0 22:51 ?        00:00:00 [nfsd]
root      18382      2  0 22:51 ?        00:00:00 [nfsd]
root      18383      2  0 22:51 ?        00:00:00 [nfsd]
root      18384      2  0 22:51 ?        00:00:00 [nfsd]
root      18402  18050  0 22:52 pts/0    00:00:00 grep -E rpc|nfs

nfsd(rpc.nfsd)主进程,主要是管理客户端能否登入服务端,登入者ID判别。
mountd(rpc.mountd)管理NFS文件系统,登入者的权限管理
rpc.lockd(非必要)用来锁定文件,用于客户端同时写入
rpc.statd(非必要)检查文件一致性
rpc.idmapd 名字映射后台进程

 

6、配置共享目录

sh-4.2# vi /etc/exports                                    # NFS服务端配置
/test    192.168.21.0/24(rw,sync)

sh-4.2# exportfs -rv                                    # 重新加载nfs配置
exporting 192.168.21.0/24:/test

sh-4.2# showmount -e localhost                            # 查看nfs服务器挂载情况
Export list for localhost:
/test 192.168.21.0/24

sh-4.2# chown -R nfsnobody.nfsnobody /test/                # 设置目录权限

exports文件配置格式:
FS共享的目录 NFS客户端地址1(参数1,参数2,...) 客户端地址2(参数1,参数2,...)

NFS客户端地址:
指定IP: 192.168.0.1
指定子网所有主机: 192.168.0.0/24
指定域名的主机: 
指定域名所有主机: *.
所有主机: *

参数:
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:将远程访问的所有用户组都映射为匿名用户组账户

 

客户端操作

sh-4.2# yum -y install nfs-*
sh-4.2# mount -t nfs 192.168.21.35:/test /test
# 这里已经关闭了防火墙及selinux
sh-4.2# vi /etc/fstab
192.168.21.35:/test /test nfs defaults 0 0

 

windows也可以挂在NFS文件

参考地址:

心若向阳,无谓悲伤!