网络文件系统协议( 二 )


2.1文件系统模型
NFS假定文件系统是分层次的,除了最底层是文件,其它层次都是目录 。在目录中的每一个条目(文件,目录,设备等)都有一个字符串名 。不同的操作系统可能在目录树的深度或者使用的名字上有所限制,就象用不同的语义来描述“路径名”,它是在名字中把所有组成部分(目录和文件名)串联起来 。一个“文件系统”就是在一个单一的服务器上(通常是一个磁盘或者物理分区)有一个指定的“根”的树 。一些操作系统提供了“安装”操作使所有的文件系统出现在一棵单一的树上 。而其它的操作系统保持着一个文件系统“森林” 。文件是由无解释字节组成的无结构流 。第三版的NFS使用更普遍的文件系统模型 。
NFS一次只查询路径名中的一个组成部分 。为什么不一次就得到整个路径名,返回一个文件句柄呢?这里有一些不这样做的原因 。首先,路径名需要在路径的组成部分之间有分隔符 。不同的操作系统使用不同的分隔符 。我们可以定义一种网络上标准的路径表示法,但是每一个路径名在每一个终点上将必须进行语法分析和转换 。其它的问题在第三节(NFS实现中的问题)里讨论 。
尽管文件和目录在许多方面是相似的对象,但是读目录和读文件也需要不同的过程 。这里提供了描述目录的网络标准格式 。使用象上面相同的参数来确定一个过程,此过程在每次调用的时候只返回一个目录项 。这种方法产生的问题就是效率不高 。目录包含着许多目录项,远程调用要返回每一项将是非常缓慢的 。
2.2服务器过程
这个协议被定义为一组过程,这组过程具有用RPC语言(XDR语言在程序,版本,过程声明方面的扩展)定义的参数和结果 。每一个过程功能的简要描述都应该提供足够答应实现的信息 。2.3节具体地描述了基本数据类型 。
在NFS协议中的所有过程都假定是同步的 。当一个过程返回给客户端,客户可以假定此操作已经完成,与请求相关的任何数据现在在一个稳定的存储上 。例如,客户端的WRITE请求可能导致服务器更新数据块,文件系统信息块(比如间接块),和文件属性信息(大小和修改时间) 。当WRITE返回给客户端,客户端假定这个写操作是可靠的 。甚至在服务器崩溃的情况下,它也能丢弃这些已经写的数据 。这就是服务器无状态的一个非常重要的部分 。假如服务器等待来自远程请求的刷新数据,客户端必须保存这些请求,以便在服务器崩溃的情况下再次发送这些请求 。
/*
*远程文件服务程序
*/
programNFS_PROGRAM{
versionNFS_VERSION{
voidNFSPROC_NULL(void)=0;
attrstatNFSPROC_GETATTR(fhandle)=1;
attrstatNFSPROC_SETATTR(sattrargs)=2;
voidNFSPROC_ROOT(void)=3;
diropresNFSPROC_LOOKUP(diropargs)=4;
readlinkresNFSPROC_READLINK(fhandle)=5;
readresNFSPROC_READ(readargs)=6;
voidNFSPROC_WRITECACHE(void)=7;
attrstatNFSPROC_WRITE(writeargs)=8;
diropresNFSPROC_CREATE(createargs)=9;
statNFSPROC_REMOVE(diropargs)=10;
statNFSPROC_RENAME(renameargs)=11;
statNFSPROC_LINK(linkargs)=12;
statNFSPROC_SYMLINK(symlinkargs)=13;
diropresNFSPROC_MKDIR(createargs)=14;
statNFSPROC_RMDIR(diropargs)=15;
readdirresNFSPROC_READDIR(readdirargs)=16;
statfsresNFSPROC_STATFS(fhandle)=17;
}=2;
}=100003;
2.2.1不做工作
voidNFSPROC_NULL(void)=0;
这个过程不做工作,在所有RPC服务中它可以用来答应服务器响应测试和定时 。
2.2.2获得文件属性
attrstatNFSPROC_GETATTR(fhandle)=1;
假如响应状态是NFS_OK,那么响应属性包含由输入fhandle指定的文件的属性 。

推荐阅读