Centos7 NFS实战

 

概述


 

NFS:Network file system,网络文件系统;

 

由sun公司1984年推出,用来在网络中的多台计算机间实现资源共享(包括象文件或cd-rom);

 

设计的目的是:实现在不同系统间交互使用,所以它的通信协议采用与主机和操作系统无关的技术;

 

NFS Server可以看作是File Server,它可以让你的PC通过网络将远端得NFS SERVER共享出来的档案MOUNT到自己的系统中,在CLIENT看来使用NFS的远端文件就象是在使用本地文件一样;

 

  

 

版本


 

NFS协议从诞生到现在共发布了3个版本:NFSv2、NFSv3、NFSv4,NFSv4包含两个次版本NFSv4.0和NFSv4.1。

 

经过20多年发展,NFS发生了非常大的变化,最大的变化就是推动者从Sun变成了NetApp,NFSv2和NFSv3基本上是Sun起草的,NetApp从NFSv4.0参与进来,并且主导了NFSv4.1标准的制定过程,而Sun已经被Oracle收购了。

 

编号 版本 RFC 时间 页数
1 NFSv2 rfc1094 1989年3月 27页
2 NFSv3 rfc1813 1995年6月 126页
3 NFSv4.0 rfc3530 2003年4月 275页
4 NFSv4.1 rfc5661 2010年1月 617页

 

1. NFSv2

  NFSv2是第一个以RFC形式发布的版本,实现了基本的功能。

 

 

2. NFSv3

  NFSv3是1995年发布的,这时NFSv2已经发布了6年了,NFSv3修正了NFSv2的一些bug。两者有如下一些差别,但是感觉没有本质的差别。

 

  (1) NFSv2对每次读写操作中传输数据的最大长度进行了限制,上限值为8192字节,NFSv3取消了这个限制。

 

  (2) NFSv3对文件名称长度进行了限制,上限值为255字节,NFSv3取消了这个限制。

 

  (3) NFSv2对文件长度进行了限制,上限值为0x7FFFFFFF,NFSv3取消了这个限制。

 

  (4) NFSv2中文件句柄长度固定为32字节,NFSv3中文件句柄长度可变,上限值是64字节。

 

  (5) NFSv2只支持同步写,如果客户端向服务器端写入数据,服务器必须将数据写入磁盘中才能发送应答消息。

  NFSv3支持异步写操作,服务器只需要将数据写入缓存中就可以发送应答信息了。NFSv3增加了COMMIT请求,COMMIT请求可以将服务器缓存中的数据刷新到磁盘中。

 

  (6) NFSv3增加了ACCESS请求,ACCESS用来检查用户的访问权限。

  因为服务器端可能进行uid映射,因此客户端的uid和gid不能正确反映用户的访问权限。

  NFSv2的处理方法是不管访问权限,直接返送请求,如果没有访问权限就出错。NFSv3中增加了ACCESS请求,客户端可以检查是否有访问权限。

 

  (7) 一些请求调整了参数和返回信息,毕竟NFSv3和NFSv2发布的间隔有6年,经过长期运行可能觉得NFSv2某些请求参数和返回信息需要改进。

 

 

3. NFSv4.0

  相比NFSv3,NFSv4发生了比较大的变化,最大的变化是NFSv4有状态了。

 

  NFSv2和NFSv3都是无状态协议,服务区端不需要维护客户端的状态信息。

 

  无状态协议的一个优点在于灾难恢复,当服务器出现问题后,客户端只需要重复发送失败请求就可以了,直到收到服务器的响应信息。

 

  但是某些操作必须需要状态,如文件锁。如果客户端申请了文件锁,但是服务器重启了,由于NFSv3无状态,客户端再执行锁操作可能就会出错了。NFSv3需要NLM协助才能实现文件锁功能,但是有的时候两者配合不够协调。

 

  NFSv4设计成了一种有状态的协议,自身实现了文件锁功能,就不需要NLM协议了。NFSv4和NFSv3的差别如下:

 

  (1) NFSv4设计成了一种有状态的协议,自身实现了文件锁功能和获取文件系统根节点功能,不需要NLM和MOUNT协议协助了。

 

  (2) NFSv4增加了安全性,支持RPCSEC-GSS身份认证。

 

  (3) NFSv4只提供了两个请求NULL和COMPOUND,所有的操作都整合进了COMPOUND中,客户端可以根据实际请求将多个操作封装到一个COMPOUND请求中,增加了灵活性。

 

  (4) NFSv4文件系统的命令空间发生了变化,服务器端必须设置一个根文件系统(fsid=0),其他文件系统挂载在根文件系统上导出。

 

  (5) NFSv4支持delegation。

    由于多个客户端可以挂载同一个文件系统,为了保持文件同步,NFSv3中客户端需要经常向服务器发起请求,请求文件属性信息,判断其他客户端是否修改了文件。

    如果文件系统是只读的,或者客户端对文件的修改不频繁,频繁向服务器请求文件属性信息会降低系统性能。

    NFSv4可以依靠delegation实现文件同步。当客户端A打开一个文件时,服务器会分配给客户端A一个delegation。只要客户端A具有delegation,就可以认为与服务器保持了一致。

    如果另外一个客户端B访问同一个文件,则服务器会暂缓客户端B的访问请求,向客户端A发送RECALL请求。

    当客户端A接收到RECALL请求时将本地缓存刷新到服务器中,然后将delegation返回服务器,这时服务器开始处理客户端B的请求。

 

(6) NFSv4修改了文件属性的表示方法。由于NFS是Sun开发的一套文件系统,设计之出NFS文件属性参考了UNIX中的文件属性,可能Windows中不具备某些属性,因此NFS对操作系统的兼容性不太好。NFSv4将文件属性划分成了三类:

        Mandatory Attributes: 这是文件的基本属性,所有的操作系统必须支持这些属性。

        Recommended Attributes: 这是NFS建议的属性,如果可能操作系统尽量实现这些属性。

        Named Attributes: 这是操作系统可以自己实现的一些文件属性。

 

 

4. NFSv4.1

       与NFSv4.0相比,NFSv4.1最大的变化是支持并行存储了。

 

  在以前的协议中,客户端直接与服务器连接,客户端直接将数据传输到服务器中。

 

  当客户端数量较少时这种方式没有问题,但是如果大量的客户端要访问数据时,NFS服务器很快就会成为一个瓶颈,抑制了系统的性能。

 

  NFSv4.1支持并行存储,服务器由一台元数据服务器(MDS)和多台数据服务器(DS)构成,元数据服务器只管理文件在磁盘中的布局,数据传输在客户端和数据服务器之间直接进行。

 

  由于系统中包含多台数据服务器,因此数据可以以并行方式访问,系统吞吐量迅速提升。

 

服务端使用:nfsstat -s

客户端使用:nfsstat -c

 

 

 

安装


 

centos7安装nfs很简单

yum install nfs-utils rpcbind

 

要部署NFS服务,需要安装上面两个软件包

1.nfs-utils:NSF主程序

包括rpc.nfsd,rpc.mountd等等

 

2.rpcbind:rpc主程序NFS可以被视为一个RPC程序,

在启动任何一个RPC程序之前,需要做好端口映射工作,这个映射工作就是由rpcbind服务来完成的,因此必须先启动rpcbind服务,再启动nfs服务

 

 

  

   

 

 

   

 

配置文件


 

配置文件:/etc/exports

 

 

格式:


 

[共享的目录] [访问目标(参数,参数)]

 

当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样: 


[共享的目录] [访问目标(参数1,参数2)] [访问目标(参数3,参数4)]

 

 

访问目标可以是:


 

192.168.152.13        指定IP地址的主机 

nfsclient.test.com   指定域名的主机 

192.168.1.0/24         指定网段中的所有主机 

*.test.com                 指定域下的所有主机 

*                                所有主机 

 

 

共享参数:


 

ro:只读权限

rw:共享目录可读可写;

 

sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;

async:资料先存内存,再存硬盘

 

no_root_squash:登入nfs主机时,拥有共享目录所有者权限

root_squash(默认):登入nfs主机时,拥有共享目录所有者权限,但如果共享目录的拥有者时root用户,那么登入者权限为nobody权限

all_squash:登入nfs主机时,拥有nobody用户权限。所有访问用户都映射为匿名用户或用户组;

no_all_squash(默认):访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组;

anonuid:指定匿名访问用户的本地用户UID,默认为nfsnobody(65534);

anongid:指定匿名访问用户的本地用户组GID,默认为nfsnobody(65534);

 

subtree_check(默认) :若输出目录是一个子目录,则nfs服务器将检查其父目录的权限;

no_subtree_check :即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;

secure(默认):限制客户端只能从小于1024的tcp/ip端口连接服务器;限制client port(<1024)

insecure:允许客户端从大于1024的tcp/ip端口连接服务器;

wdelay(默认):检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率;

no_wdelay:若有写操作则立即执行,应与sync配合使用;

hide                在NFS共享目录中不共享其子目录 

no_hide           共享NFS目录的子目录

 

 

 相关命令


 

exportfs 

如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs命令来使改动立刻生效,该命令格式如下:

exportfs [-aruv] 

-a :全部mount或者unmount /etc/exports中的内容 

-r :重新mount /etc/exports中分享出来的目录 

-u :umount目录 

-v :在export的时候,将详细的信息输出到屏幕上。

 

具体例子: 

# exportfs -au 卸载所有共享目录

# exportfs -rv 重新共享所有目录并输出详细信息

 

 

showmount

-a :这个参数是一般在NFS SERVER上使用,是用来显示已经mount上本机nfs目录的cline机器。 

-e :显示指定的NFS SERVER上export出来的目录。 


mount 

mount -t nfs hostname(orIP):/directory /mount/point 

 

具体例子: 

Linux: mount -t nfs 192.168.0.1:/tmp /mnt/nfs 

 

mount nfs的其它可选参数: 

HARD mount和SOFT MOUNT: 

HARD: NFS CLIENT会不断的尝试与SERVER的连接(在后台,不会给出任何提示信息,在LINUX下有的版本仍然会给出一些提示),直到MOUNT上。 

SOFT:会在前台尝试与SERVER的连接,是默认的连接方式。当收到错误信息后终止mount尝试,并给出相关信息。 

例如:mount -F nfs -o hard 192.168.0.10:/nfs /nfs

 

rsize和wsize: 

文件传输尺寸设定:wsize 来进行设定。这两个参数的设定对于NFS的执行效能有较大的影响 

 

bg:在执行mount时如果无法顺利mount上时,系统会将mount的操作转移到后台并继续尝试mount,直到mount成功为止。(通常在设定/etc/fstab文件时都应该使用bg,以避免可能的mount不上而影响启动速度) 

fg:和bg正好相反,是默认的参数 

 

nfsvers=n:设定要使用的NFS版本,默认是使用2,这个选项的设定还要取决于server端是否支持NFS VER 3 

 

mountport:设定mount的端口 

port:根据server端export出的端口设定,例如如果server使用5555端口输出NFS,那客户端就需要使用这个参数进行同样的设定 

 

timeo=n:设置超时时间,当数据传输遇到问题时,会根据这个参数尝试进行重新传输。默认值是7/10妙(0.7秒)。如果网络连接不是很稳定的话就要加大这个数值,并且推荐使用HARD MOUNT方式,同时最好也加上INTR参数,这样你就可以终止任何挂起的文件访问。 

intr 允许通知中断一个NFS调用。当服务器没有应答需要放弃的时候有用处。

 

udp:使用udp作为nfs的传输协议(NFS V2只支持UDP) 

tcp:使用tcp作为nfs的传输协议 

 

namlen=n:设定远程服务器所允许的最长文件名。这个值的默认是255 

acregmin=n:设定最小的在文件更新之前cache时间,默认是3 

acregmax=n:设定最大的在文件更新之前cache时间,默认是60 

acdirmin=n:设定最小的在目录更新之前cache时间,默认是30 

acdirmax=n:设定最大的在目录更新之前cache时间,默认是60 

actimeo=n:将acregmin、acregmax、acdirmin、acdirmax设定为同一个数值,默认是没有启用。 

 

retry=n:设定当网络传输出现故障的时候,尝试重新连接多少时间后不再尝试。默认的数值是10000 minutes 

 

noac:关闭cache机制。 

 

同时使用多个参数的方法:mount -t nfs -o timeo=3,udp,hard 192.168.0.30:/tmp /nfs 

 

请注意,NFS客户机和服务器的选项并不一定完全相同,而且有的时候会有冲突。

比如说服务器以只读的方式导出,客户端却以可写的方式mount,虽然可以成功mount上,但尝试写入的时候就会发生错误。一般服务器和客户端配置冲突的时候,会以服务器的配置为准

 

 

实战


 

服务端

[root@n130 etc]# cat exports
/mnt/test1 192.168.1.131(rw,sync,all_squash)
/mnt/test2 192.168.1.0/24(ro,async,all_squash)
[root@n130 etc]# exportfs -r

 

客户端

[root@N131 mnt]# showmount -e 192.168.1.130
Export list for 192.168.1.130:
/mnt/test2 192.168.1.0/24
/mnt/test1 192.168.1.131
[root@N131 mnt]# mount -t nfs 192.168.1.130:/mnt/test1 nfs1/
[root@N131 mnt]# mount -t nfs 192.168.1.130:/mnt/test2 nfs2/
[root@N131 mnt]# cd nfs1/
[root@N131 nfs1]# ls
1  2
[root@N131 nfs1]# touch 3
[root@N131 nfs1]# ls
1  2  3
[root@N131 nfs1]# cd ../nfs2/
[root@N131 nfs2]# ls
[root@N131 nfs2]# touch 1
touch: cannot touch1’: Read-only file system

 

posted @ 2020-09-02 16:53  陆小呆  阅读(1533)  评论(0编辑  收藏  举报