13.1-13.5 预习笔记

1.NFS介绍

1) NFS= network file system

是一种网络的文件系统,需要借助网络实现数据的同步,它最大的功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案 (share files)。这个 NFS 服务器可以让你的 PC 来将网络远程的 NFS 服务器分享的目录,挂载到本地端的机器当中, 在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分区槽一样 (partition)

NFS一般用来存储共享视频,图片等静态数据。

 

NFS是基于RPC (remote procedure call)协议的

 

注:RPC(远程过程调用)是什么 https://blog.****.net/bwh0520/article/details/80148405

 

简单的说,RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。

RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯)

RPC 是一个请求响应模型。客户端发起请求,服务器返回响应(类似于Http的工作方式)

RPC 在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。

 

2)NFS&RPC

NFS是通过网络来进行服务端和客户端之间的数据传输。两者之间要传输数据就要有想对应的网络端口来进行传输。NFS服务器到底使用什么网络端口来传输数据的,NFS服务器端其实是随机选择端口来进行数据传输。那NFS客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?其实NFS服务器时通过远程过程调用(remote procedure call 简称RPC)协议/服务来实现的。也就是说RPC服务会统一管理NFS的端口,客户端和服务端通过RPC来先沟通NFS使用了哪些端口,之后再利用这些端口(小于1024)来进行数据的传输。

pc(portmap)就是用来统一管理NFS端口的服务,并且统一对外的端口是111。NFS服务端需要先启动rpc,再启动NFS,这样NFS才能够到RPC去注册端口信息。客户端的RPC可以通过向服务端的RPC请求获取服务端的NFS端口信息。当获取到了NFS端口信息后,就会以实际端口进行数据的传输。(由于NFS端口为随机的。)

《RPC和NFS如何通讯》

 

因为NFS有很多功能,不同的功能需要使用不同的端口。因此NFS无法固定端口。而RPC会记录NFS端口的信息,这样我们就能够通过RPC实现服务端和客户端的RPC来沟通端口信息。

那RPC和NFS之间又是如何之间相互通讯的?

首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口。RPC就会记录下这些端口。并且RPC会开机111端口,等待客户端RPC的请求,如果客户端有请求,那服务端的RPC就会将记录的NFS端口信息告知客户端。

 

3)NFS的工作原理

13.1-13.5 预习笔记

 

 

  • 服务端要启动NFS服务,但是在启动NFS之前要启动RPC通信(Centos5之前的版本是通过portmap来实现,而CentOS6之后则为rpcbind)

  • 服务端的NFS向RPC注册端口信息

  • 客户端启动RPC(portmap/rpcbind)服务,向服务端的RPC服务请求NFS的端口

  • 服务端的RPC向客户端返回服务端的NFS端口

  • 通过网络连接TCP/IP客户端和服务端的NFS端口进行数据传输

 

 

2.NFS服务端安装配置

首先有两台机器ip地址分别为192.168.224.128和198.162.224.130

我们把192.168.224.128作为服务端,198.162.224.130作为客户端

 

  • yum install -y nfs-utils rpcbind

  • 安装好后,编辑配置文件vim /etc/exports,加入下面的内容

/home/nfstestdir  这个目录就是要指定分享的目录

192.168.224.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000) , 这条是用来定义要给哪个机器共享目录,前面的ip address可以为一个ip段

  • mkdir /home/nfstestdir

  • chomd 777 /home/nfstestdir

  • systemctl start rpcbind

  • systemctl start nfs

  • systemctl enable rpcbind

  • systemctl enable nfs

 

13.1-13.5 预习笔记

 

 

3. NFS配置选项&客户端挂载

1)上面我们在配置服务器的时候,编辑了/etc/exports,写入了192.168.224.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)

下面就详细讲一下括号里面配置的意义

 

• rw 读写 read wirte

• ro 只读 read only

• sync 同步模式,内存数据实时写入磁盘, 可以很快的把数据写入磁盘,但是相应的会降低磁盘的效率

• async 非同步模式,每隔一段时间,把内存的数据刷进磁盘中

• no_root_squash 客户端挂载NFS共享目录后,root用户不受约束,权限很大

因为在客户端需要把服务端共享的目录挂载到自己的本地磁盘下,所以如果是no_root_squash,那么客户端的root用户对共享文件拥有了相当与对本地磁盘的操作权限

• root_squash 与上面选项相对,客户端上的root用户收到约束,被限定成某个普通用户

• all_squash 客户端上所有用户在使用NFS共享目录时都被限定为一个普通用户

• anonuid/anongid 和上面几个选项搭配使用,定义被限定用户的uid和gid

 

2)客户端挂载

  • showmount -e ipaddr,可以看下机器是不是有权限去连接另外一台服务器的NFS

showmount -e 192.168.224.130

如果这是显示了error message可以考虑选择关掉防火墙 systemctl stop firewalld && setenforce 0,可以重启rpc和nfs服务

13.1-13.5 预习笔记

 

  • mount -t nfs 服务端的ip addr:共享的目录 挂载点

mount -t nfs 192.168.224.128:/home/nfstestdir /mnt/, 挂载好后,用df -h 查看,可以发现最后一行服务端共享的目录已经被挂载好了

13.1-13.5 预习笔记

 

3)现在我们来做实验,看看我们在客户端上新建一个文件,服务端是否可以同步

在客户端

cd /mnt/

touch emma1

13.1-13.5 预习笔记

在服务端, ll /home/nfstestdir,可以看到emma1已经存在了

13.1-13.5 预习笔记

 

正如上面的两张图所显示的那样,在客户端创建文件的UID/GID都为1000,而在服务端中文件的uid/gid为mysql,这是因为我们在定义etc/exports/时定义了anonuid和anongid为1000,如果我们id mysqld,就可以发现mysql的UID和GID都是1000

 

13.1-13.5 预习笔记

 

 

4.exportfs命令

exportfs是和nfs-util这个包一起安装的

假设在第一次配置nfs的共享目录,之后需要新增、更改某些机器或共享的目录;

首先需要更改配置文件,然后重启NFS服务,但如果远程客户端正在使用NFS服务,正在挂载着,如果你需要先停止nfs服务,那远程的客户端就会挂起,就会很大的影响,造成服务异常,进程异常,有很大可能导致系统坏掉

nfs服务不能随便重启,要重启,就需要先去服务器上,把挂载的目录卸载下来

在卸载目录的时候,若是在当前目录下去卸载会提示umount.nfs4: /mnt: device is busy

方法一:退出该目录后,再去卸载

方法二:在目录下卸载的时候,加 -l 选项,表示 lazy 懒惰的意思

在卸载目录后,在重启nfs服务

若是挂载了很多台机器,那么每台机器都需要去卸载,就会很麻烦,降低了工作效率

方法:使用exportfs命令,重新加载下

exportfs命令

-a 全部挂载或者全部卸载

-r 重新挂载

-u 卸载某一个目录

-v 显示共享目录

摘自:https://my.oschina.net/u/3707314/blog/1608108

exportfs -arv //不用重启nfs服务,配置文件就会生效

 

注:摘自https://blog.****.net/frankarmstrong/article/details/78774679

no_root_squas

访问nfs server共享目录的用户如果是root的话,它对该目录具有root权限。这个配置原本为无盘用户准备的。用户应避免使用!

root_squash

对于访问NFS server共享目录的用户,如果是root的话会被压缩成为nobody用户身份。

all_squash

***

不管访问nfs server共享目录的用户身份如何包括root,它的权限都将被压缩成为匿名用户,同时他们的udi和gid都会变成nobody或nfsnobody账户的uid,gid。在多个nfs客户端同时读写nfs server数据时,这个参数很有用***可以确保大家写入的数据的权限是一样的。

但不同系统有可能匿名用户的uid,gid不同。因为此处我们需要服务端和客户端之间的用户是一样的。比如说:服务端指定匿名用户的UID为2000,那么客户端也一定要存在2000这个账号才可以

 

 

5.NFS客户端问题

 

NFS 4版本会有该问题

客户端挂载共享目录后,不管是root用户还是普通用户,创建新文件时属主、属组为nobody,有下面两个解决办法

 

1) 客户端挂载时加上 -o nfsvers=3

也就是在挂载的时候指定nfs的版本为3

 

2)客户端和服务端都需要编辑/etc/idmapd.conf

• vim /etc/idmapd.conf

• 把“Domain = local.domain.edu” 改为 “Domain = xxx.com” (这里的xxx.com,随意定义吧),然后再重启rpcbind服务