nfs文件系统


深入理解Linux网络文件系统
[ 来源:|作者:佚名|时间:2005-5-7 10:00:29|浏览: ]
字号选择〖 大 中 小 〗


网络文件服务器(Network File System,简称NFS)是Linux上最容易配置的服务之一。尽管它的规则简单,却有着丰富的内涵。本刊今年第2期曾经介绍了如何构建Linux上的NFS服务器。但NFS还有许多Unix/Linux爱好者,甚至系统管理员应该注意的特别之处。本文旨在帮助读者更深入地了解NFS。

NFS Server的配置

首先介绍一下Server端和NFS相关文件的含义:

◆ /etc/exports 是NFS Server最基本的配置文件之一,文件中列出了共享的文件系统和允许访问这些文件系统的主机。这个文件可以用通配符或网段,以及一组主机名的形式来表示客户机列表。它有很大的灵活性,一般由系统管理员配置。

◆ /proc/fs/nfs/exports 导出文件列表的内核视图,包括导出的参数。

◆ /var/lib/nfs/etab 状态文件,其中列出了当前的高级列表。此文件包含了/etc/exports中相同格式的所有项目,同时包含了由exportfs -i手工导入的项目。

◆ /var/lib/nfs/rmtab 状态文件,列出了挂接导出文件的远程客户机清单。

◆ var/lib/nfs/xtab 状态文件,当前的低级导出清单。

例如,/etc/exports有下列一行/data *https://www.360docs.net/doc/552210911.html,(rw),显然有多个主机可以匹配这个域。如果两个主机,如https://www.360docs.net/doc/552210911.html,和https://www.360docs.net/doc/552210911.html,都请求访问该文件系统,则/var/lib/nfs/xtab文件包含了这个文件系统的两个基本相同的项目。

/etc/exports是纯文本文件,空行和以“#”开头的行会被忽略,长行可以用斜杠“/”分解为多行。文件中列出了允许NFS客户机访问服务器的文件系统,定义了导出文件系统和访问权限。

/etc/exports文件中任意行的格式如下:


vol_name host_name1(option1,opeion2....) host_name2(option1,option2)


其中vol_name(卷名)表示要导出的文件系统,除去卷名以外,其它参数都可以不写,不显示指出的参数都会采用缺省参数。host_name1 (主机名)如果不写的话,则任何主机都可以请求该文件系统。主机名的定义非常灵活,既可以指定某台主机,也可以指定一组主机。可以用下列四种方法来描述:

◆ 单个主机 可以用短名及完全限定名,或者用IP地址,例如student01、https://www.360docs.net/doc/552210911.html,或者192.168.10.1都是合法的主机名。

◆ 网组 可以列出/etc/netgroup文件中或NFS网组映射中定义的整组主机。网组名以“@”开头,例如 @teacher 或 @students。

◆通配符主机 用通配符可以列出一个域中的所有主机器,通配符可以使用“*”和“?”、“*”匹配0个或多个字符及“?

”匹配一个字符,但通配符不能匹配主机名中的点号。*https://www.360docs.net/doc/552210911.html,可以匹配 https://www.360docs.net/doc/552210911.html,,但不能匹配https://www.360docs.net/doc/552210911.html,,而*.*https://www.360docs.net/doc/552210911.html, 就可以匹配 https://www.360docs.net/doc/552210911.html,。ftp??https://www.360docs.net/doc/552210911.html,可以匹配https://www.360docs.net/doc/552210911.html,和https://www.360docs.net/doc/552210911.html,。

◆ 主机网络 可以用主机网络的方式导出特定的子网或几个子网,用192.168.10.0/255.255.255.0的方式可以匹配从192.168.10.1到192.168.10.255所有主机。导出选项用逗号分隔,但不能包含空格,长度可以任意设定。多数选项都是布尔选项,值为True或False,选项与性能或者安全性有关。当/etc/exports文件没有给出值时,系统会自动采用缺省值。选项的详细用法可以用man exportfs命令来获得。

更改/etc/exports文件后,可以用exportfs命令将文件的改变告诉服务器,也可以忽略/etc/exports文件,直接使用exportfs命令导出共享卷。exportfs可以指定导出或非导出卷时影响的选项,可以影响一个卷或几个卷的选项,见表1。



NFS锁及远程配额监控程序

在Unix中可以锁定文件,保证不会有两个用户同时写入文件的同一部分,以确保数据的一致。保证一致性的关键是内核要仲裁锁定和写入请求。

而在NFS/Samba之类的分布式文件系统中,许多客户可能同时要求写入和锁定同一文件。此时,只有服务器本身能扮演仲裁的角色。Unix/Linux的方法是增加一个RPC协议处理锁操作,这就是NFS锁监控程序(NLM,NFS Lock Manager)。通常不需要关心它的具体运行方式,将此服务打开即可。

rpc.rquotad监控程序实现RQUOTA协议,在Linux中NFS服务器总是执行配额,不管是否运行了rpc.rquotad。

启动和关闭NFS Server的顺序

1.启动NFS Server


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


其实,读者可以根据/etc/rc.d/rc3.d或rc5.d下的文件里,以“S”开头的带有portmap、nfslock nfs的文件中数字的大小来判断哪个服务应该优先启动。在笔者的机器上,它们分别是S13portmap、S14nfslock和S60nfs,这几个数字清楚地表明了以上启动的顺序。

2.关闭NFS Server的顺序


/etc/rc.d/init.d/nfslock stop
/etc/rc.d/init.d/nfs stop
/etc/rc.d/init.d/portmap stop


如果在客户端取消挂接前关闭NFS Server,显而易见会发生错误,因此应该尽量避免。

NFS Client的配置

配置NFS客户机,可以通过配置/etc/fstab文件或运行mount命令来进行。

对于那些需要在启动时就挂接的文件系统而言,往往将其写入/etc/fstab文件中,其中要包括NFS服务器的主机名或IP地址、文件系统、挂接点、选项等。对于那些临时需要的NFS共享卷来说,则多数会使

用mount命令将其手动挂接。这两种方法的参数使用基本上是一样的。下面就以/etc/fstab 文件为例,说明挂接NFS卷时参数的使用。

该文件中有关NFS卷的写法通常如下:


servername:/shareplace mountpoint nfs option01,option02,...optionX




表2列出了用于所有文件系统的一般选项。

对于NFS文件系统,还有一些可以使用的独特选项,使用的时候可以和一般选项混合使用,顺序任意。表3列出了NFS客户机可用的部分挂接选项。



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

NFS性能优化和测试

1.同步或异步写入

了解了NFS配置的各种选项以后,再来看看各选项对性能及安全性的影响。Server端同步写入(sync)能提供较好的稳定性,但会减慢磁盘的速度。在高负载的服务器上,应用程序会经常花费大量的时间等待写入完成。异步写入(async)是服务器不把数据立即写入磁盘,而先将其保存到内核内存(缓冲区)中,计划在后边的某个时刻写入,迅速向客户机返回写入成功的信息。这种方法大大地提高了性能,但却牺牲了可靠性,如果系统在将缓冲区中的内容写入磁盘之前崩溃,则数据会永远丢失。

NFS客户端也可以采用异步写入的方式,在客户端缓存用户进程写入的数据,Linux的缺省方式如此。这种方法使得客户机的速度更快,当客户机崩溃时只丢失该客户端的数据。显而易见,客户端异步写入的风险比服务端异步写入的风险要小。鉴于Linux是个相当稳定的系统,为了得到比较好的NFS性能,值得采用客户端异步写入的办法。

2.选择TCP还是UDP

早期,Sun公司曾将NFS v2设计成为只使用UDP协议,主要原因是当时机器的内存、网络速度和CPU的影响,不得不选择对机器负担较轻的方式。而到了NFS v3,Sun公司选择了TCP协议作为缺省的传输方式。在Linux上,UDP协议是缺省使用的协议。作为服务器而言,别无选择。但作为客户端,可以使用TCP协议和其它使用TCP的Unix NFS服务器互连。

3.NFS性能测试

通常使用测试硬盘读写速度的方法来测试NFS的读写速度,但要注意以下几点:

◆ 保证主机和网络工作正常,集线器、交换机、路由器等网络设备工作正常;

◆ 分别在网络安静、普通和繁忙的时候进行测试,真实地了解实际状况和理想状况,以及最坏的状况;

◆ 没有必要为提高

少许的性能而花费更多的精力。

基本测试可以用ping工具来检查网络状况,分别从服务器ping客户机,以及从客户机ping服务器。如果没有非对称路由的问题,这两种方法的结果应该相近。如果丢包率小于5%,就会造成NFS的性能不良。

测试程序用下面命令就可以完成:


time dd if=/dev/zero of=nfs.dat bs=4k count=4098


这个命令意思是在nfs.dat文件里写4098个4KB的块,也就是一个16MB的文件,也可以根据需要改变命令的参数, 但要注意每次实验时使用不同的文件名,否则又会和缓冲有关。

可能返回的结果如下:


4098+0 records in
4098+0 records out

real 0m23.984s
user 0m0.260s
sys 0m4.080s


这里主要关心的是real的时间,上面的实验结果表明在NFS上写一个16MB的文件花了23.984秒,在改变导出选项和mount选项以后重复这个实验,就能初步确定各个选项对性能的影响。

NFS故障排除和诊断

1.故障诊断

NFS出现了故障,可以从以下几个方面着手检查:

◆ 检查NFS客户机和服务器的负荷是否太高,Server和Client之间的网络是否正常;

◆ 检查/etc/exports文件的正确性;

◆ 必要时重新启动NFS或portmap服务;

运行下列命令重新启动portmap和NFS:


service portmap restart
service nfs start


◆ 检查Client上的mount命令或/etc/fstab的语法是否正确;

◆ 查看内核是否支持NFS和RPC服务。

普通的内核应有下列选项:


CONFIG_NFS_FS=m
CONFIG_NFS_V3=y
CONFIG_NFSD=m
CONFIG_NFSD_V3=y
CONFIG_SUNRPC=m


我们可以使用常见的网络连接和测试工具ping、tracerroute来测试网络连接及速度是否正常。网络连接正常是NFS能起作用的基础。

rpcinfo命令用于显示系统的RPC信息,一般使用-p参数列出某台主机的RPC服务。用rpcinfo-p命令检查服务器时,应该能看到portmapper、status、mountd nfs 和nlockmgr。用该命令检查客户端时,应该至少能看到portmapper服务。 2.常见问题处理

◆ 当mount NFS文件系统时,如果错误信息是“Permission denied”,则表示NFS服务器不让客户机挂接。一般可以用更改服务端上的/etc/exports文件来解决问题,使用exportfs-rv命令重新导出文件系统。

◆ 如果出现的错误是“Program not registed”,那么则是NFS服务可能没有启动或者运行不正常。最常用的解决方法是重新启动NFS服务。

◆ 如果出现“RPC:Unable to receive”,则可能是服务端没有启动portmap服务;如果已经启动了,则可能是被防火墙所屏蔽。

◆ 还有一种情况是mount文件系统的时候,客户端没有任何反应,这多半是因为客户端没有启动portmap服务。


建立安全的NFS服务器

任何网络服务器都会有安全问题,NFS也不能例外。由于设计方面的因素,NFS服务器不可能绝对安全。一般来说,不应该将NFS服务器运行在比较敏感的系统或者只有一般防火墙的机器上,应该尽量将其置于防火墙之后。配置安全的NFS服务器,可以从限制RCP服务的访问和控制文件系统的导出权限两方面着手。

限制RCP服务访问的办法一般是使用防火墙,比如基于tcp-wrapper、ipchians和iptalbes的防火墙。在全面使用Linux 2.4或更高版本内核的今天,了解iptables这种防火墙方法也就足够了。

缺省的状态下,portmap使用111端口,而NFS使用2049端口,可以通过iptables来限制对该端口的访问:


iptables -t filter -A INPUT -p udp -d 127.0.0.1 --dport 111 -j DROP
iptables -t filter -A INPUT -p udp -d 127.0.0.1 --dport 2049 -j DROP
iptables -t filter -A INPUT -p udp -s trusted_client -d this_server_ip --dport \
2049 -j ACCEPT
iptables -t filter -A INPUT -p udp -s not_trusted_client -d this_server_ip -dport \
2049 -j DROP


上面的脚本屏蔽了lo地址对portmap和NFS的访问。这样做的原因是,有的黑客程序会使用IP欺骗和RPC重定向的方法进行攻击。

除了防火墙的配置以外,还应该注意服务器导出选项。

此外,还要经常注意有关的安全通告,随时升级系统。如果是Red Hat的系统,可以采用RHN自动升级的办法(参见本刊2003年第1期《用RHN自动更新Red Hat Linux》)。

Linux上NFS还有许多复杂的原理和概念,如果读者有兴趣了解更多的知识,还应该了解以下一些内容:

◆ 外部数据表示(XDR,eXternal Data Representation);

◆ 远程过程调用(RPC,Remote Procedure Call);

◆ NFS 第四版本;

◆ 无状态服务器的概念;

◆ Amd 自动挂接器。
(责任编辑:西门吹雪)
j30B0j30B0j30B0




相关文档
最新文档