FreeBSD上的NFS

3/28/2005来源:FreeBSD教程人气:11672

在众多的文件系统中,FreeBSD的支持的是非常独特的,那就是网络文件系统(NFS)。NFS可以使一台或几台机器通过网络共享目录或文件。使用NFS,用户和程序能够访问远程系统上的文件就如同访问本地的一样。 

NFS有以下几种特性: 
本地工作站无须太多磁盘空间,因为常用的数据被存放在单一的机器上并且还会剩余一些空间可被网络上的其它人访问。 

在网络上,每个用户不一定需要有唯一的home目录。一旦建立一个可以通过NFS使用的目录,那么它可以被网络上任何处访问。 

像软盘和CD-ROM能够在网络上被其它机器访问,而不需要额外的硬件。 

它如何工作 
NFS由两个方面组成--客户端和服务器端。考虑到它们的联系,客户端需要服务器端所拥有的数据。服务器与客户共享数据。为了这个系统正常地工作,少数进程不得不在限制下运行。 

服务器必须运行以下几个守护进程: 
nfsd--NFS的守护进程,它响应客户的请求。 
mountd--NFS Mount守护进程,真正实现nfsd传递给它的客户请求。 

客户端只需要运行一个守护进程: 
nfsiod--NFS异步I/O守护进程,响应从NFS服务器来的请求。 

设置NFS 
非常幸运,在FreeBSD系统上设置它是非常容易的。只需通过极少的修改/etc/rc.conf文件,就可以在启动时运行这个进程了。 

在NFS服务器上,请确定你有: 
nfs_server_enable="YES" 
nfs_server_flags="-u -t -n 4" 
mountd_flags="-r" 
每当NFS服务器启动时,mountd就自动运行了。-u和-t标志,告诉nfsd是否服务于UDP和TCP的客户端。-n 4标志,告诉nfsd运行自己的4个相同的拷贝。 

在客户端,确定你有: 
nfs_client_enable="YES" 
nfs_client_flags="-n 4" 
像nfsd,-n 4告诉nfsiod运行自己的4个拷贝。 

最后一个设置是要求你建立一个叫作/etc/exports的文件。这个文件指定你的服务器使用何种文件系统,以及哪几个客户端将要共享。这个文件中的每一行指定一个需要被共享的文件系统。在文件可以使用的这些选择是比较烦的,但只需要涉及其中一部分。你可以查找man page。 

这儿有几个例子: 
以下的几行输出/cdrom到三个"笨"机器上,它们有相同的域名,或者在你的/etc/hosts文件中登录过。-ro标志使得共享的文件系统只读,通过这个标志,远程系统将不可能在共享文件系统上作任何更改。 
/cdrom -ro moe larry curly 
下一行输出/home通过ip地址到三台主机。这是一个非常有用的设置,如果你有一个私有的网络,但没有DNS。-alldirs标志可以使指定的文件系统中的所有目录被输出。 
/home -alldirs 10.0.0.2 10.0.0.3 10.0.0.4 
下一行输出/a到两台机器上,它们与NFS服务器在不同域上。-maPRoot=0标志允许在远程系统上的root用户,使用root权限向共享文件系统写入。除去-maproot=0标志,即使一些人有root权限访问远程系统,但它们不可以修改共享文件系统。 
/a -maproot=0 host.domain.com box.example.com 
为了使客户能够共享一个输出的文件系统,它必须有这个权限。确定你的客户列表在你的/etc/exports文件中。 
现在你已经改动了设置,你可以reboot并且在启动时运行了。或者你也可以在命令行下输入: 

在NFS服务器上: 
# nfsd -u -t -n 4 
# mountd -r 
在NFS客户上: 
# nfsiod -n 4 
现在你已经准备真正地挂起一个远程文件系统。有两种方法。在这个例子中,服务器名字是server,而客户端是client。如果你只是临时挂起一个远程文件系统或希望测试一下你的设置,你可以在客户机的命令行下,以root的权限输入: 
# mount server:/home /mnt 
这样将挂起在server上的/home到client的/mnt。如果一切都设置正确,那么你可以在/mnt下看见server上的文件. 
如果你愿意每次启动时都挂起一人远程文件系统,那么你就需要修改你的/etc/fstab文件.例如: 
server:/home /mnt nfs rw 0 0 
更多细节请参见fstab的man page. 


实际使用 

NFS有许多非常"酷"的用途.我在我管理的网络上大量使用它.以下只是我使用它的一部分方法:. 

在网络上,有好几台机器,但是只有一台机器有CD-ROM.为什么?因为我使用NFS使用所有的机器共享CD-ROM.而对于软驱其实也一样. 

如此多的机器,而你的个人文件就存储地非常地分散了.我使用一台中央NFS服务器存储了所有的用户的home目录,并且与其它机器一起共享它们,所以无论从何处登录,我总是有相同的home目录. 

当你准备在其中的一台机器上重新安装FreeBSD,使用NFS是一种方法.只要将光盘放入你的文件服务器,然后一切照旧. 
我有一个公共目录:/usr/ports/distfiles,所有的机器都共享它.这样,当我将要在一台已经安装过某个port的机器上安装这个port时,我不需要重新再下载一遍所有的源文件. 

问题汇总 
某些ISA的以太网卡可能会引起一些问题,特别是在NFS上.这些困难在FreeBSD上并不特别明显,但系统可能会受影响. 

这些问题几乎总是发生在以及联网的高性能工作站上,例如Sun公司的机器.NFS挂起将会工作非常好,一些操作也是成功的,但是突然server对client没有了响应,即使另外的系统请求继续被响应.这些问题通常在client系统上,无论client是FreeBSD或者是其它的工作站.许多系统上,一旦这个问题出现,系统将无法正常关闭.唯一的解决方法就是经常重置client,因为NFS的情况不能解决. 
尽管这个"正确"的解决方法是对付运行FreeBSD的高性能工作站,但这也是一个简单的安全的方法.如果FreeBSD系统是server,client运行时要有参数-w=1024.如果FreeBSD是client,那么挂起NFS文件系统时,要有参数-r=1024.如果需要在client上自动挂起NFS,这些选择需要在fstab的第四个域中输入,或使用mount命令的-o参数手动挂起. 

需要注意的是,在NFS server和client在不同的网络上时,这个问题也会出现.如果是这个原因,请确定你的路由器有必须支持UDP信息. 

下例中,fastws是高性能工作站的host名,freebox是一台有低效率网卡的FreeBSD系统.当然,/sharedfs将作为NFS文件系统,而在client上就是/project.在所用情况下,注意附加选项. 

将freebox作为client:在/etc/fstab中输入 
fastws:/sharedfs /project nfs rw,-r=1024 0 0 
如果是手工挂起: 
# mount -t nfs -o -r=1024 fastws:/sharedfs /project 
将freebox作为server,在fastws的/etc/fstab中输入: 
freebox:/sharedfs /project nfs rw,-w=1024 0 0 
如果需要手工挂起: 
# mount -t nfs -o -w=1024 freebox:/sharedfs /project 
几乎任何16-bit以太网卡不需要以上的关于读写的限制. 

对于细心的人,可能已经看出,何处出了这种错误,也就说明了此处为什么不可恢复正常的原因了.NFS是典型的每块8K的文件系统.(当然也可以优化成更小的).当最大的数据包在1500字节时,NFS的块被分成几个数据包,尽管它对于上层协议来说,还是一个独立的需要接收,确认并且组合的单元.高性能工作站能够从组成NFS单元的一个个紧接着的小包中还原这个包.在低效率的网卡中,后面的小包由于超时在与其在相同NFS单元中前面的小包到达目的地之前就会溢出,使用得整个单元不能被还原,并且不会发出确认信号.结果,工作站会超时,并且会重新再试一次,但是以8K一个单元,还是出现以上的错误,就这样永远休止. 

使单元的大小小于数据包的尺寸限制,这样就可以确保信号会被接收,并且收到确认信号,从而避免以上局面. 

当高性能服务器对一台配有高效的网卡的机器输入数据时,超时溢出仍会发生,但是这种超时溢出与以上所述的NFS的单元错误并不相同.当超时溢出发生时,受到影响的单元会被重传,而这次是它们被接收,确认,还原可能会成功. 


来源linux技术支持网站