一、简介
NFS(网络文件系统)为客户程序提供透明的文件访问。NFS的基础是Sun RPC:远程过程调用。客户程序使用NFS不需要做什么特别的工作,当NFS内核检测到被访问的文件位于一个NFS服务器时,就会自动产生一个访问该文件的RPC调用。
远程过程调用(Remote Procedure Call)是一种不同的网络程序设计方法。客户程序编写时只是调用了服务器程序提供的函数。在一个RPC过程中,实际上发生了下面一些过程:
(1) 当客户程序调用远程的过程时,它实际上只调用了一个位于本机上的由RPC程序生成的函数,这个函数称为客户残桩(stub),客户残桩将过程的参数封装为一个网络报文并将该报文发送给服务器程序。
(2) 服务器主机上的一个服务器残桩负责接收这个网络报文,它从网络报文中提取参数,然后调用服务器进程。
(3) 当服务器函数返回时,它返回到服务器残桩。服务器残桩提取返回值,把返回值封装成一个网络报文,然后将报文发送给客户残桩。
(4) 客户残桩从接收的网络报文中取出返回值,将其返回给客户程序。
二、XDR:外部数据表示
XDR用来对RPC调用报文和应答报文中的值进行编码,这些值包括RPC首部字段(XID、程序号、接收状态等)、过程参数和过程结果。XDR定义了很多数据类型以及它们如何在一个RPC报文中传输的具体形式。发送者必须采用XDR格式构造一个RPC报文,然后接收者将XDR格式的报文转换为本机形式。
三、端口映射器
包含远程过程的RPC服务器程序使用的是临时窗口,这就要求跟踪RPC程序使用了哪一个临时端口。端口映射器本身必须由一个知名端口111,同时由一个程序号(100000),一个版本号(2)。服务器程序使用RPC调用端口映射器注册本身,客户程序使用使用RPC调用端口映射器查询。
端口映射器提供4个服务进程:
(1) PMAPPROC_SET:RPC服务器启动时调用这个过程,注册程序号、版本号和带有一个端口的协议。
(2) PMAPPROC_UNSRET:RPC服务器删除一个已经注册的映射。
(3) PMAPPROC_GETPORT:RPC客户启动时调用,根据给定的程序号、版本号和协议来获得注册的端口号。
(4) PMAPPROC_DUMP:返回端口映射器数据库中所有记录。
四、NFS协议
(1) 访问的是一个本地文件还是NFS文件对于客户是透明的,当文件被打开时,由内核决定。
(2) NFS客户通过它的TCP/IP模块向NFS服务器发送RPC请求。NFS主要使用UDP,最新的实现也可以使用TCP。
(3) NFS服务器一般在端口2049接收作为UDP数据报的客户请求。
(4) NFS服务器收到客户请求时,它将这个请求传递给本地文件访问例程,后者访问服务器主机上的一个本地文件。
(5) 大多数NFS服务器是多线程的,可以处理多个请求。
(6) 客户也可以运行多个NFS客户。
五、文件句柄
文件句柄是一个不透明的对象,用来引用服务器上的一个文件或目录。服务器创建文件句柄,把它传递给客户,然后客户访问文件时使用这个句柄。
六、安装协议
客户必须在访问服务器上一个文件系统中的文件之前,使用安装协议安装哪个文件系统。一般时客户主机引导时完成。
七、NFS过程
NFS服务器主要提供一下15个过程:
(1) GETATTR:返回文件属性
(2) SETATTR:设置文件属性
(3) STATUS:返回一个文件系统的状态
(4) LOOKUP:查找一个文件
(5) READ:读数据
(6) WRITE:写数据
(7) CREATE:创建文件
(8) REMOVE:删除文件
(9) RENAME:重命名文件
(10) LINK:为一个文件构造一个硬链接
(11) SYMLINK:为一个文件构造一个符号链接
(12) READLINK:读符号链接
(13) MKDIR:建立目录
(14) RMDIR:删除目录
(15) READDIR:读目录。
TCP上的NFS详见P355。
八、无状态
NFS的一个特征是NFS服务器是无状态的。无状态设计的理由是为了在服务器崩溃并且重启动时,简化服务器崩溃恢复操作。
九、服务器崩溃
(1)如果服务器文件系统是“硬”安装的,则客户向服务器的请求将永远重传下去;
(2)如果服务器文件系统是“软”安装的,客户重传了固定数目的次数后就会放弃。