你不知道的Linux网络文件系统NFS

来源:
导读 大家好,我是本期栏目编辑小友,现在为大家讲解你不知道的Linux网络文件系统NFS问题。 NFS概况 是网络文件系统的缩写,最早由孙开发。他

大家好,我是本期栏目编辑小友,现在为大家讲解你不知道的Linux网络文件系统NFS问题。

NFS概况

是网络文件系统的缩写,最早由孙开发。他最大的功能就是不同的机器,不同的操作系统,可以通过网络互相共享自己的文件,所以他也可以简单的看成是一个文件服务器。此NFS服务器允许您的电脑将远程网络上NFS主机共享的目录装载到本地机器上,因此本地机器看起来像远程主机的目录,就像它自己的分区一样。这里与你共享的远程机器是服务器,而你的电脑是客户端。

NFS协议自诞生以来有很多版本,如NFS V2(rfc1094)、NFS V3(rfc1813),最新版本为V4(rfc3010)。

与V2相比,V3增加了很多功能,其中之一就是增加了异步写功能。以下是它的介绍:

NFS V3是否可以使用异步写入是一个可选特性。NFS V3客户端向服务器发送异步写请求,服务器在回复客户端之前无需将数据写入内存(稳定)。服务器可以确定何时写入数据或聚合多个写入请求,并在写入之前处理它们。如果服务器无法完全写入数据,客户端可以保留一份数据副本。当客户端想要释放这个副本时,它会将这个操作过程传递给服务器,以确保每个操作步骤的完整性。异步写入使服务器能够确定同步数据的最佳策略。以便尽可能同步提交数据。与V2相比,该机制可以实现更好的数据缓冲和更多的并行性(平衡)。而NFSV2的服务器在将数据写入内存之前无法响应任何写请求。

那么NFS是如何实施的呢?

RPC概述

虽然NFS有自己的协议和端口号,但NFS使用一种称为远程过程调用(RPC)的协议来协助NFS的操作。

当我们使用一些服务进行远程连接时,需要管理和映射一些信息,比如主机的IP、服务的端口号以及对应服务的PID。管理端口通信和服务关联的工作是这个远程过程调用的任务。

NFS的服务本身不提供数据传输协议,但NFS允许我们共享文件。原因是NFS使用了一些其他相关的传输协议。而这些传输协议使用了这个所谓的RPC的功能。也就是说,NFS本身只是一个使用RPC的程序。说得通俗一点,NFS也可以算是一个RPC服务器。

同时需要注意的是,在某些情况下,不仅运行NFS的服务器需要激活RPC服务,NFS分区的客户端机器也需要同步激活RPC。原因是只有这样,服务器和客户端才能通过RPC协议执行相应的程序端口。NFS主要是管理共享目录,至于数据传输,只是扔给RPC协议操作。

需要什么后台程序来访问服务器端的文件,也就是需要什么守护程序来支持服务器端提供NFS服务?从前面的讨论中,我们可以知道nfs服务器实际上是一个rpc服务器,所以提供nfs的守护进程就是rpc守护进程。

NFS服务器的RPC守护程序。

要访问nfs服务器的文件,NFS服务器必须由NFS提供服务,这是通过以下两个后台进程完成的。

Rpc.mountd:这个守护进程的主要功能是管理NFS的文件系统。

客户端通过rpc.nfsd成功登录主机后,在使用NFS服务器提供的文件之前,还需要经过文件使用权(即rwxrwxrwx和owner,group)的权限认证程序。他将读取NFS设置文件。

tc/exports来比对 Client 的权限,当通过这一关之后, Client就可以取得使用NFS文件的权限。(注:这个也是我们用来管理 NFS 分享之目录的使用权限与安全设定的地方)。

要让NFS运行起来,对外提供服务,一共需要两个套件的支持。分别是:

1、              nfs-uTIls:就是提供rpc.nfsd及rpc.mountd这两个NFS daemons与其它相关documents与说明文件、执行档等的套件,这个就是NFS的主要套件。

2、              portmap:提高端口映射的功能。

就如同刚刚提的到,我们的NFS其实可以被视为一个RPC server program,而要激活任何一个RPC server program之前,我们都需要做好port的对应(mapping)的工作才行,这个工作其实就是『portmap』这个服务所负责的。也就是说,在激活任何一个RPC server之前,我们都需要激活portmap才行。

那么这个portmap到底在干嘛呢?就如同这个服务的名称,就是作port的mapping。举个例子来说:当Client端尝试来使用RPC server所提供的服务时,由于Client需要取得一个可以连接的port才能够使用RPC server所提供的服务,因此,Client首先就会去跟 portmap讲『可不可以通知一下,给我个port number,好让我可以跟RPC联络吧!』,这个时候portmap就自动的将自己管理的port mapping告知 Client ,好让他可以连接上server 来。

所以:『激活 NFS 之前,请先激活portmap』

NFS客户端的设定

所谓客户端的设定,其实就是说客户端该如何挂载主机的目录,当然是使用mount目录,它的语法格式:

#mount -t nfs hostname(orIP):/directory /mountpoint

为了担心会不小心将NFS端挂进来的具有SUID权限档案的程序执行,root可以将NFS 所分享的目录以较为安全的情况挂载进来,可以

#mount -t nfs -o nosuid,ro hostname:/directory /mountponit

有关mount nfs的其它可选参数:

1、HARD mount和SOFT MOUNT:

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

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

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

对于到底是使用hard还是soft的问题,这主要取决于你访问什么信息有关。例如你是想通过NFS来运行X PROGRAM的话,你绝对不会希望由于一些意外的情况(如网络速度一下子变的很慢,插拔了一下网卡插头等)而使系统输出大量的错误信息,如果此时你用的是HARD方式的话,系统就会等待,直到能够重新与NFS SERVER建立连接传输信息。另外如果是非关键数据的话也可以使用SOFT方式,如FTP数据等,这样在远程机器暂时连接不上或关闭时就不会挂起你的会话过程。

2、rsize和wsize:

文件传输尺寸设定:V3没有限定传输尺寸,V2最多只能设定为8k,可以使用“-rsize”和“-wsize”来进行设定。这两个参数的设定对于NFS的执行效能有较大的影响

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

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

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

6、mountport:设定mount的端口

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

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

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

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

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

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

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

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

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

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

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

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

19、noac:关闭cache机制。

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

请注意,NFS客户机和服务器的选项并不一定完全相同,而且有的时候会有冲突。比如说服务器以只读的方式导出,客户端却以可写的方式mount,虽然可以成功mount上,但尝试写入的时候就会发生错误。一般服务器和客户端配置冲突的时候,会以服务器的配置为准。

与NFS有关的一些命令介绍

nfsstat:查看NFS的运行状态,对于调整NFS的运行有很大帮助,在主机和客户端都可以使用。

Rpcinfo:查看rpc执行信息,可以用于检测rpc运行情况的工具。

NFS调优

调优的步骤包括:

1、测量当前网络、服务器和每个客户端的执行效率。

2、分析收集来的数据并画出图表。查找出特殊情况,例如很高的磁盘和CPU占用、已经高的磁盘使用时间

3、调整服务器

4、重复第一到第三步直到达到你渴望的性能

与NFS性能有关的问题有很多,通常可以要考虑的有以下这些选择:

1、WSIZE,RSIZE参数来优化NFS的执行效能。

WSIZE、RSIZE对于NFS的效能有很大的影响。wsize和rsize设定了SERVER和CLIENT之间往来数据块的大小,这两个参数的合理设定与很多方面有关,不仅是软件方面也有硬件方面的因素会影响这两个参数的设定(例如LINUX KERNEL、网卡,交换机等等)。

下面这个命令可以测试NFS的执行效能,读和写的效能可以分别测试,分别找到合适的参数。对于要测试分散的大量的数据的读写可以通过编写脚本来进行测试。在每次测试的时候最好能重复的执行一次MOUNT和unmount。

time dd if=/dev/zero of=/mnt/home/testfile bs=16k count=16384

用于测试的WSIZE,RSIZE最好是1024的倍数,对于NFS V2来说8192是RSIZE和WSIZE的最大数值,如果使用的是NFS V3则可以尝试的最大数值是32768。如果设置的值比较大的时候,应该最好在CLIENT上进入mount上的目录中,进行一些常规操作(LS,VI等等),看看有没有错误信息出现。有可能出现的典型问题有ls的时候文件不能完整的列出或者是出现错误信息,不同的操作系统有不同的最佳数值,所以对于不同的操作系统都要进行测试。

2、设定最佳的NFSD的COPY数目。

linux中的NFSD的COPY数目是在/etc/rc.d/init.d/nfs这个启动文件中设置的,默认是8个NFSD,对于这个参数的设置一般是要根据可能的CLIENT数目来进行设定的,和WSIZE、RSIZE一样也是要通过测试来找到最近的数值。

3、UDP and TCP

可以手动进行设置,也可以自动进行选择

mount -t nfs -o sync,tcp,noatime,rsize=1024,wsize=1024 EXPORT_MACHINE:/EXPORTED_DIR /DIR

UDP 有着传输速度快,非连接传输的便捷特性,但是UDP在传输上没有TCP来的稳定,当网络不稳定或者黑客入侵的时候很容易使NFS的 Performance 大幅降低甚至使网络瘫痪,所以对于不同情况的网络要有针对的选择传输协议。

nfs over tcp比较稳定, nfs over udp速度较快。在机器较少网络状况较好的情况下使用UDP协议能带来较好的性能,当机器较多,网络情况复杂时推荐使用TCP协议(V2只支持UDP协议)。在局域网中使用UDP协议较好,因为局域网有比较稳定的网络保证,使用UDP可以带来更好的性能,在广域网中推荐使用TCP协议,TCP协议能让NFS在复杂的网络环境中保持最好的传输稳定性。

4、版本的选择

V3作为默认的选择(RED HAT 8默认使用V2,SOLARIS 8以上默认使用V3),可以通过vers= mount option来进行选择。LINUX通过mount option的nfsvers=n进行选择。

NFS安全性

NFS的不安全性主要体现于以下4个方面:

1、新手对NFS的访问控制机制难于做到得心应手,控制目标的精确性难以实现

2、NFS没有真正的用户验证机制,而只有对RPC/Mount请求的过程验证机制

3、较早的NFS可以使未授权用户获得有效的文件句柄

4、在RPC远程调用中,一个SUID的程序就具有超级用户权限

加强NFS安全的方法:

1、合理的设定/etc/exports中共享出去的目录,最好能使用anonuid,anongid以使MOUNT到NFS SERVER的CLIENT仅仅有最小的权限,最好不要使用no_root_squash。

2、使用IPTABLE防火墙限制能够连接到NFS SERVER的机器范围

iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPT

iptables -A INPUT -i eth0 -p UDP -s 192.168.0.0/24 --dport 111 -j ACCEPT

iptables -A INPUT -i eth0 -p TCP -s 140.0.0.0/8 --dport 111 -j ACCEPT

iptables -A INPUT -i eth0 -p UDP -s 140.0.0.0/8 --dport 111 -j ACCEPT

3、为了防止可能的Dos攻击,需要合理设定NFSD 的COPY数目

4、修改/etc/hosts.allow和/etc/hosts.deny达到限制CLIENT的目的

/etc/hosts.allow

portmap: 192.168.0.0/255.255.255.0 : allow

portmap: 140.116.44.125 : allow

/etc/hosts.deny

portmap: ALL : deny

5、改变默认的NFS 端口

NFS默认使用的是111端口,但同时你也可以使用port参数来改变这个端口,这样就可以在一定程度上增强安全性。使用Kerberos V5作为登陆验证系统

NFS故障解决

1、NFSD没有启动起来

首先要确认NFS输出列表存在,否则nfsd不会启动。可用exportfs命令来检查,如果exportfs命令没有结果返回或返回不正确,则需要检查/etc/exports文件。

2、mountd 进程没有启动

mountd进程是一个远程过程调用(RPC),其作用是对客户端要求安装(mount)文件系统的申请作出响应。

mountd进程通过查找/etc/fstab文件来获知哪些文件系统可以被远程客户端使用;另外,通过mountd进程,用户可以知道目前有哪些文件系统已被远程文件系统装配,并得知远程客户端的列表。

查看mountd是否正常启动起来可以使用命令rpcinfo进行查看,在正常情况下在输出的列表中应该象这样的行:

100005 1 udp 1039 mountd

100005 1 tcp 1113 mountd

100005 2 udp 1039 mountd

100005 2 tcp 1113 mountd

100005 3 udp 1039 mountd

100005 3 tcp 1113 mountd

如果没有起来的话可以检查是否安装了PORTMAP组件:rpm -qa|grep portmap

3、fs type nfs no supported by kernel:kernel不支持nfs文件系统,重新编译一下KERNEL就可以解决。

4、can't contact portmapper: RPC: Remote system error - Connection refused:出现这个错误信息是由于SEVER端的PORTMAP没有启动。

5、mount clntudp_create: RPC: Program not registered:NFS没有启动起来,可以用showmout -e host命令来检查NFS SERVER是否正常启动起来。

6、mount: localhost:/home/test failed, reason given by server: Permission denied:这个提示是当client要mount nfs server时可能出现的提示,意思是说本机没有权限去mount nfs server上的目录。解决方法当然是去修改NFS SERVER咯。

7、限的设定不符合

8、被防火墙搞掉

这个原因很多人都忽视了,在有严格要求的网络环境中,我们一般会关闭linux上的所有端口,当需要使用哪个端口的时候才会去打开。而NFS默认是使用111端口,所以我们先要检测是否打开了这个端口,另外也要检查TCP_Wrappers的设定。

重新设置防火墙,包括iptables与TCP_Wrappers,因为激活了portmap,所以端口111必须提供出去.因此在iptables rules中,要增加:

iptables -A INPUT -p TCP --dport 111 -j ACCEPT

iptables -A INPUT -p UDP --dport 111 -j ACCEPT

如果还不行,那就是TCP_Wrappers的问题,检查/etc/hosts.deny,如果有一行是:

ALL: ALL: deny

那就必须在/etc/hosts.allow中增加:

portmap: ALL: allow

9、另外,需要注意的下面这个问题:

由于NFS使用的这个RPC在client端连上主机时,那么你的主机想要关机,那可就会成为『不可能的任务』。即如果你的Server上面还有Client在联机,那么你要关机,可能得要等到数个钟头才能够正常的关机成功!所以,建议在NFS Server要关机之前,要先『关掉portmap与nfs』这两个东西。如果无法正确的将这两个daemons关掉,那么先以netstat -utlp找出PID,然后kill掉。

 

标签:

版权声明:转载此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢您的支持与理解。