Linux之NFS

## 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
![](https://img2020.cnblogs.com/blog/1208477/202007/1208477-20200708110226772-1326417659.png)

客户端:CentOS7.4
![](https://img2020.cnblogs.com/blog/1208477/202007/1208477-20200708110237470-429484280.png)

## 服务器端

### 安装服务

“`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
“`

![](https://img2020.cnblogs.com/blog/1208477/202007/1208477-20200707172702795-491930375.png)

### 检查

确认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
“`

![](https://img2020.cnblogs.com/blog/1208477/202007/1208477-20200708105902376-568312871.png)

## 客户端

### 安装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

![](https://img2020.cnblogs.com/blog/1208477/202007/1208477-20200708102650624-1570016394.png)

### 检查共享目录

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

![](https://img2020.cnblogs.com/blog/1208477/202007/1208477-20200708095927706-479811353.png)

如果提示 “clnt_create: RPC: Program not registered”,执行`rpc.mountd` 即可

> 注意:需要把111和2049的udp端口开放才可以showmount,如果不开111和2049的UDP端口,showmount -e不通但是依然挂载,如下图。

![](https://img2020.cnblogs.com/blog/1208477/202007/1208477-20200708103818904-801613693.png)

### 挂载共享文件夹到本地目录

“`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
“`

![](https://img2020.cnblogs.com/blog/1208477/202007/1208477-20200708101043774-482614306.png)

点赞

Leave a Reply

Your email address will not be published. Required fields are marked *