作者:马路遥
网络文件服务器(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 *.flying.com.cn (rw),显然有多个主机可以匹配这个域。如果两个主机,如 mail.flying.com.cn 和 ftp.flying.com.cn 都请求访问该文件系统,则 /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、student01.flying.com.cn 或者 192.168.10.1 都是合法的主机名。
◆ 网组 可以列出 /etc/netgroup 文件中或 NFS 网组映射中定义的整组主机。网组名以 “@” 开头,例如 @teacher 或 @students。
◆ 通配符主机 用通配符可以列出一个域中的所有主机器,通配符可以使用 “*” 和 “?”、“*” 匹配 0 个或多个字符及 “?” 匹配一个字符,但通配符不能匹配主机名中的点号。*.flying.com.cn 可以匹配 ftp01.flying.com.cn,但不能匹配 backup.ftp01.flying.com.cn,而 *.*.flying.com.cn 就可以匹配 backup.ftp01.flying.com.cn。 ftp??.flying.com.cn可以匹配 ftp01.flying.com.cn 和 ftp02.flying.com.cn。
◆ 主机网络 可以用主机网络的方式导出特定的子网或几个子网,用 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
这里主要关心