文章目录

  • NFS与RPC关系
  • 前提
  • 关闭防火墙和selinux
  • 安装 NFS 和 RPC
  • 测试
  • 取消挂载


NFS与RPC关系

简单点可以这么理解,RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。

NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动。每启动一个功能就会启用一些端口来传输数据,因此NFS的功能所对应的端口才没有固定,而是采用随机取用一些未被使用的小于724的端口来作为传输之用。但如此一来又造成客户端要连接服务器时的困扰,因为客户端要知道服务器端的相关端口才能够联机,

此时我们需要远程过程调用(RPC)的服务。RPC最主要的功能就是指定每个NFS功能所对应的端口号,并且回报给客户端,让客户端可以连接到正确的端口上。当服务器在启动NFS时会随机选用数个端口,并主动地向RPC注册。因此RPC可以知道每个端口对应的NFS功能。然后RPC固定使用端口111来监听客户端的请求并回报客户端正确的端口,所以可以让NFS的启动更为容易。

正因如此,启动NFS之前,要先启动RPC;否则NFS会无法向RPC注册。另外,重新启动RPC时原本注册的数据会不见,因此RPC重新启动后它管理的所有程序都需要重新启动以重新向RPC注册。

nfs rpc合并调用 rpc与nfs的关系_服务器


当客户端有NFS文件要存取请求时,它如何向服务器端要求数据?

(1)客户端会向服务器端的RPC(port 111)发出NFS文件存取功能的询问请求。
(2)服务器端找到对应的已注册的NFS daemon端口后会回报给客户端。
(3)客户端了解正确的端口后,就可以直接与NFS守护进程来联机。

由于NFS的各项功能都必须要向RPC注册,因此RPC才能了解NFS服务的各项功能的port number、PID和NFS在主机所监听的IP等,而客户端才能够通过RPC的询问找到正确对应的端口。即NFS必须要有RPC存在时才能成功地提供服务,因此NFS实际上是RPC Server的一种。

前提

部署nfs需要提前准备好2台服务器,一台做为服务端,一台做为客户端
服务端:192.168.2.245
客户端:192.168.2.248

关闭防火墙和selinux

  1. 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
  1. 关闭SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

安装 NFS 和 RPC

1. 所有主机操作

# 安装nfs与rpc
yum install -y nfs-utils rpcbind
# 查看是否安装成功
rpm -qa | grep nfs
rpm -qa | grep rpcbind
[root@k8s-nfs ~]# rpm -qa | grep nfs
libnfsidmap-0.25-19.el7.x86_64
nfs-utils-1.3.0-0.68.el7.2.x86_64
[root@k8s-nfs ~]# rpm -qa | grep rpcbind
rpcbind-0.2.0-49.el7.x86_64

2. 服务端配置操作——服务端192.168.2.245

# 创建共享存储文件夹
mkdir -p /nfs/data
#配置nfs
echo "/nfs/data *(rw,sync,no_root_squash)" >> /etc/exports  #表示所有客户端可挂载
#### 说明
# 输入以下内容,格式为:nfs共享目录 nfs客户端地址1(param1, param2,...) nfs客户端地址2(param1, param2,...)
# 如: /nfs/data 10.0.0.200/24(rw,async,no_root_squash)
# 固定网段所有IP可挂载
echo "/nfs/data 10.0.0.*(rw,sync,no_root_squash)" >> /etc/exports
# 固定网段固定IP区间可挂载
echo "/nfs/data 10.0.0.200/24(rw,sync,no_root_squash)" >> /etc/exports
# 所有客户端可挂载
echo "/nfs/data *(rw,sync,no_root_squash)" >> /etc/exports
# 1.使NFS配置生效
exportfs -r
# 2.设置开机自启动
systemctl enable rpcbind && systemctl start rpcbind
systemctl enable nfs && systemctl restart nfs
# 3.查看服务状态
systemctl status rpcbind
systemctl status nfs
# 4.服务器注册端口:111
rpcinfo -p   # 如果显示rpc 服务器注册的端口列表(端口:111),则启动成功
# 5.查看是否成功和可用的nfs地址:
[root@k8s-master1 ~]# showmount -e localhost
Export list for localhost:
/nfs/data *
# 6.看有哪些参数生效
[root@k8s-master1 ~]# cat /var/lib/nfs/etab
/nfs/data       *(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,no_root_squash,no_all_squash)

参数说明:
ro:只读设置,这样 NFS 客户端只能读、不能写(默认设置);
rw:读写设置,NFS 客户端可读写;
sync:将数据同步写入磁盘中,效率低,但可以保证数据的一致性(默认设置);
async:将数据先保存在内存缓冲区中,必要时才写入磁盘;如果服务器重新启动,这种行为可能会导致数据损坏,但效率
root_squash:当客户端用 root 用户访问该共享文件夹时,将 root 用户映射成匿名用户(默认设置);
no_root_squash:客户端的 root 用户不映射。这样客户端的 root 用户与服务端的 root 用户具有相同的访问权限,这可能会带来严重的安全影响。没有充分的理由,不应该指定此选项;
all_squash:客户端所有普通用户及所属组都映射为匿名用户及匿名用户组;「推荐设置」
no_all_squash:客户端所有普通用户及所属组不映射(默认设置);
subtree_check:如果共享,如:/usr/bin之类的子目录时,强制NFS检查父目录的权限;
no_subtree_check:即使共享 NFS 服务端的子目录时,nfs服务端也不检查其父目录的权限,这样可以提高效率(默认设置)
secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
no_wdelay:若有写操作则立即执行,当使用async时,无需此设置;
anonuid=xxx:将远程访问的所有用户主都映射为匿名用户主账户,并指定该匿名用户主为本地用户主(UID=xxx);
anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组为本地用户组(GID=xxx);

3. 客户端操作——192.168.2.248

# 1.创建挂载的文件夹
mkdir -p /data/nfs
# 2.查看挂载ip
[root@k8s-node1 nfs]# showmount -e 192.168.2.245  # 服务端IP
Export list for 192.168.2.245:
/nfs/data *


# 3.挂载
mount -t nfs 192.168.2.245:/nfs/data /data/nfs
# 其中:
# mount:表示挂载命令
# -t:表示挂载选项
# nfs:挂载的协议
# 10.0.0.200:nfs服务器的ip地址
# /nfs/data:nfs服务器的共享目录
# /data/nfs:本机客户端要挂载的目录

# 4.查看磁盘
df -h
Filesystem                Size  Used Avail Use% Mounted on
devtmpfs                  471M     0  471M   0% /dev
tmpfs                     487M     0  487M   0% /dev/shm
tmpfs                     487M  8.4M  478M   2% /run
tmpfs                     487M     0  487M   0% /sys/fs/cgroup
/dev/sda3                  78G  5.1G   73G   7% /
/dev/sda1                 297M  152M  145M  52% /boot
tmpfs                      98M   12K   98M   1% /run/user/42
tmpfs                      98M     0   98M   0% /run/user/0
192.168.2.245:/nfs/data   50G  4.2G   46G   9% /root/data/nfs
# 查看是否挂载成功,客户端执行
[root@k8s-node1 nfs]# cat /etc/fstab
#192.168.2.245:/nfs/data /data/nfs nfs defaults 1 1

测试

测试挂载:
可以进入客户端的/data/nfs目录,创建一个文件,然后去nfs服务器(服务端)查看/nfs/data目录中是否有该文件,若有则共享成功。反之在nfs服务器操作/nfs目录,查看本机客户端的目录是否共享。

#客户端:
touch a.txt
echo "11111" >>a.txt
服务端查看是否同步

#服务端
echo "222222" >>a.txt
客户端查看是否同步

数据同步说明挂载成功

取消挂载

  1. 查看挂载情况df -h
  2. nfs rpc合并调用 rpc与nfs的关系_linux_02

  3. 取消挂载:
    注意:需要在客户端执行,并且需要退出挂载路径,回到根目录下,否则就会报错umount.nfs4: /root/data/nfs: device is busy
# 方法:
cd 
umount /root/data/nfs    #/root/data/nfs 为客户端挂载目录

nfs rpc合并调用 rpc与nfs的关系_服务器_03