NFS部署实战及原理介绍

NFS(Network File System)的缩写,它的主要功能是:通过网络、让不同的机器、不同的OS可以共享彼此的文件

NFS服务器可以允许NFS客户端将远端NFS服务器的共享目录挂载到自己的NFS客户端,这样客户端就好比有在本地有一块磁盘一样,只不过是网络磁盘而已。

挂载结构图

NFS部署实战及原理介绍

如上图,当我们在NFS服务器设置好一个共享目录/data/share后,其他的有权限访问NFS服务器的NFS客户端就可以讲这个目录挂载到自己的本地,并且能看到服务端/data/share下的所有数据

NFS是通过网络来进行Server端和Client端之间的数据传输,既然走网络,双方肯定都要有端口,哪NFS Server怎么知道使用哪个端口来进行数据传输,NFS其实会随机选择端口来进行数据传输。那NFS客户端又是如何知道NFS服务端到底是使用哪个端口呢?其实NFS服务器是通过远程过程调用RPC(Remote Procedure Call)协议来实现的,所以,RPC管理服务端的NFS端口分配,客户端要传数据,那么客户端的RPC会先跟服务端的RPC去要服务器的端口,要到端口后,再建立连接,然后传输数据,见下图

NFS客户端/NFS服务端、RPC关系图

NFS部署实战及原理介绍

通信过程:

1.首先服务器端启动RPC服务,并开启111端口

2.服务器端启动NFS服务,并向RPC注册端口信息

3.客户端启动RPC服务,向服务端的RPC服务请求服务端的NFS端口

4.服务端的RPC服务反馈NFS端口信息给客户端。

5.客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。

机器清单

主机名

 

IP地址

 

操作系统版本

 

备注

 

node100

 

172.20.20.100

 

CentOS 7.6 x64

 

NFS服务端

 

node200

 

172.20.20.200

     

NFS客户端

 

实验环境

CentOS:CentOS Linux release 7.6.1810 (Core)

2台都操作

配置主机名:

# cat >> /etc/hosts << EOF

172.20.20.100 node100

172.20.20.200 node200

EOF

 

 

NFS服务端操作

# rpm -qa nfs-utils rpcbind

# yum install nfs-utils rpcbind

建立目录

# mkdir  -p /data/share

# chmod 666 /data/share/

# cat >> /etc/exports << EOF

/data/share 172.20.20.0/24(rw,sync,insecure,no_subtree_check,no_root_squash)

EOF

# mkdir -p /data/share/soft/

启动RPC服务

# systemctl start rpcbind.service

[root@node100 ~]# ps -ef|grep rpcbind

rpc       15712      1  0 03:41 ?        00:00:00 /sbin/rpcbind -w

root      15714   8035  0 03:41 pts/0    00:00:00 grep --color=auto rpcbind

[root@node100 ~]# rpcinfo  -p localhost

program vers proto   port  service

100000    4   tcp    111  portmapper

100000    3   tcp    111  portmapper

100000    2   tcp    111  portmapper

100000    4   udp    111  portmapper

100000    3   udp    111  portmapper

100000    2   udp    111  portmapper

启动NFS服务

# service nfs start

[root@node100 ~]# rpcinfo  -p localhost

program vers proto   port  service

100000    4   tcp    111  portmapper

100000    3   tcp    111  portmapper

100000    2   tcp    111  portmapper

100000    4   udp    111  portmapper

100000    3   udp    111  portmapper

100000    2   udp    111  portmapper

100024    1   udp  40044  status

100024    1   tcp  34946  status

100005    1   udp  20048  mountd

100005    1   tcp  20048  mountd

100005    2   udp  20048  mountd

100005    2   tcp  20048  mountd

100005    3   udp  20048  mountd

100005    3   tcp  20048  mountd

100003    3   tcp   2049  nfs

100003    4   tcp   2049  nfs

100227    3   tcp   2049  nfs_acl

100003    3   udp   2049  nfs

100003    4   udp   2049  nfs

100227    3   udp   2049  nfs_acl

100021    1   udp  37957  nlockmgr

100021    3   udp  37957  nlockmgr

100021    4   udp  37957  nlockmgr

100021    1   tcp  43494  nlockmgr

100021    3   tcp  43494  nlockmgr

100021    4   tcp  43494  nlockmgr

是否加载配置/etc/exports

[root@node100 ~]# showmount  -e localhost

Export list for localhost:

/data/share 172.20.20.0/24

在NFS客户端安装

# yum install nfs-utils

[root@node200 ~]# showmount  -e 172.20.20.100

Export list for 172.20.20.100:

/data/share 172.20.20.0/24

在NFS客户端进行测试

# mkdir /root/soft/

# mount 172.20.20.100:/data/share/soft /root/soft

[root@node200 soft]# df -Th

Filesystem                     Type      Size  Used Avail Use% Mounted on

/dev/sda3                      xfs        36G  1.1G   35G   4% /

devtmpfs                       devtmpfs  224M     0  224M   0% /dev

tmpfs                          tmpfs     235M     0  235M   0% /dev/shm

tmpfs                          tmpfs     235M  5.6M  229M   3% /run

tmpfs                          tmpfs     235M     0  235M   0% /sys/fs/cgroup

/dev/sda1                      xfs       897M  127M  771M  15% /boot

tmpfs                          tmpfs      47M     0   47M   0% /run/user/0

172.20.20.100:/data/share/soft nfs4       36G  1.1G   35G   4% /root/soft

遇到的问题

[root@node200 ~]# showmount  -e  172.20.20.100

clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)

因为iptables没有添加规则所致,解决方法:

一是关闭防火墙,这样不×××全。另一个可以向iptables中添加nfs的所有端口

这里使用第一种方法:

systemctl stop firewalld.service

service iptables stop

相关参数说明:

参数

 

说明

 

ro

 

只读访问

 

rw

 

读写访问

 

sync

 

所有数据在请求时写入共享

 

async

 

nfs 在写入数据前可以响应请求

 

secure

 

nfs 通过 1024 以下的安全 TCP/IP 端口发送

 

insecure

 

nfs 通过 1024 以上的端口发送

 

wdelay

 

如果多个用户要写入 nfs 目录,则归组写入(默认)

 

no_wdelay

 

如果多个用户要写入 nfs 目录,则立即写入,当使用 async 时,无需此设置

 

hide

 

在 nfs 共享目录中不共享其子目录

 

no_hide

 

共享 nfs 目录的子目录

 

subtree_check

 

如果共享 /usr/bin 之类的子目录时,强制 nfs 检查父目录的权限(默认)

 

no_subtree_check

 

不检查父目录权限

 

all_squash

 

共享文件的 UID 和 GID 映射匿名用户 anonymous,适合公用目录

 

no_all_squash

 

保留共享文件的 UID 和 GID(默认)

 

root_squash

 

root 用户的所有请求映射成如 anonymous 用户一样的权限(默认)

 

no_root_squash

 

root 用户具有根目录的完全管理访问权限

 

anonuid=xxx

 

指定 nfs 服务器 /etc/passwd 文件中匿名用户的 UID

 

anongid=xxx

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/c5e01f9ee13a9cb89dd2792815a150ef.html