摘要:
NFS不管是在AIX还是在Linux上都配置过很多次,但是时间久了,依然容易忘记。本文从NFS的原理讲起,之后,通过了一个实例对NFS进行配置和详细剖解。
NFS原理:
NFS是网络文件系统(Network File System)的缩写。用于不同主机之间共享文件和数据。Redhat 7种,NFS包含两个服务,nfs-utils和rpcbind. nfs-utils包含了基本的NFS命令和监控程序,rpcbind支持安全的NFS RPC服务连接。
必须先起rpc服务,再起nfs服务。关闭的时候,先关闭nfs服务,再关闭rpc服务。为什么时候这样子呢,直接记忆起来,很容混淆。RPC又是什么呢?
带着这些问题,我继续深入。RPC是远程过程调用(Remoteprocedure call),是一个协议。RPC协议采用C/S模式。RPC主要是用来解决异步结构下不同服务器之间的进程相互调用的问题。正常情况下,程序只能调用本主机上运行的进程,由于不在一个内存空间,本机运行的程序没有办法调用其它主机上运行的程序。RPC采用客户机/服务器模式。请求程序作为客户端,服务提供程序就是服务器。客户端请求进程发送一个有进程参数的调用信息到服务端,然后等待应答消息。服务端,服务进程保持睡眠状态,直到调用进程的调用信息到达。当调用信息到达时,服务器获得进程参数,进行计算,得出结果,返回应答消息。然后,开始等待下一个调用信息。客户端在接收到应答消息后,获得进程结果。
简单总结一下,RPC就是让本地程序可以像调用本地进程一样调用远程主机的进程。RPC屏蔽了本地进程与远端主机之间通讯的细节。
我们稍微再深入一点,挖一挖RPC通信的细节。RPC是通过TCP/IP协议进行通信的,RPC是通过客户端发出请求,服务端响应的方式对上层调用实现透明传输。客户端和服务器之间可以通过长连接进行连接,多个远程过程调用同一个连接。也可以按需连接,调用时发起连接,调用介绍后断开连接。RPC客户端和服务端通过TCP连接时,需要协商通信端口,协商通信参数等。由于网络传输是传输是基于二进制的,因此,内存中的参数值也需要二进制序列化传输到远端,远端接收到序列化的值后,需要进行反序列化,恢复为内存中的表达方式。同样返回值也一样要经过序列化发送,和接收并反序列化恢复为内存可以识别的表达方式。
上面我们讲了RPC实现中的一些要点,如何实现这些要点。首先TCP连接时需要知道对端的连接端口,这个RPC是通过注册中心来实现的。RPC服务端先发布一个对外的监听端口,服务端需要发布的程序,可以通过向注册中心登记连接端口来向外发布。客户端程序通过监听端口连接到服务中心,获取到注册中心已经登记的进程或服务的通信参数。客户端获得对应的参数后,开始通过与服务端发布的程序或服务建立连接,实现通信。
我们回到NFS上来,NFS实际上就是RPC协议的一个应用。因此,起NFS进程之前需要先起RPC服务,客户端和服务端都需要起RPC服务。
服务器启动RPC服务后,需要开启111端口。111端口即刚刚所讲的RPC中的监听端口,该端口并不是用来与客户端之间交换数据,只是客户端用来获取服务端注册的NFS服务通信信息,例如NFS连接的端口信息等。客户端获取到NFS端口等信息后,通过获取到的端口信息与服务端建立连接,并传输数据。
NFS配置实战:
原理清楚了,配置就简单了。
服务端需要安装两个服务:RPC和NFS
客户端需要安装一个服务:RPC
环境说明:
服务端:主机名:prcist1mydb1a10 IP地址:192.168.44.15
客户端:主机名:PRCIST1MYDB1B10 IP地址:192.168.44.17
1.软件安装
2.查看nfs服务的配置文件
3.查看一下RPC注册情况
4.编辑nfs主配置文件/etc/exports:
5.我们把NFS进程起起来
6.再查看以下RPC注册信息。
7.我们看看共享是否成功。
8.客户端执行mount命令挂载。
9.客户端实现开机自动挂载:
NFS挂载时特性研究:
在服务端编辑NFS主配置文件时,是用到了主配置文件/etc/exports,该文件格式如下:
[客户端1选项(访问权限,用户映射,其他)][客户端2选项(访问权限,用户映射,其他)]
例如本例中:/data192.168.44.17(rw,sync,no_root_squash)
/data为输出目录
192.168.44.17为客户端IP地址,也可以放网段,例如:192.168.44.0/24,或者域名主机:*.myexample.com,所有主机:*
选项主要有三类:
访问权限,设置只读: ro,设置读写:rw
用户映射选项:
all_squash:将远程访问的所有普通用户及属组都映射为匿名用户或组(nfsnobody); no_all_squash:访问用户先与本机用户匹配,匹配失败后,再映射为匿名用户或用户组。
Root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置)
No_root_squash: root拥有该共享的完全管理权限
Anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
Anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定匿名用户组账户为本地组账户(GID=xxx);
其他选项:
Secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置)
Insecure:允许客户端从大于1024的端口连接服务器
Sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据一致性
Async:将数据保存在内存缓冲区中,必要时才写入磁盘
Wdelay:检查是否有相关的写操作,如果有则将这些写操作仪器执行,这样可以提高效率。
No_wdelay:若有写操作,立即执行,应与sync配合使用
Subtree_check:若输出是一个子目录,则nfs服务器检查其父目录的权限(默认设置)
No_subtree_check:即使输出目录是一个字目录,nfs服务器也不检查其父目录的权限,这样可以提高效率
NFS静态端口:
我们知道NFS使用111端口作为portmapper监听端口。刚才我们是用rpc –p localhost时,看到nfs使用2049端口,这个是NFSD( nfs server)使用的端口。这两个端口默认是固定的,但是NFS中很多其他服务,端口都是动态的。例如:rpc.mounted端口。动态端口,对于防火墙上管理,很不方便.我们需要把NFS启动的端口都固定下来,需要修改/etc/sysconfig/nfs文件:
可以看到如下:将端口都固定下来,重启NFS服务即可。
领取专属 10元无门槛券
私享最新 技术干货