现在的位置: 首页 > 综合 > 正文

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

2013年01月07日 ⁄ 综合 ⁄ 共 10013字 ⁄ 字号 评论关闭

NFS服务器的工作原理 

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客户端,同样具体实现也依赖于操作系统。

NFS服务器 RPC

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

层    数

名    称

功    能

1

应用层
NFS

2

表示层
XDR

3

会话层
RPC

4

传输层
UDP,TCP

5

网络层
IP

6

数据链路层

7

物理层
Ethernet

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

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

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

安装配置NFS服务器

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,那么对于这个共享的目录来说,它具有root的权限。

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


(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)。


激活服务portmap和nfsd



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:以hostir这样的格式来显示客户主机名和挂载点目录。


(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.017    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.014    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图形化配置方法,这种方法简单明了且方便快捷。



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所示。

各复选框的功能如下。

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


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

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

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

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

抱歉!评论已关闭.