## NFS
Network File System(NFS),即网络文件系统,是由[SUN](https://baike.baidu.com/item/SUN/69463)公司研制的[UNIX](https://baike.baidu.com/item/UNIX/219943)[表示层](https://baike.baidu.com/item/表示层/4329716)协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。
## RPC
When an RPC service is started, it tells **rpcbind** the address at which it is listening, and the RPC program numbers it is prepared to serve. When a client wishes to make an RPC call to a given program number, it first contacts **rpcbind** on the server machine to determine the address where RPC requests should be sent.
> RPC服务在nfs共享时负责通知客户端,服务器的nfs端口号。简单理解rpc就是一个中介服务。
## 服务器环境
“`bash
cat /etc/redhat-release
“`
服务器:CentOS7.8

客户端:CentOS7.4

## 服务器端
### 安装服务
“`bash
yum install -y nfs-utils
“`
安装 NFS 服务器所需的软件包
### 增加共享目录
“`bash
vi /etc/exports
“`
> /dbbackup 222.222.221.0/24(rw,sync,fsid=0)
rw表示可读写;sync表示同步写,fsid=0表示将/data找个目录包装成根目录。
“`bash
chmod 777 /dbbackup #不要忘记赋予权限,不然执行不了
“`
其他参数说明
“`html
ro:共享目录只读
rw:共享目录可读可写
all_squash:所有访问用户都映射为匿名用户或用户组
no_all_squash(默认):访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组
root_squash(默认):将来访的root用户映射为匿名用户或用户组
no_root_squash:来访的root用户保持root帐号权限
secure(默认):限制客户端只能从小于1024的tcp/ip端口连接服务器
insecure:允许客户端从大于1024的tcp/ip端口连接服务器
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性
async:将数据先保存在内存缓冲区中,必要时才写入磁盘
wdelay(默认):检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率
no_wdelay:若有写操作则立即执行,应与sync配合使用
subtree_check :若输出目录是一个子目录,则nfs服务器将检查其父目录的权限
no_subtree_check(默认) :即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率
“`
### 启动
rpcbind和nfs设为开机启动:(必须先启动rpcbind服务)
“`bash
systemctl enable rpcbind.service
systemctl enable nfs-server.service
“`
然后分别启动rpcbind和nfs服务
“`bash
systemctl start rpcbind.service
systemctl start nfs-server.service
“`

### 检查
确认NFS服务器启动成功
“`bash
rpcinfo -p #确认NFS服务器启动成功及端口情况
exportfs -r #使配置生效
exportfs #查看已共享目录
exportfs -v #查看已共享目录 -详细
“`
### 开启服务端口
修改服务端口
“`bash
vi /etc/sysconfig/nfs #修改nfs端口
“`
> MOUNTD_PORT=”4002″
> STATD_PORT=”4003″
> LOCKD_TCPPORT=”4004″
> LOCKD_UDPPORT=”4004″
开放端口
“`bash
#添加rpcinfo -p下的端口,除了上面配置的4002、4003、4004外,还有111和2049这两个端口的tcp和udp端口也要开放。
firewall-cmd –zone=public –add-port=111/tcp –permanent
firewall-cmd –zone=public –add-port=2049/tcp –permanent
firewall-cmd –zone=public –add-port=111/udp –permanent
firewall-cmd –zone=public –add-port=2049/udp –permanent
firewall-cmd –zone=public –add-port=4002/tcp –permanent
firewall-cmd –zone=public –add-port=4003/tcp –permanent
firewall-cmd –zone=public –add-port=4004/tcp –permanent
#重新载入
firewall-cmd –reload
#查看所有打开的端口
firewall-cmd –zone=public –list-ports
## 重启两个服务
systemctl restart rpcbind.service
systemctl restart nfs-server.service
“`

## 客户端
### 安装NFS
“`bash
#安装nfs,但客户端只启动rpcbind就可以了
yum install -y nfs-utils
#开机启动rpcbind
systemctl enable rpcbind.service
#启动rpcbind服务
systemctl start rpcbind.service
“`
注意:客户端不需要启动nfs服务,只需要启动rpcbind即可。
### 检查服务器端端口
“`bash
rpcinfo -p 222.222.221.189 #服务器端ip
“`
如果服务器开启,显示的结果和服务器端执行的rpcinfo -p结果一致。若服务器端没有开启端口,会提示
> rpcinfo: can’t contact portmapper: RPC: Remote system error – No route to host

### 检查共享目录
“`bash
#检查 NFS 服务器端是否有目录共享:
showmount -e nfs服务器的IP
“`

如果提示 “clnt_create: RPC: Program not registered”,执行`rpc.mountd` 即可
> 注意:需要把111和2049的udp端口开放才可以showmount,如果不开111和2049的UDP端口,showmount -e不通但是依然挂载,如下图。

### 挂载共享文件夹到本地目录
“`bash
mkdir /nfs #新建挂载点目录
mount -t nfs 222.222.221.189:/dbbackup /nfs #挂载222.222.221.189:/dbbackup共享目录到本地的/nfs
“`
### **开启自动挂载**
“`bash
vi /etc/rc.local #编辑自启配置文件,在文件最后加mount -t nfs 222.222.221.189:/dbbackup /nfs
chmod 755 /etc/rc.local #赋予自启权限
“`
这时操作客户端188的/nfs文件夹即挂载了189服务端的/dbbackup文件夹。
### 取消挂载
“`bash
umount /nfs #取消挂载
“`
当出现umount.nfs: /nfs: device is busy时
“`bash
fuser -m -v /nfs #查看占用/nfs的进程
kill -9 PID #杀死进程ID
“`
