Red Hat Enterprise Linux 5.0服务器构建与故障排除
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第7章 NFS服务器的安装和故障排除

本章要点

● NFS(Network File System,网络文件系统)服务器的工作原理。

● 安装配置NFS服务器。

● NFS的图形化配置。

● NFS的客户端配置。

● NFS服务器的故障排除。

7.1 NFS服务器的工作原理

7.1.1 NFS简介

NFS是分布式计算机系统的一个组成部分,可实现在异构网络上共享和装配远程文件系统。NFS由SUN公司开发,目前已经成为文件服务的一种标准(RFC1904,RFC1813)。其最大功能是可以通过网络让不同操作系统的计算机可以共享数据,所以也可以将其看做是一台文件服务器,如图7-1所示。NFS提供了除Samba之外,Windows与Linux及UNIX与Linux之间通信的方法。

图7-1 NFS可作为文件服务器

客户端PC可以挂载NFS服务器所提供的目录并且挂载之后这个目录看起来如同本地的磁盘分区一样,可以使用cp、cd、mv、rm及df等与磁盘相关的命令。NFS有属于自己的协议与使用的端口号,但是在传送资料或者其他相关信息时候,NFS服务器使用一个称为“远程过程调用”(Remote Procedure Call,RPC)的协议来协助NFS服务器本身的运行。

7.1.2 为何使用NFS

NFS的目标是使计算机共享资源,在其发展过程中(即20世纪80年代),计算机工业飞速发展,廉价CPU及客户端/服务器技术促进了分布式计算环境的发展。然而当处理器价格下降时,大容量的存储系统相对而言价格仍居高不下。因此必须采用某种机制在充分发挥单个处理器性能的同时使计算机可共享存储资源和数据,于是NFS应运而生。

7.1.3 NFS协议

使用NFS,客户端可以透明地访问服务器中的文件系统,这不同于提供文件传输的FTP协议。FTP会产生文件一个完整的副本;NFS只访问一个进程引用文件部分,并且一个目的就是使得这种访问透明。这就意味着任何能够访问一个本地文件的客户端程序不需要做任何修改,就应该能够访问一个NFS文件。

NFS是一个使用SunRPC构造的客户端/服务器应用程序,其客户端通过向一台NFS服务器发送RPC请求来访问其中的文件。尽管这一工作可以使用一般的用户进程来实现,即NFS客户端可以是一个用户进程,对服务器进行显式调用,而服务器也可以是一个用户进程。因为两个理由,NFS一般不这样实现。首先访问一个NFS文件必须对客户端透明,因此NFS的客户端调用是由客户端操作系统代表用户进程来完成的;其次,出于效率的考虑,NFS服务器在服务器操作系统中实现。如果NFS服务器是一个用户进程,每个客户端请求和服务器应答(包括读和写的数据)将不得不在内核和用户进程之间进行切换,这个代价太大。第3版的NFS协议在1993年发布,图7-2所示为一个NFS客户端和一台NFS服务器的典型结构。

图7-2 NFS客户端和NFS服务器的典型结构

(1)访问一个本地文件还是一个NFS文件对于客户端来说是透明的,当文件被打开时,由内核决定这一点。文件被打开之后,内核将本地文件的所有引用传递给名为“本地文件访问”的框中,而将一个NFS文件的所有引用传递给名为“NFS客户端”的框中。

(2)NFS客户端通过其TCP/IP模块向NFS服务器发送RPC请求,NFS主要使用UDP,最新的实现也可以使用TCP。

(3)NFS服务器在端口2049接收作为UDP数据包的客户端请求,尽管NFS可以被实现为使用端口映射器,允许服务器使用一个临时端口,但是大多数实现都是直接指定UDP端口2049。

(4)当NFS服务器收到一个客户端请求时,它将这个请求传递给本地文件访问例程,然后访问服务器主机上的一个本地的磁盘文件。

(5)NFS服务器需要花一定的时间来处理一个客户端的请求,访问本地文件系统一般也需要一部分时间。在这段时间间隔内,服务器不应该阻止其他客户端请求。为了实现这一功能,大多数的NFS服务器都是多线程的——服务器的内核中实际上有多个NFS服务器在NFS本身的加锁管理程序中运行,具体实现依赖于不同的操作系统。既然大多数UNIX内核不是多线程的,一个共同的技术就是启动一个用户进程(常被称为“nfsd”)的多个实例。这个实例执行一个系统调用,使其作为一个内核进程保留在操作系统的内核中。

(6)在客户端主机上,NFS客户端需要花一定的时间来处理一个用户进程的请求。NFS客户端向服务器主机发出一个RPC调用,然后等待服务器的应答。为了给使用NFS的客户端主机上的用户进程提供更多的并发性,在客户端内核中一般运行着多个NFS客户端,同样具体实现也依赖于操作系统。

7.1.4 RPC

因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动。每启动一个功能就会启用一些端口来传输数据,因此NFS的功能所对应的端口才没有固定,而是采用随机取用一些未被使用的小于724的端口来作为传输之用。但如此一来又造成客户端要连接服务器时的困扰,因为客户端要知道服务器端的相关端口才能够联机,此时我们需要远程过程调用(RPC)的服务。RPC最主要的功能就是指定每个NFS功能所对应的端口号,并且回报给客户端,让客户端可以连接到正确的端口上。当服务器在启动NFS时会随机选用数个端口,并主动地向RPC注册。因此RPC可以知道每个端口对应的NFS功能。然后RPC固定使用端口111来监听客户端的请求并回报客户端正确的端口,所以可以让NFS的启动更为容易。注意,启动NFS之前,要先启动RPC;否则NFS会无法向RPC注册。另外,重新启动RPC时原本注册的数据会不见,因此RPC重新启动后它管理的所有程序都需要重新启动以重新向RPC注册。

当客户端有NFS文件要存取请求时,它如何向服务器端要求数据?

(1)客户端会向服务器端的RPC(port 111)发出NFS文件存取功能的询问请求。

(2)服务器端找到对应的已注册的NFS daemon端口后会回报给客户端。

(3)客户端了解正确的端口后,就可以直接与NFS守护进程来联机。

由于NFS的各项功能都必须要向RPC注册,因此RPC才能了解NFS服务的各项功能的port number、PID和NFS在主机所监听的IP等,而客户端才能够通过RPC的询问找到正确对应的端口。即NFS必须要有RPC存在时才能成功地提供服务,因此我们称NFS为RPC Server的一种。事实上,有很多这样的服务器都向RPC注册。例如,NIS(Network Information Service)也是RPC Server的一种。所以如图7-3所示,不论是客户端还是服务器端,要使用NFS都需要启动RPC。

图7-3 NFS与RPC服务及操作系统的相关性

NFS协议从诞生到现在为止,已经有多个版本,如NFS V2(rfc794)及NFS V3(rfc1813)(最新的版本是V4(rfc307))。最早,SUN公司曾将NFS V2设计为只使用UDP,主要原因是当时机器的内存、网络速度和CPU的影响,不得不选择对机器负担较轻的方式。而到了NFS V3,SUN公司选择了TCP作为默认的传输方式。V3相对V2的主要区别如下。

(1)文件尺寸。

V2最大只支持32位的文件大小(4 GB),而V3新增加了支持64位文件大小的技术。

(2)文件传输尺寸。

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

(3)返回完整的信息。

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

(4)增加了对TCP传输协议的支持。

V2只提供了对UDP的支持,在一些高要求的网络环境中有很大限制;V3增加了对TCP的支持。UDP有着传输速度快且非连接传输的便捷特性,但是在传输上没有TCP稳定。当网络不稳定或者黑客入侵时很容易使NFS的性能大幅度降低,甚至使网络瘫痪。所以对于不同情况,网络要有针对性地选择传输协议。NFS的默认传输协议是UDP,然而RHEL 4.0内核提供了对通过TCP的NFS的支持。要通过TCP来使用NFS,在客户端系统上挂载NFS导出的文件系统时包括一个“-o tcp”选项。使用TCP的优点和缺点如下。

● 被提高了的连接持久性,因此获得的NFS stale file handles消息就会较少。

● 载量较大的网络的性能会有所提高,因为TCP确认每个分组,而UDP只在完成时才确认。

● TCP具有拥塞控制技术(UDP根本没有),在一个拥塞情况严重的网络上,UDP分组是被首先撤销的类型。使用UDP意味着,如果NFS正在写入数据(单元为8 KB的块),所有这8 KB数据都需要被重新传输。由于TCP的可靠性,8 KB数据中只有一部分需要重新传输。

● 错误检测。当TCP连接中断(由于服务器停止),客户端就会停止发送数据而开始重新连接。

UDP是无连接的,使用它的客户端就会继续给网络发送数据直到服务器重新上线为止。

● TCP的费用在性能方面的提高并不显著。

(5)异步写入特性。

(6)改进了服务器的mount性能。

(7)有更好的I/O写性能。

(8)更强的网络运行效能,使得网络运行更为有效。

(9)更强的灾难恢复功能。

在Linux上,UDP是默认使用的协议。作为服务器别无选择。但作为客户端,可以使用TCP和其他使用TCP的UNIX NFS服务器互联。在局域网中使用UDP较好,因为局域网有比较稳定的网络保证。使用UDP可以带来更好的性能,Linux默认使用V2,但是也可以通过mount option的nfsvers=n选择。NFS使用TCP/IP提供的协议和服务运行于OSI层次模型的应用层,如表7-1所示。

表7-1 OSI层次模型上的NFS

更多的NFS相关协议信息可以参考如下网页。

(1)http://www.faqs.org/rfcs/rfc794.html

(2)http://www.tldp.org/HOWTO/NFS-HOWTO/index.html

7.2 安装配置NFS服务器

如果在Red Hat Enterprise Linux 5安装时已经默认安装了NFS组件,接下来的工作主要是配置相关文件使服务器提供NFS服务,步骤如下。

(1)设定某台计算机为NFS服务器,并在后台启动相关的守护进程(在“服务配置”中启动)。一般来说,如果NFS服务器要提供服务,必须启动inet、portmap、nfs和mount这4个守护进程并保持在后台运行。

(2)规划服务器分区,从安全等方面定义哪些分区作为要共享的文件系统。

(3)在客户端列表中定义每一台客户机的参数。

(4)修改/etc/exports。

(5)重新启动NFS服务器,启动方法可采用命令行的方式,即/etc/rc.d/init.d/nfs restart。服务器端文件系统的共享设置有3种方法,一是直接修改/etc/exports文件;二是用exports命令来增加和删除目录;三是图形化的配置方法。

7.2.1 了解NFS网络文件的系统结构

NFS网络文件的系统结构包括如下目录结构:

1./etc/exports

这个文件是NFS的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在。可能要使用vi主动建立起这个文件,接下来的设定也仅仅是这个文件。

2./usr/sbin/exportfs

这是维护NFS共享资源的命令,我们可以用其重新分享/etc/exports变更的目录资源,并将NFS Server分享的目录卸载或重新分享等。这个命令是NFS系统中相当重要的一个,至于命令的用法在后面章节再介绍。

3./usr/sbin/showmount

showmount命令主要用在Client端,可以用来查看NFS共享出来的目录资源。

4./var/lib/nfs/*tab

在NFS服务器的登录文件都放置到/var/lib/nfs/目录中,在该目录下有两个比较重要的登录文件,一个是etab,主要记录了NFS所分享出来的目录的完整权限设定值;另一个是xtab,记录曾经连接到此NFS主机的相关客户端数据。

7.2.2 配置/etc/exports文件

用户可以把需要共享的文件系统直接编辑到/etc/exports文件中,这样当NFS服务器重新启动时系统就会自动读取/etc/exports文件,从而告诉内核要输出的文件系统和相关的存取权限。在下面的例子中显示了/etc/exports文件中几个条目项的内容,被挂载在/pub目录下的文件系统具有只读访问权限,所有的计算机在访问文件系统的时候不必经过安全检查。编辑/etc/exports文件:

# vi /etc/exports
/usr/sys/src -maproot=daemon host2
/usr/ports -ro -network 192.168.1.0

从上面这个例子中可以看出exports文件的格式,首先是定义要共享的文件目录。必须使用绝对路径,而不能使用符号链接。然后设置对这个目录进行访问限制的参数,用于保证安全性。在第1行设置中,将/usr/sys/src目录共享出去。但限制客户机上的root用户等价于本机上的daemon用户,以避免客户机上的root用户拥有这个服务器上的root权限进行非法操作。此后的host2参数是主机名,从而限制只有host2才能共享这个/usr/sys/src目录;第2行设置共享/usr/ports目录,但限制为只允许读取,并且也只有网络上的192.168.1.0计算机才能访问这个共享目录。

(1)rw:可读写权限。

(2)ro:只读权限。

(3)no_root_squash:当登录NFS主机使用共享目录的使用者是root时,其权限将被转换成为匿名使用者,通常它的UID与GID都会变成nobody身份。

(4)root_squash;如果登录NFS主机使用共享目录的使用者是root,那么对于这个共享的目录来说,它具有root的权限。

(5)all_squash:忽略登录NFS使用者的身份,其身份都会被转换为匿名使用者,通常即nobody。

(6)anonuid:通常为nobody,也可以自行设定这个UID的值,UID必须存在于/etc/passwd中。

(7)anongid:同anonuid,但是变为Group ID。

(8)sync:同步写入资料到内存与硬盘中。

(9)async:资料会先暂存于内存中,而非直接写入硬盘。

主机可以使用以下格式。

(1)单个机器:一个全限定域名(能够被服务器解析)、主机名(能够被服务器解析)或IP地址。

(2)使用通配符来指定的机器系列,使用 * 或 ?字符来指定一个字符串匹配。IP地址中不使用通配符。如果反向DNS查询失败,它们可能会碰巧有用。在完整域名中指定通配符时,点(.)不包括在通配符中。例如,*.example.com包括one.example.com,但不包括one.two.example.com.。

(3)IP网络:使用a.b.c.d/z,a.b.c.d是网络,z是子网掩码中的位数(如192.168.0.0/24)。另一种可以接受的格式是a.b.c.d/netmask,a.b.c.d是网络,netmask是子网掩码(如192.168.70.8/255.255.255.0)。

7.2.3 激活服务portmap和nfsd

命令如下:

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

portmap激活之后,就会出现一个端口号为111的sunrpc的服务。至于nfs则会激活至少两个以上的系统守护进程,然后就开始监听Client PC的需求。使用cat/var/log/messages可以查看操作是否成功:

#cat /var/log/messages
Nov 16 15:04:45 cao portmap: portmap startup succeeded
Nov 16 15:04:53 cao nfs: Starting NFS services:  succeeded
Nov 16 15:04:54 cao nfs: rpc.rquotad startup succeeded
Nov 16 15:04:54 cao nfs: rpc.mountd startup succeeded
Nov 16 15:04:54 cao nfs: rpc.nfsd startup succeeded

7.2.4 exportfs命令

如果修改了/etc/exports文件后不需要重新激活nfs,只要重新扫描一次/etc/exports文件,并且重新将设定加载即可:

# exportfs [-aruv]

参数说明如下。

(1)-a:全部挂载(或卸载)/etc/exports文件内的设定。

(2)-r:重新挂载/etc/exports中的设置,此外同步更新/etc/exports及/var/lib/nfs/xtab中的内容。

(3)-u:卸载某一目录。

(4)-v:在export时将共享的目录显示在屏幕上。

7.2.5 检验目录/var/lib/nfs/xtab

检验所共享的目录内容,查看/var/lib/nfs/xtab文件:

# vi /var/lib/nfs/xtab
/home/cao  192.168.0.1(rw,sync,wdelay,hide,secure,root_squash,
no_all_squash,subtree_check,secure_locks, mapping=identity,anonuid=-2,
anongid=-2)

此即/home/cao这个共享出去的目录预设NFS中的属性。

7.2.6 showmount

showmount命令如下:

# showmount [-ae] hostname

参数说明如下。

(1)-a或-all:以host:dir这样的格式来显示客户主机名和挂载点目录。

(2)-d或-directories:仅显示被客户挂载的目录名。

(3)-e或-exports:显示NFS服务器的输出清单。

(4)-h或-help:显示帮助信息。

(5)-v或-version:显示版本信息。

(6)--no-headers:禁止输出描述头部的信息。

当要扫描某一主机所提供的NFS共享的目录时,使用showmount -e IP(或主机名称hostname)即可。

7.2.7 观察激活的端口号

命令如下:

# netstat -utln
Active Internet connections (only SERVERs)
Proto Recv-Q Send-Q Local Address    Foreign Address        State
tcp       0     0 0.0.0.0:111    0.0.0.0:*             LISTEN <== portmap
tcp       0     0 0.0.0.0:817    0.0.0.0:*             LISTEN <== rpc.xxxx
tcp       0     0 0.0.0.0:1266   0.0.0.0:*             LISTEN <== rpc.xxxx
udp      0     0 0.0.0.0:2049   0.0.0.0:*              <== nfs的端口
udp       0     0 0.0.0.0:814    0.0.0.0:*                <== rpc.xxxx
udp       0     0 0.0.0.0:1327    0.0.0.0:*                <== rpc.xxxx
udp       0     0 0.0.0.0:111     0.0.0.0:*                <== portmap

nfs所开启的端口是2049,其他端口是RPC Server其他程序(例如rpc.mountd、rpc.rquotad及rpc.nfsd.)随机产生的。即端口号不会是固定的,每次restart nfs都会得到不一样的端口号。

7.2.8 启动和停止NFS服务器

在导出NFS文件系统的服务器中,nfs服务必须在运行。使用以下命令来查看NFS守护进程的状态:

/sbin/service nfs status

使用以下命令来启动NFS守护进程:

/sbin/service nfs start

使用以下命令来停止NFS守护进程:

/sbin/service nfs stop

要在引导时启动nfs服务,使用以下命令:

/sbin/chkconfig --level 345 nfs on

还可以使用ntsysv或服务配置工具来配置在引导时启动这些服务。

7.3 NFS的图形化配置

在Red Hat Enterprise Linux 5系统中,如果要配置NFS服务器,也可以使用NFS图形化配置方法,这种方法简单明了且方便快捷。

7.3.1 NFS服务器配置窗口

在shell提示符下输入system-config-nfs命令,打开“NFS服务器配置”窗口,如图7-4所示。

图7-4 “NFS服务器配置”窗口

7.3.2 添加NFS共享

在“NFS服务器配置”窗口中,如果要添加共享目录,可单击工具栏中的“添加”按钮打开“添加NFS共享”对话框,如图7-5所示。

图7-5 “添加NFS共享”对话框

“基本”选项卡中的选项如下。

(1)“目录”文本框:指要共享的目录,如/tmp/。

(2)“主机”文本框:指要共享目录的主机。

(3)“基本权限”选项组:指定共享目录应该有“只读”权限还是“读/写”权限。

首先在“目录”文本框中输入要共享的目录路径,或单击“浏览”按钮,打开“选择一个目录”对话框,在其中可选择一个系统目录来共享。

返回到“添加NFS共享”对话框,在“主机”文本框中输入主机名(即localhost或者输入NFS服务器的IP地址)作为NFS服务器名。在“基本权限”中为共享目录选择一个权限,系统默认是“只读”权限。

7.3.3 常规选项

返回到“添加NFS共享”对话框,单击“常规选项”标签,打开“常规选项”选项卡,如图7-6所示。

图7-6 “常规选项”选项卡

在该选项卡中,用户可根据需要选中相应的复选框,一般保留系统默认值即可。各个复选框的功能如下。

(1)允许来自高于724的端口的连接:在号码小于724的端口上启动的服务必须以根用户身份启动,选择该复选框来允许根用户以外的用户来启动NFS服务。该复选框和insecure相对应。

(2)允许不安全的文件锁定:不需要锁定请求,该复选框和insecure_locks相对应。

(3)禁用子树检查:如果某文件系统的子目录被导出,但是整个文件系统没有被导出,服务器会检查所请求的文件是否在导出的子目录中。这种检查叫做“子树检查”(subtree checking),选择这个复选框来禁用子树检查。如果整个文件系统被导出,选择该复选框检查可以提高传输率。该复选框和no_subtree_check相对应。

(4)按要求同步写操作:默认被启用,该复选框不允许服务器在请求被写入磁盘前回复这些请求。该复选框和sync相对应。如果清除该复选框,async选项会被使用。

(5)立即强制同步写操作:不推迟写入磁盘的操作,该复选框和no_wdelay相对应。

7.3.4 用户访问

在“添加NFS共享”对话框中,单击“用户访问”标签,打开“用户访问”选项卡,如图7-7所示。

图7-7 “用户访问”选项卡

各复选框的功能如下。

(1)把远程根用户当做本地根用户:按照默认设置,根用户的用户ID和组群ID都是0。根权限压缩(root Squashing)把用户ID 0和组群ID 0映射为匿名的用户和组群ID,因此客户端上的根用户就不会在NFS服务器上具备根特权。如果选择这个复选框,根用户就不会被映射为匿名用户,客户端上的根用户就会对导出的目录拥有根特权。选择这个复选框会大大降低系统的安全性,除非绝对必要;否则不要选择。该复选框和no_root_squash相对应。

(2)把所有客户用户当作匿名用户:如果选择该复选框,所有用户和组群ID都会被映射为匿名用户。该复选框和all_squash相对应。

(3)为匿名用户指定本地用户ID:如果把所有客户用户作为匿名用户选择,这个复选框会要求为匿名用户指定一个用户ID。该复选框和corresponds to anonuid相对应。

(4)为匿名用户指定本地组群ID:如果把所有客户用户当做匿名用户选择,这个复选框会要求为匿名用户指定一个组群ID。该复选框和corresponds to anongid相对应。

7.3.5 编辑NFS共享

在“NFS服务器配置”窗口中,选择要编辑的NFS共享目录和文件,然后单击“属性”按钮。若要删除某个现存NFS共享,可从列表中选中它,然后单击“删除”按钮。单击“确定”按钮从列表中添加、编辑或删除某个NFS共享后,更改就会立即生效。服务器守护进程被重新启动,原有的配置文件被保存为/etc/exports.bak,新的配置文件被写入/etc/exports。NFS服务器图形化配置工具可直接读写/etc/exports配置文件,因此这个文件在使用该工具后仍可以手工修改,修改该文件后也可以使用这个工具。

7.4 NFS的客户端配置

配置NFS服务器以后,网络中不同的计算机在使用该文件系统之前必须先挂载该文件系统。用户既可以通过mount命令挂载,也可以通过在/etc/fstab中加入条目项实现,/etc/fstab中的条目项中包括一个NFS的挂载类型。NFS文件系统的名称由文件所在的主机名加上被挂载目录的路径名组成,两个部分通过冒号分开。例如,computer1:/home/project指示一个文件系统被挂载在计算机computer1中的/home/project中。

这里推荐客户端使用mount命令来挂载,下面主要挂载的相关知识和方法,然后简单介绍直接编辑/etc/fstab文件的方法。

7.4.1 使用mount命令

用户同样可以在NFS的条目项中修改多个NFS特定的挂载选项,例如,可以指定往返数据包的大小和计算机等待系统响应的时间大小,或者指定一个文件系统是被硬挂载(hard-mounted)还是软挂载(soft-mounted)。对硬挂载文件系统来说,如果因为某种原因远程系统的响应失败,计算机将会持续地尝试建立连接;对软挂载文件系统来说,同样情况下,在指定的时间间隔后计算机将会放弃尝试建立连接而发送一个错误消息。默认采用硬挂载文件系统,系统硬挂载尝试失败时,对用户输入的响应也会停止。正是因为这样,有的用户更喜欢采用软挂载,它会使系统在尝试挂载失败后停止尝试。

mount命令的格式如下:

mount[-t vfstype] [-o  options] device dir

mount命令参数非常多,如下为与NFS相关的参数。

(1)-a:把/etc/fstab中列出的路径全部挂载。

(2)-t:需要mount的类型,如nfs等。

(3)-r:将mount的路径定为read only。

(4)-v mount:过程的每一个操作都有message传回到屏幕上。

(5)rsize=n:在NFS服务器读取文件时NFS使用的字节数,默认值是1024个字节。

(6)wsize=n:向NFS服务器写文件时NFS使用的字节数,默认值是1024个字节。

(7)timeo=n:从超时后到第1次重新传送占用的1/7秒的数目,默认值是7/7秒。

(8)retry=n:在放弃后台mount操作之前可以尝试的次数,默认值是7000次。

(9)soft:使用软挂载的方式挂载系统,若Client的请求得不到回应,则重新请求并传回错误信息。

(10)hard:使用硬挂载的方式挂载系统,该值是默认值,重复请求直到NFS服务器回应。

(11)intr:允许NFS中断文件操作和向调用它的程序返回值,默认不允许文件操作被中断。

(12)fg:一直在提示符下执行重复挂载。

(13)bg:如果第1次挂载文件系统失败,继续在后台尝试执行挂载,默认值是失败后不在后台处理。

(14)tcp:对文件系统的挂载使用TCP,而不是默认的UDP。

说明:mount NFS服务器的另一个重要参数是hard(硬)mount或soft(软)mount。

采用hard mount,NFS客户机会不断地尝试与NFS服务器连接(在后台一般不会给出任何提示信息),直到挂载上为止。

采用soft mount,会在前台尝试与NFS服务器连接,当收到错误信息后终止mount尝试,并给出相关信息。

例如,hard mount:

# mount -t nfs -o hard 192.168.1.4:/home/cao /home/nfs/cao

使用hard还是soft主要取决于访问的信息。例如,要查看NFS服务器的视频文件,不会希望由于一些意外的情况(如网络速度变得很慢)而使系统输出大量的错误信息。如果此时使用hard方式,系统就会等待,直到能够重新与NFS服务器建立连接传输信息。另外,如果是非关键数据,也可以使用hard方式,如FTP一些数据等,这样在远程机器暂时连接不上或关闭时就不会挂起会话过程。

7.4.2 扫描可以使用的NFS Server目录

在客户端本地建立mount point,使用mount挂载远程主机共享的目录。假设主机名是“www.cao.net”,使用showmount查看NFS Server可以共享的目录,然后将/home/public挂载在/home/nfs/public下:

# showmount -e www.cao.net
Export list for localhost:
/tmp        *
/home/linux  *.cao.net
/home/public (everyone)
/home/cao   192.168.1.4

7.4.3 卸载NFS网络文件系统

卸载NFS网络文件系统可以使用unmount命令:

umount /home/nfs/public
# unmount -a #取消所有已经挂载在mount上的路径

如果关机时NFS服务器中还有客户联机,建议在关机之前先关闭portmap与nfsd系统服务。如果无法正确关闭,那么应执行命令“netstat -utlp”找出PID。然后使用kill命令杀死进程,这样才能正常关机。

7.4.4 应用实例

本节介绍如何挂载/home/cao目录。

首先建立这个目录,然后利用mount指令来挂载NFS服务器的/home/cao目录:

# mkdir -p /home/nfs/cao
# mount -t nfs 192.168.1.4:/home/cao/home/nfs/cao

使用df命令查看挂载的目录,目录中已经包括NFS服务器IP地址的共享目录,如图7-8所示。

图7-8 挂载NFS服务器的共享目录

挂载后,只要进入/home/nfs/cao目录,即进IP地址为“192.168.1.4”那台NFS服务器的/home/cao目录中。

7.4.5 其他挂载NFS文件系统的方法

1.使用/etc/fstab来挂载NFS

要挂载其他机器上的NFS共享的另一种方法是在/etc/fstab文件中添加一行,在这一行中必须声明NFS服务器的主机名、要导出的目录,以及要挂载NFS共享的本地机器目录。必须是根用户才能修改/etc/fstab文件。

/etc/fstab中每行的一般语法如下所示:

server:/usr/local/pub   /pub   nfs   rsize=8192,wsize=8192,timeo=14,intr

挂载点/pub在客户端机器上必须存在。在客户端系统的/etc/fstab文件中添加这一行后在shell提示下键入命令mount,以及将会从服务器中挂载的挂载点/pub。

2.使用autofs来挂载NFS

挂载NFS共享的第3种方法是使用autofs,它使用automount守护进程来管理挂载点,只在文件系统被访问时才动态地挂载。

autofs咨询主映射配置文件/etc/auto.master来决定要定义哪些挂载点,然后使用适用于各个挂载点的参数来启动automount守护进程。主映射配置中的每一行都定义一个挂载点,一个分开的映射文件定义在该挂载点下要挂载的文件系统。如/etc/auto.misc文件可能会定义/misc目录中的挂载点,这种关系在/etc/auto.master文件中会被定义。

auto.master文件中的每个项目都有3个字段,第1个字段是挂载点;第2个字段是映射文件的位置;第3个字段可选,可以包括超时数值之类的信息。

例如,要在机器上的/misc/myproject挂载点上挂载远程机penguin.example.net中的/project52目录,在auto.master文件中添加以下行:

/misc   /etc/auto.misc --timeout 60

在/etc/auto.misc文件中添加以下行:

myproject  -rw,soft,intr,rsize=8192,wsize=8192 penguin.example.net:/proj52

/etc/auto.misc中的第1个字段是/misc子目录的名称,该目录被automount动态地创建,它不应该在客户端机器上实际存在;第2个字段包括挂载选项,如rw代表读写访问权,第3个字段是要导出的NFS的位置,包括主机名和目录。

autofs是一种服务,要启动这项服务,在shell提示下键入以下命令:

/sbin/service autofs restart

要查看活跃的挂载点,在shell提示下键入以下命令:

/sbin/service autofs status

如果在autofs运行时修改了/etc/auto.master配置文件,则必须在shell提示下键入以下命令来通知automount守护进程重新载入配置文件:

/sbin/service autofs reload

7.5 NFS服务器的故障排除

7.5.1 故障排除思路

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

(1)NFS客户机和服务器的负荷是否太高,服务器和客户端之间的网络是否正常。

(2)/etc/exports文件的正确性。

(3)必要时重新启动NFS或portmap服务。

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

service portmap restart
service nfs start

(4)检查客户端中的mount命令或/etc/fstab的语法是否正确。

(5)查看内核是否支持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服务。

7.5.2 NFS错误信息

NFS错误信息如表7-2所示。

表7-2 NFS错误信息

7.5.3 使用nfsstat命令查看NFS服务器状态

nfsstat命令显示关于NFS和到内核的远程过程调用(RPC)接口的统计信息,也可以使用该命令重新初始化该信息。如果未给定标志,默认是nfsstat -csnr命令。使用该命令显示每条信息,但不能重新初始化任何信息。

nfsstat命令的主要参数如下。

(1)-b:显示NFS V4服务器的其他统计信息。

(2)c:只显示客户机端的NFS和RPC信息,允许用户仅查看客户机数据的报告。nfsstat命令提供关于被客户机发送和拒绝的RPC和NFS调用数目的信息。

要只显示客户机NFS或者RPC信息,将该参数与-n或者-r参数结合。

(3)-d:显示与NFS V4授权相关的信息。

(4)-g:显示RPCSEC_GSS信息。

(5)-m:显示每个NFS文件系统的统计信息,该文件系统和服务器名称、地址、安装标志、当前读和写大小,以及重新传输计数

(6)-n:为客户机和服务器显示NFS信息。要只显示NFS客户机或服务器信息,将该参数与-c和-s参数结合。

(7)-r:显示RPC信息。

(8)-s:显示服务器信息。

(9)-t:显示与NFS标识映射子系统的转换请求相关的统计信息,要只显示NFS客户机或服务器信息,将-c和-s<br />选项结合。

(10)-4:当与-c、-n、-s或-z参数组合使用时,将包含NFS V4客户机或服务器的信息,以及现有的NFS V2和V3数据<br />。

(11)-z:重新初始化统计信息。该参数仅供root用户使用,并且在显示上面的标志后可以和那些标志中的任何一个组合到<br />统计信息的零特殊集合。

要显示关于客户机发送和拒绝的RPC和NFS调用数目的信息,输入:

nfsstat -c

要显示和打印与客户机NFS调用相关的信息,输入如下命令:

nfsstat -cn

要显示和打印客户机和服务器的与RPC调用相关的信息,输入如下命令:

nfsstat -r

要显示关于服务器接收和拒绝的RPC和NFS调用数目的信息,输入如下命令:

nfsstat -s

7.5.4 NFS典型故障排除步骤

1.个别客户端无法从一个或多个服务器导入

(1)在客户端中检查下列内容。

验证在客户端中是否有该本地目录,如果不存在,使用mkdir创建。例如,如下命令:

# mkdir /opt/adobe

检查局域网电缆是否没有损坏并已连接上,所有的连接是否有效。

/etc/hosts是否存在并且有“相关信息”。

/etc/fstab是否存在并且有“相关信息”,同时所有条目是否仍然指向服务器中的有效目录。

/etc/resolv.conf是否存在并且有“相关信息”(仅适于DNS)。

(2)在服务器中检查下列内容。

客户端尝试挂接的目录是否已存在并在配置文件中列出。

客户端是否具有挂接文件系统的权限。

相关信息说明如下。

/etc/hosts、/etc/fstab和/etc/resolv.conf中必须包含下列条目:

● /etc/hosts:系统主机名和IP地址,例如:

12.0.14.123 fredsys fredsys.mysite.myco.com

类似以下的条目:

127.0.0.1   localhost   loopback #[no SMTP]

● /etc/fstab:对于标准挂接,每个导入的文件系统对应一个条目。

● /etc/resolv.conf(仅域名服务[DNS]需要使用):系统所在域的名称,例如:

domain mysite.myco.com

至少一个名称服务器,例如:

nameserver 12.0.14.165

2.所有客户端都无法从指定的服务器导入

在服务器上执行下列步骤。

(1)确保服务器已启动且正在运行,并且服务器和客户端之间的局域网连接有效(是否可以从服务器ping通连接客户端,并且反之也可)。

(2)确保客户端要挂接的文件系统已在/etc/fstab中列出。

(3)重新启动NFS服务器。

如果这些补救方法都失败,而配置也正确(执行了上述所有测试),则服务器可能没有正确引导,应重新引导服务器。

3.其他NFS常见故障排除

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

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

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

(4)挂载文件系统的时候,客户端没有任何反应,则可能为客户端没有启动portmap服务。

(5)在NFS服务器中共享目录输出失败。

如果使用图形化窗口对共享目录进行配置,设置后必须测试共享目录的输出,以验证配置是否正确,通常图形化窗口不会报告配置错误。

使用“exportfs -v -a”命令检查/etc/exports文件中设置的共享目录是否能够正常输出,其中选项“-v”表示以冗余模式显示,即显示每一步的细节。

(6)显示“设备正忙”无法卸载。

在使用umount命令卸载远程NFS共享目录时,出现“设备正忙”等卸载失败消息。通常可能的原因是有一个进程仍然在使用这个目录,可以使用lsof命令来查看是否有进程正在使用该共享目录。

(7)挂载失败。

如果在挂载NFS共享目录时,客户端提示“RPC(Remote Procedure Call)failed”,即远程过程调用失败消息,则很可能是因为服务器上带有约束性质的防火墙错误地阻止了NFS客户端挂载NFS共享,即防火墙封锁了NFS或者RPC端口。为了解决这个问题,可以使用iptable命令打开服务器上的111(RPC)和2049(NFS)端口,允许NFS客户端访问服务器。

(8)NFS请求挂起。

如果客户端正在执行写操作,而服务器无法响应或者在网络上变得不可访问,那么在默认情况下(使用hard选项进行挂载)客户端进程将挂起直到写操作完成。如果不中止写操作,进程就不能从请求中退出。为了避免NFS请求挂起,在网络状况不稳定情况下可以在挂载目录时指定soft选项以允许操作因超时而退出,或者指定intr选项以允许用户在命令行上通过按下Ctrl+C组合键退出挂起的操作。

(9)NFS挂载在引导时挂起。

如果在/etc/fstab文件中设置了自动挂载NFS,但在系统引导时NFS共享目录暂时不可用,那么默认情况下引导进程将进入等待状态,直到NFS目录变得可用为止。如果所需等待的NFS目录是系统必须的,那么这种等待可能还可以接受。然而在很多情况下,用户只想让系统把挂载请求放在后台并继续引导系统。可以把bg选项添加到/etc/fstab文件中,这样在首次挂载请求超时之后,挂载请求会转入后台,系统继续引导。当需要在前台挂载NFS共享目录时可以将fg选项添加到/etc/fstab文件的挂载选项中。

7.6 本章小结

NFS(Network File System,网络文件系统)是分布式计算机系统的一个组成部分,可实现在异构网络上共享和装配远程文件系统。本章介绍了NFS服务器的工作原理,安装配置NFS服务器的方法,NFS服务器的图形化配置过程,NFS的客户端配置和NFS服务器的故障排除方法。