1 / 4
Linux
?/p>
NFS
的详细中文说?/p>
NFS
,网络文件系统(
network
filesystem
?/p>
,或许是使用
RPC
最突出的网络服务了。它允许你以访问任何本地文件一样的方法来访问远程主机上?/p>
文件。这是通过将客户端的内核功
能(它使用远程文件系统)与服务器端的
NFS
服务器功
能(它提供文件数据)相混合而成为可能的?/p>
这种文件访问对客户来说是完全透明的,
并且
可在各种服务?/p>
和各种主机结构上工作?/p>
NFS
提供的许多优点:
l
被所有用户访问的?/p>
据可以存放在一台中央主机上?/p>
由客户在引导启动时加载这个目录?/p>
例如?/p>
你可以将所有用
户的帐目存放在一台主机上,让你的网络上的所有用
户从那台主机上加?/p>
/home
目录。如
果也安装?/p>
NIS
的话,用户就可以登录进任何系统上,而始终在一组文件上工作?/p>
l
需
要耗费大量磁盘空间的数据可以被保存在一台主机上?/p>
例如?/p>
所有有?/p>
LaTeX
?/p>
METAFONT
的文件和程序可以在一个地方保存和维护?/p>
l
管理用的数据可以存放在单个主机上。不
再需要使?/p>
rcp
将相同的文件安装?/p>
20
个不同的机器上?/p>
NFS
在很大程度上是由
Rick
Sladkey
做出的,
[1]
他编制了
NFS
的内核代码和
NFS
服务器的大部分?/p>
后者源自于?/p>
Mark
Shand
编制?/p>
unfsd user-space NFS
服务器和
Donald Becker
编制?/p>
hnfs Harris NFS
服务器?/p>
?/p>
在让我们观看一?/p>
NFS
是如何工作的?/p>
一个客户可以请求将一台远程主机的目录加载?/p>
一个本地目录上,正如用加载一个物理设备同样的方法。然而,用于指定?/p>
程目录的句法
是不同的。例如,为了主机
vlager
?/p>
/home
加载?/p>
vale
?/p>
/users
上,管理员在
vale
上要发出
以下的命令:
[2]# mount
?/p>
t nfs vlager:/home /users
此时?/p>
mount
将试图通过
RPC
联系
vlager
上的
mountd mount
后台程序?/p>
服务器将检?/p>
vale
是否允许加载所考虑的目录,
如果行的话,
就返回一个文件句柄(
file
handle
?/p>
。这个文件句柄将被用于所有随后对
/users
下的文件的请
求。当
某人通过
NFS
访问一个文件时,内核就将一?/p>
RPC
调用送至服务器机器上?/p>
nfsd
?/p>
NFS
后台程序?/p>
?/p>
该调用将文件句柄?/p>
要访问的文件名以及用户的
user
?/p>
group id
作为?/p>
数。这些用于确定对指定文件的访问权限。为了避免非授权用户读取或修改文件,
user
?/p>
group id
在两台主机上必须相同?/p>
在许?/p>
UN*X
实现中,
NFS
的客户和服务器功能是作为?/p>
核层的后台程序实现的,是在系统引导时从用户空间启
动的?/p>
NFS
后台程序?/p>
nfsd
)在?/p>
务器主机上,
Block
I/O
后台程序?/p>
biod
)在客户主机上。为了提高吞吐率?/p>
biod
使用预读
?/p>
read-ahead
)和后写(迟写)
?/p>
write-behind
)来执行
同步
I/O
;同样,几个
nfsd
后台程序
通常是并发运行的?/p>
NFS
?/p>
Linux
实现稍微有些不同?/p>
客户代码被紧密地集成到内核的虚拟
文件
系统中(
VFS
)并且不需要通过
biod
进行另外的控制。另一方面,服务器代码完全?/p>
用户空间运行,所以同时运行该服务器的几个拷贝几乎是不可能?/p>
?/p>
因为
这将涉及到同?/p>
问题。目?/p>
Linux
?/p>
NFS
还缺乏预读和后写机制,但
Rick
Sladkey
计划今后将添加进去?/p>
[3]Linux
?/p>
NFS
代码的最大问题是
Linux
?/p>
1.0
版内核不能分配大?/p>
4K
的内存块?/p>
其结?/p>
是,
网络代码不能处理除去头大小等数据后大?/p>
3500
左右字节的数?/p>
报?/p>
这意味着对于?/p>
用默认的大的
UDP
数据报的系统(例如,?/p>
SunOS
上是
8K
?/p>
,从其上运行?/p>
NFS
后台?/p>
序上传回的数据,需要人工地切成小块。在?/p>
些环境下这会严重地损害系统性能?/p>
[4]
?/p>
个限制在最近的
Linux-1.1
内核中已不复存在,并且客户代码也已进行了修改以克服这个问
题?/p>
11.1
准备
NFS
在你能够使用
NFS
之前?/p>
不管是作为服务器还是客户,你必须确信你的
内核已将
NFS
支持编译进去了。对此,较新的内核在
proc
文件系统上有一个简单的接口?/p>
?/p>
/proc/filesystems
?/p>
?/p>
?/p>
?/p>
?/p>
?/p>
?/p>
?/p>
cat
?/p>
?/p>
?/p>
?/p>
?/p>
$
cat
/proc/filesystemsminixext2msdosnodev
procnodev
nfs
如果这个列表中没?/p>
nfs
,那么你?/p>
须编译你自己的启用了
NFS
的内核。配置内核网络选项在第三章?/p>
?/p>
内核配置
?/p>
一节中作过
解释。对?/p>
Linux 1.1
以前的内核,要找出你的内核是否启用了
NFS
支持的最容易的方法是
实际地试着加载一?/p>
NFS
文件系统。对于此,你可以?/p>
/tmp
下建立一个目录,并试着往?/p>
加载一个本地目录:
#
mkdir
/tmp/test#
mount
localhost:/etc/
tmp/test
如果这个加载尝试失败
了,并有一段出错信息指?/p>
“fs type nfs no supported by kernel?/p>
,那么你就必须制作一个启?