NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操 作系统可以共享彼此的文件。 NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文 件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用 上相当便利;
NFS挂载原理:
当我们在NFS服务器设置好一个共享目录/home/public后,其他的有权访问NFS服务器的NFS客户 端就可以将这个目录挂载到自己文件系统的某个挂载点,这个挂载点可以自己定义,如上图客户端A与 客户端B挂载的目录就不相同。并且挂载好后我们在本地能够看到服务端/home/public的所有数据。如 果服务器端配置的客户端只读,那么客户端就只能够只读。如果配置读写,客户端就能够进行读写。挂 载后,NFS客户端查看磁盘信息命令:#df –h。 既然NFS是通过网络来进行服务器端和客户端之间的数据传输,那么两者之间要传输数据就要有想 对应的网络端口,NFS服务器到底使用哪个端口来进行数据传输呢?基本上NFS这个服务器的端口开在
2049,但由于文件系统非常复杂。因此NFS还有其他的程序去启动额外的端口,这些额外的用来传输数据 的端口是随机选择的,是小于1024的端口;既然是随机的那么客户端又是如何知道NFS服务器端到底使 用的是哪个端口呢?这时就需要通过远程过程调用(Remote Procedure Call,RPC)协议来实现了!
RPC与NFS通讯原理:
因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用 一些端口来传输数据,因此NFS的功能对应的端口并不固定,客户端要知道NFS服务器端的相关端口才 能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的服务,并且统一对外的端口是111,RPC
会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。PRC最主要的功能 就是指定每个NFS功能所对应的port number,并且通知客户端,记客户端可以连接到正常端口上去。 那么RPC又是如何知道每个NFS功能的端口呢? 首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口,RPC就会记录 下这些端口,并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,那么服务器端的
RPC就会将之前记录的NFS端口信息告知客户端。如此客户端就会获取NFS服务器端的端口信息,就会以 实际端口进行数据的传输了。 注意:在启动NFS SERVER之前,首先要启动RPC服务否则NFS SERVER就无法向RPC服务区注册, 另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的
NFS程序也要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文档后,是不需要重启NFS的, 直接在命令执行systemctl reload nfs或exportfs –rv即可使修改的/etc/exports生效
NFS客户端和NFS服务器通讯过程:
1. 首先服务器端启动RPC服务,并开启111端口
2. 服务器端启动NFS服务,并向RPC注册端口信息
3. 客户端启动RPC,向服务端的RPC服务请求服务端的NFS端口
4. 服务端的RPC服务反馈NFS端口信息给客户端。
5. 客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
NFS服务需要nfs-utils和rpcbind两个软件包,V10服务器默认已经安装
NFS主配置文件:/etc/exports
NFS配置参数
4.1 NFS通用设置
soft/hard
软挂载方式挂载系统,若NFS请求超时,则客户端向调用程序返回错误;如,果使用硬连接方式则客户端一直重 新请求直至成功。默认为hard。
bg/fg
设置挂载失败后的行为方式。默认的fg方式将立刻退出返回错误状态,bg方式是退出前将产生一个子进程在后 台继续尝试挂载。
timeo=n
timeo=n 客户端重传请求前等待时间。对于基于TCP的NFS服务,默认等待重传时间为60s。使用TCP协议 时,NFS Client不执行任何超时backoff。对于UDP协议,client使用一个合适的算法,为常用的请求类型estimate合适的超时时间。但对不常用的请求类型使用timeo设置。如果timeo没有设置,不常用的请求类 型1.1秒以后重试。在每次重发后,NFS Client会将timeout时间加倍,直到最大的60秒。
retrans=n
客户端返回错误前的重传次数。默认为重传3次。retrans与soft参数一起使用时才有效。
retry=n
设定当网络传输出现故障的时候,尝试重新连接多少时间后不再尝试。默认的数值是10000minutes
resize=n/wsize=n
每个read/write命令字向服务器读取文件的最大字节数。实际数据小于或等于此值。resize/wsize必须是1024倍数的正整数,小于1024时自动设为4096,大于1048576时自动设为1048576。默认时,服务器和客户 端进行协商后设置。
async/sync
同步、异步挂载,客户端默认异步(async)。对于异步挂载,客户端下发的写数据会先缓存在内存中,达到 一定大小或者其他条件(与客户端设置,状态有关),再一起发往服务端。而同步挂载,每次下发的写数据马 上发到服务端。
acregmin/acregmax
设置NFS客户端缓存普通文件属性的最短时间和最长时间,单位为秒。超过此时间后对其进行更新。默认最短 时间是3s,最长时间是60s
acdirmin/acdirmax
设置NFS客户端缓存目录属性的最短时间和最长时间,单位为秒。超过此时间后对其进行更新。默认最短时间 是3s,最长时间是60s。
ac/noac
设置是否缓存文件属性。为了提高性能,NFS客户端缓存文件属性(默认ac),然后每隔一段时间去检查文件 属性后更新。在缓存有效期内,客户端不检测服务器上文件属性是否改变。默认为ac。
actimeo
将acregmin/acregmax/acdirmin/acdirmax四个参数设置为相同时间,单位为秒。
sharecache/nosharecache
设置客户端并发挂载同一文件系统时数据缓存和属性缓存的共享方式。设置为sharecache时,多个挂载共享 共享同一缓存。设为nosharecache时,每个挂载各有一个缓存。默认为sharecache。
resvport/noresvport
设置连接服务器是否使用保密源端口。默认的resvport设置保密端口,noresvport设置为非保密端口。内 核2.6.28及以后版本支持。
lookupcache=mode
设置内核管理给定挂载点的目录项缓存方式。其中包括all/none/pos几种方式。客户端缓存LOOKUP命令字 请求结果。如果请求的目录项在服务器上,则返回结果为正,否则为负。all的管理方式是在父目录缓存的属 性失效前客户端缓存这两种目录项;pos是在父目录缓存的属性失效前客户端缓存结果为正的查询结果,总是 重新验证结果为负的查询结果。none总是重新验证目录缓存项。默认为all管理方式,内核2.6.28及以后版 本支持。
intr/nointr
设置是否允许信号中断挂载点的文件操作。如果指定intr,当NFS操作被信号中断时系统返回EINTR。指定nointr,信号不会中断NFS文件操作。默认为nointr。指定intr时,通常同时使用soft选项,防止数据损 坏。内核2.6.25及以后不再支持。
cto/nocto
设置是否使用“关闭打开”缓存一致的特性。通常客户端打开文件时检查是否存在以及是否有权限,当关闭文件 时刷新更改。当设置为nocto时,客户端使用非标准的试探来检查服务器上文件是否改变,对于只读和文件更 改较少时情形有助于提高性能。
4.2 对NFS(NFS2/NFS3)有效的选项
proto=transport
客户端向服务器发起传输请求使用的协议,可以为UDP或者TCP。未指定时,mount命令选择服务器支持的协 议
4.3 对NFS4有效的选项:
proto=transpro
客户端向服务器发起传输请求使用的协议,可以为UDP或者TCP。未指定时,选用TCP。
port=n
指定服务器NFS服务端口。如果NFS服务端口不在port上,则mount请求失败。未指定时,客户端使用NFS标 准的2049号端口。指定为0时,客户端选用服务器rpcbind服务支持的端口。
5.1 共享/nfs目录给192.168.1.0网段(完整范例)
服务器:
客户端:
5.2 客户端挂载192.168.1.164服务器的nfs目录,当网络质量不好时,客户端不会 因此卡顿(客户端挂载参数)
客户端