NFS全攻略

1、NFS简介  linux

NFS-Network FileSystem的缩写,NFS是由Sun开发并发展起来的一项用于在不一样机器,不一样操做系统之间经过网络互相分享各自的文件。NFS server也能够看做是一个FILE SERVER,它可让你的PC经过网络将远端得NFS SERVER共享出来的档案MOUNT到本身的系统中,在CLIENT看来使用NFS的远端文件就象是在使用本地文件同样。  安全

NFS协议从诞生到如今为止,已经有多个版本,如NFS V2rfc1094,NFS V3rfc1813)(最新的版本是V4rfc3010)。  服务器

2、各NFS协议版本的主要区别  网络

V3相对V2的主要区别:  并发

1、文件尺寸  app

V2最大只支持32BIT的文件大小(4G),NFS V3新增长了支持64BIT文件大小的技术。  异步

2、文件传输尺寸  async

V3没有限定传输尺寸,V2最多只能设定为8k,可使用-rsize and -wsize 来进行设定。  tcp

3、完整的信息返回  ide

V3增长和完善了许多错误和成功信息的返回,对于服务器的设置和管理能带来很大好处。 

4、增长了对TCP传输协议的支持 

V2只提供了对UDP协议的支持,在一些高要求的网络环境中有很大限制,V3增长了对TCP协议的支持 

*5、异步写入特性 

6、改进了SERVERmount性能 

7、有更好的I/O WRITES 性能。 

9、更强网络运行效能,使得网络运做更为有效。 

10、更强的灾难恢复功能。 

 

异步写入特性(v3新增长)介绍: 

NFS V3 可否使用异步写入,这是可选择的一种特性。NFS V3客户端发发送一个异步写入请求到服务器,在给客户端答复以前服务器并非必需要将数据写入到存储器中(稳定的)。服务器能肯定什么时候去写入数据或者将多个写入请求聚合到一块儿并加以处理,而后写入。客户端能保持一个数据的copy以防万一服务器不能完整的将数据写入。当客户端但愿释放这个copy的时候,它会向服务器经过这个操做过程,以确保每一个操做步骤的完整。异步写入可以使服务器去肯定最好的同步数据的策略。使数据能尽量的同步的提交何到达。与V2比较来看,这样的机制能更好的实现数据缓冲和更多的平行(平衡)。而NFS V2SERVER在将数据写入存储器以前不能再相应任何的写入请求。 

 

V4相对V3的改进: 

1:改进了INTERNET上的存取和执行效能 

2:在协议中加强了安全方面的特性 

3:加强的跨平台特性 

3、CLIENTSERVER的具体操做和设置 

在讲NFS SERVER的运做以前先来看一些与NFS SERVER有关的东西: 

RPCRemote Procedure Call 

NFS自己是没有提供信息传输的协议和功能的,但NFS却能让咱们经过网络进行资料的分享,这是由于NFS使用了一些其它的传输协议。而这些传输协议勇士用到这个RPC功能的。能够说NFS自己就是使用RPC的一个程序。或者说NFS也是一个RPC SERVER.因此只要用到NFS的地方都要启动RPC服务,不管是NFS SERVER或者NFS CLIENT。这样SERVERCLIENT才能经过RPC来实现PROGRAM PORT的对应。能够这么理解RPCNFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。 

 

NFS须要启动的DAEMONS 

pc.nfsd:主要复杂登录权限检测等。 

rpc.mountd:负责NFS的档案系统,当CLIENT端经过rpc.nfsd登录SERVER后,对clinet存取server的文件进行一系列的管理 

NFS SERVERREDHAT LINUX平台下一共须要两个套件:nfs-utilsPORTMAP 

nfs-utils:提供rpc.nfsd rpc.mountd这两个NFS DAEMONS的套件 

portmap:NFS其实能够被看做是一个RPC SERVER PROGRAM,而要启动一个RPC SERVER PROGRAM,都要作好PORT的对应工做,并且这样的任务就是由PORTMAP来完成的。通俗的说PortMap就是用来作PORTmapping的。 

 

一:服务器端的设定(以LINUX为例) 

服务器端的设定都是在/etc/exports这个文件中进行设定的,设定格式以下: 

欲分享出去的目录 主机名称1或者IP1(参数1,参数2 主机名称2或者IP2(参数3,参数4 

上面这个格式表示,同一个目录分享给两个不一样的主机,但提供给这两台主机的权限和参数是不一样的,因此分别设定两个主机获得的权限。 

能够设定的参数主要有如下这些: 

rw:可读写的权限; 

ro:只读的权限; 

no_root_squash:登入到NFS主机的用户若是是ROOT用户,他就拥有ROOT的权限,此参数很不安全,建议不要使用。 

root_squash:在登入 NFS 主機使用分享之目錄的使用者若是是 root 時,那麼這個使用者的權限將被壓縮成為匿名使用者,一般他的 UID GID 都會變成 nobody 那個身份; 

all_squash:无论登录NFS主机的用户是什么都会被从新设定为nobody 

anonuid:将登入NFS主机的用户都设定成指定的user id,ID必须存在于/etc/passwd中。 

anongid:同 anonuid ,可是變成 group ID 就是了! 

sync:资料同步写入存储器中。 

async:资料会先暂时存放在内存中,不会直接写入硬盘。 

insecure 容许从这台机器过来的非受权访问。 

 

例如能够编辑/etc/exports为: 

/tmp     *(rw,no_root_squash) 

/home/public 192.168.0.*(rw)   *(ro) 

/home/test  192.168.0.100(rw) 

/home/linux  *.the9.com(rw,all_squash,anonuid=40,anongid=40) 

设定好后可使用如下命令启动NFS: 

/etc/rc.d/init.d/portmap start (REDHATPORTMAP是默认启动的) 

/etc/rc.d/init.d/nfs start 

 

exportfs命令: 

若是咱们在启动了NFS以后又修改了/etc/exports,是否是还要从新启动nfs呢?这个时候咱们就能够用exportfs命令来使改动马上生效,该命令格式以下: 

exportfs [-aruv] 

-a :所有mount或者unmount /etc/exports中的内容 

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

-u umount 目录 

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

具体例子: 

[root @test root]# exportfs -rv <==所有从新 export 一次! 

exporting 192.168.0.100:/home/test 

exporting 192.168.0.*:/home/public 

exporting *.the9.com:/home/linux 

exporting *:/home/public 

exporting *:/tmp 

reexporting 192.168.0.100:/home/test to kernel 

 

exportfs -au <==所有都卸载了。 

 

 

客户段的操做: 

1showmout命令对于NFS的操做和查错有很大的帮助,因此咱们先来看一下showmount的用法 

showmout 

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

-e :显示指定的NFS SERVERexport出来的目录。 

例如: 

showmount -e 192.168.0.30 

Export list for localhost: 

/tmp * 

/home/linux *.linux.org 

/home/public (everyone)  

/home/test 192.168.0.100 

2mount nfs目录的方法: 

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

具体例子: 

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

Solaris:mount -F nfs 192.168.0.1:/tmp /mnt/nfs 

BSD: mount 192.168.0.1:/tmp /mnt/nfs 

 

3mount nfs的其它可选参数: 

HARD mountSOFT 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数据等,这样在远程机器暂时链接不上或关闭时就不会挂起你的会话过程。 

 

rsizewsize 

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

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

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

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

mountport:设定mount的端口 

port:根据serverexport出的端口设定,例如若是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时间,默认是

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

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

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

actimeo=n:将acregminacregmaxacdirminacdirmax设定为同一个数值,默认是没有启用。 

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

noac:关闭cache机制。 

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

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

 

 

4/etc/fstab的设定方法 

/etc/fstab的格式以下: 

fs_spec   fs_file  fs_type   fs_options  fs_dump fs_pass  

fs_spec:该字段定义但愿加载的文件系统所在的设备或远程文件系统,对于nfs这个参数通常设置为这样:192.168.0.1:/NFS 

fs_file:本地的挂载点 

fs_type:对于NFS来讲这个字段只要设置成nfs就能够了 

fs_options:挂载的参数,可使用的参数能够参考上面的mount参数。 

fs_dump - 该选项被"dump"命令使用来检查一个文件系统应该以多快频率进行转储,若不须要转储就设置该字段为

fs_pass - 该字段被fsck命令用来决定在启动时须要被扫描的文件系统的顺序,根文件系统"/"对应该字段的值应该为1,其余文件系统应该为2。若该文件系统无需在启动时扫描则设置该字段为0  

 

5、与NFS有关的一些命令介绍 

nfsstat: 

查看NFS的运行状态,对于调整NFS的运行有很大帮助 

rpcinfo 

查看rpc执行信息,能够用于检测rpc运行状况的工具。 

 

 

4、NFS调优 

调优的步骤: 

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

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

3、调整服务器 

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

 

 

NFS性能有关的问题有不少,一般能够要考虑的有如下这些选择: 

 

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

WSIZERSIZE对于NFS的效能有很大的影响。 

wsizersize设定了SERVERCLIENT之间往来数据块的大小,这两个参数的合理设定与不少方面有关,不只是软件方面也有硬件方面的因素会影响这两个参数的设定(例如LINUX KERNEL、网卡,交换机等等)。 

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

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

用于测试的WSIZE,RSIZE最好是1024的倍数,对于NFS V2来讲8192RSIZEWSIZE的最大数值,若是使用的是NFS V3则能够尝试的最大数值是32768 

若是设置的值比较大的时候,应该最好在CLIENT上进入mount上的目录中,进行一些常规操做(LS,VI等等),看看有没有错误信息出现。有可能出现的典型问题有LS的时候文件不能完整的列出或者是出现错误信息,不一样的操做系统有不一样的最佳数值,因此对于不一样的操做系统都要进行测试。 

 

设定最佳的NFSDCOPY数目。 

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

 

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在复杂的网络环境中保持最好的传输稳定性。能够参考这篇文章:http://www.hp.com.tw/ssn/unix/0212/unix021204.asp 

 

版本的选择 

V3做为默认的选择(RED HAT 8默认使用V2,SOLARIS 8以上默认使用V3),能够经过vers= mount option来进行选择。 

LINUX经过mount optionnfsvers=n进行选择。 

 

5、NFS故障解决 

1NFSD没有启动起来 

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

2mountd 进程没有启动 

mountd 进程是一个远程过程调用 (RPC) ,其做用是对客户端要求安装(mount)文件系统的申请做出响应。mountd进程经过查找 /etc/xtab文件来获知哪些文件系统能够被远程客户端使用。另外,经过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 

3fs type nfs no supported by kernel 

kernel不支持nfs文件系统,从新编译一下KERNEL就能够解决。 

4cant contact portmapper: RPC: Remote system error - Connection refused 

出现这个错误信息是因为SEVER端的PORTMAP没有启动。 

5mount clntudp_create: RPC: Program not registered 

NFS没有启动起来,能够用showmout -e host命令来检查NFS SERVER是否正常启动起来。 

6mount: localhost:/home/test failed, reason given by server: Permission denied 

这个提示是当clientmount nfs server时可能出现的提示,意思是说本机没有权限去mount nfs server上的目录。解决方法固然是去修改NFS SERVER咯。 

7、被防火墙阻挡 

这个缘由不少人都忽视了,在有严格要求的网络环境中,咱们通常会关闭linux上的全部端口,当须要使用哪一个端口的时候才会去打开。而NFS默认是使用111端口,因此咱们先要检测是否打开了这个端口,另外也要检查TCP_Wrappers的设定。 

 

 

6、NFS安全 

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

 

1、新手对NFS的访问控制机制难于作到驾轻就熟,控制目标的精确性难以实现 

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

3、较早的NFS可使未受权用户得到有效的文件句柄 

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

 

增强NFS安全的方法: 

1、合理的设定/etc/exports中共享出去的目录,最好能使用anonuidanongid以使MOUNTNFS SERVERCLIENT仅仅有最小的权限,最好不要使用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参数来改变这个端口,这样就能够在必定程度上加强安全性。 

6、使用Kerberos V5做为登录验证系统

相关文章
相关标签/搜索