著名的Sun公司在1984年设计和开发了NFS(网络文件系统)。NFS为客户端程序提供了对远程文件的透明访问功能,并且很大程度上具有硬件和操作系统平台无关的特性。NFS是第一个提供分布式文件服务的产品,其设计和实现在技术与商业上均取得了成功,在工业和学术领域被广泛采用。
l 存取透明性(Access transparency)
NFS客户组件为本地进程提供了与本地操作系统一样的API。这样无需修改已有程序就可以正确地访问远程文件。
l 位置透明性(Location transparency)
每个客户端将远程文件系统中的目录安装到本地命名空间以建立名字空间。通过合适的配置,每个客户端都可以建立起独立的命名空间以实现位置透明性。
l 迁移透明性(Mobility transparency)
文件系统可以在服务器之间迁移,但是每个客户端的远程安装表都必须独立更新。因此NFS还没有完全实现迁移透明性。
l 故障透明性(Fault tolerance)
NFS文件存取协议的无状态性和幂等性保证了客户端所观察到的远程文件错误模式与本地文件相似。客户端用户级进程以及客户端计算机的故障对服务器没有任何影响。
l 数据一致性(Consistency)
NFS提供了一些近似one-copy的原语来满足大多数应用程序的需求,但是并不推荐使用NFS实现文件共享来在不同计算机上进行通信等相对关联紧密地操作。
l 安全性(Security)
通过集成Kerberos,采用安全的RPC机制保证了用户识别以及数据传送的安全性。
l 高效性(Efficiency)
通过在服务器端和客户端同时采用缓存技术,达到了高效性。
NFS服务器组件驻留在每台做为NFS服务器计算机的内核中。当应用程序需要访问远程文件系统时,NFS客户端组件捕获请求,翻译成NFS协议的相应操作,并传递给远程计算机的NFS服务器组件。NFS客户端组件和服务器端组件之间通过远程过程调用来进行通信。Sun公司的RPC系统就是专门为NFS而开发的,通过配置能同时支持UDP和TCP协议,而NFS协议与二者均相容。图2.1是NFS的总体架构图,下面就其一些具体实现进行简单的介绍。
虚拟文件系统是为了实现存取透明性而设计的,消除用户程序对本地文件和远程文件的操作上的差异。如图2.1所示,通过VFS组件,其他支持Unix系统调用的分布式文件系统也可以集成进来。VFS组件能够区分本地文件和远程文件,并对上层系统调用提供统一的接口,消除二者的不一致性,然后根据保存的文件信息,将文件访问请求传给本地的Unix文件系统或者NFS客户端组件或者其他文件系统。
NFS客户端组件模仿标准Unix文件系统原语,并与Unix内核集成在一起,向普通应用程序提供一些合适的接口。由于客户端组件与内核集成在一起而不是作为一个库来提供,因此:用户程序通过Unix系统调用就可以存取文件,而无需重新编译和装载;通过共享缓存最近使用块,单个客户端组件能为所有用户级进程提供服务;传送给服务期用来识别用户身份的密钥可以保留在内核中,防止用户级客户的窃取。客户端组件与虚拟文件系统一起协同工作,其扮演的角色与Unix文件系统优点类似,不过其负责的是服务器端文件与应用程序间的相互传送。
与普通的Unix文件系统不同,为了便于故障恢复,NFS服务器采用无状态性(statelss),并且不会为客户端保持文件处于打开状态。因此对于每次请求,服务器都会检查用户的身份以防止非法访问。Sun公司的RPC协议要求每个客户端的每个请求都得发送用户识别信息(比如,普通的Unix 16位用户ID和组ID)。NFS服务器在公开的端口上向所有的进程提供了RPC接口。这样的存取控制机制简单,但同时也带来了安全漏洞,客户端可以在未经用户允许的情况下,可以修改RPC调用,包含用户的ID来进行非法访问。为了关闭此漏洞,可以在RPC协议中选择对用户识别信息进行DES加密。最近,Kerberos已经与NFS集成在一起,为用户识别和安全问题提供了更强更全面的解决方法。
NFS服务器接口就是NFS服务器提供的一套RPC接口,同时包含了普通文件服务(Flat file service)和目录服务(Directory service):
l 普通文件服务
read(fh, offset, count)
write(fh, offset, count, data)-
getattr(fh)
setattr(fh, attr)
l 目录服务
lookup(dirfh, name)
create(dirfh, name, attr)
remove(dirfh, name)
rename(dir, name, todirfh, toname)
link(newdirfh, newname, fh)
symlink(newdirfh, newname, string)
readlink(fh)
mkdir(dirfh, name, attr)
rmdir(dirfh, name)
readdir(dirfh, cookie, count)
statfs(fh)
客户端安装远程文件系统需要一个运行在NFS服务器计算机上独立的用户级安装进程的支持。每个服务器上的文件/etc/exports中包含了可用于远程安装的本地文件系统名,并且每个文件系统名都有一个存取列表与之相关联,用来指明允许安装该文件系统的主机。
为了提高性能,NFS同时采用了服务器端缓存和客户端缓存技术,下面就二者分别进行一些简单的介绍。
NFS服务器端对服务器的Cache的使用与其它文件存取操作一样。使用服务器的Cache缓存最近读取得磁盘块不会引起一致性的问题;若服务器执行写操作,则需要采取措施保证即使服务器发生故障,客户端应该能够确信其数据没有丢失。在第3版NFS协议中,写操作为此提供了两种选择:
l 将客户端写操作中的数据缓存在服务器的Cache中,在回复客户端之间将其写入磁盘。这叫write-through技术,这样客户端就能确性其数据已经永久性保存。
l 写操作中的数据只保存在Cache中。只有收到客户端对相关文件的提交操作要求时才将其写入磁盘。客户端收到提交操作的回复时就能确信其数据已经永久性保存。标准NFS客户端就采用这种操作模式。