Unix/Linux编程:网络文件系统NFS的概念

远程文件存取和传送

很多早期的网络系统提供了文件传送服务,它允许用户把某文件的一个副本从一台机器移到另一台机器上。而更多近期的网络则提供了文件存取服务,它允许某个应用程序从一台远程机器上存取某个文件到。远程文件存取机制为每个文件保存了一个副本,并允许一个或者多个应用程序在需要时对此副本进行存取。

使用远程文件机制对文件进行存取的应用程序,可以同它所要存取的文件驻留在同一台机器上,也可以允许在某台远程机器上。当一个应用程序要存取一个驻留在某台远程上的文件时,该程序的操作系统将调用客户软件,这个客户软件与远程机器中的服务器联系,对该文件执行所请求的操作。与文件传输服务不同,该应用的系统并不立刻对整个文件进行检索或者存储,而是每次要传递一小块数据。

为了提供对驻留在某台计算机上的某些或者所有文件的远程存取能力,系统管理员必须让该计算机运行一个可以对存取请求进行响应的服务器。这个服务器对每个请求进行检查,以验证该客户是否具有对指定文件进行存取的权利,然后执行所指明的操作,最后向客户返回一个结果

Sun公司定义了一个叫做网络文件系统(Network File System, NSF)的远程文件存取机制。该机制允许在一台计算机上运行一个服务器,使得对其上的某些或者所有文件都可以进行远程存取

NEF对远程文件提供了与本地文件相同的操作。一个应用程序可以打开(open)一个远程文件以进行存取,可以从该文件中读取(read)数据,向该文件写入(write)数据,定位(seek)到文件中的某个位置,使用完毕后关闭(close)文件

异构计算机之间的文件存取

提供远程文件存取并不简单。除了基本的读写文件机制之外,文件存取还必须提供创建和销毁文件、读取目录、鉴别请求、认可文件保护以及对各种各样计算机表示之间的信息转换。因为远程文件存取服务把两台机器连接起来,所以它必须解决客户和服务器系统的文件命名方式的差异,用目录来表示路径,并且保存文件的有关信息

NFS的设计是适合异构计算机系统的。从一开始,NFS的协议、操作以及语义的选择都是为了方便多种计算机系统的交互。当然,NFS无法在所有操作系统上提供所有文件系统的功能。它只是试图定义一些文件操作来尽可能多的适应不同的系统,同时保证它的效率和较低的复杂度。

NFS设计在客户端保存状态信息,但允许服务器处于无状态。因为服务器是无状态的,所以服务的崩溃重启不会影响到客户

NFS

NFS下的文件

NFS使用了很多Unix文件系统的定义。它把文件看成是一种字节序列,允许文件增长到任意长度,允许用文件中的字节位置作为基准对文件进行随机存取。它也遵循与Unix相同的打开-读-写-关闭(open-read-write-close)规范,并提供大多数相同的服务

正如Unix一样,NFS也假定了一个分层结构的命名系统:它认为文件层次由目录和文件组成,一个目录可以包含其他目录和文件

NFS的文件类型

NFS使用与Unix相同的基本文件系统。它定义了服务器在指定文件类型时可以使用的枚举值:

enum ftype3{
	NF3REG = 1,  // Regular data file
	NF3DIR = 2,  // Directory
	NF3BLK = 3,  // Block-oriented device
	NF3CHR = 4,  // Character-oriented device
	NF3LNK = 5,  // Symbolic link
	NF3SOCK = 6, // Socket
	NF3FIFO = 7, // Named pipe
};

NFS文件模式

向Unix一样,NFS假定每个文件或者目录有一个指定其类型和存取保护的模式。如下表。表中使用了八进制数来表示这些比特;定义直接对应于Unix的stat函数的返回值:
在这里插入图片描述
尽管NFS为设备定义了文件类型,但它不运行远程设备进行存取(比如,一个客户不能对一个远程设备进行读写)。因此,尽管用户可以得到有关文件名的信息,但不能对设备进行操作,即使保护模式允许

尽管NFS定义了决定一个客户是否可以读写某特定文件的保护比特,但NFS拒绝远程机器对所有设备进行存取,即使保护比特指定为允许存取

NFS文件属性

与Unix类似,NFS有一个获得关于某文件的信息的机制。在谈到文件信息时,NFS使用了术语文件属性。结构fattr3描述了NFS所提供的文件属性:
在这里插入图片描述

如上图所示,它的概念以及大多数细节来源于Unix的stat函数所返回的信息

NFS客户和服务器

NFS服务器运行在一个具有本地文件系统的机器上。服务器使远程机器也可以对本地某些文件进行存取。

  • 一个机构往往指定一台具有很大磁盘空间的计算机来完成服务器的功能。这样的机器尝尝叫做文件服务器
  • 禁止用户在NFS服务器上运行应用徐有利于保持较低的负载,还有利于保证对存取请求的快速响应。

NFS客户运行在任意机器上,它可以对运行NFS服务器的机器上的文件进行存取。

  • 大多数NFS客户实现把NFS文件与计算机的本地文件系统结合起来,对应用程序以及用户隐藏文件的位置。例如,在windows文件名C:\D\E\F表示系统硬盘上目录D的子目录E中文件F。如果一个NFS客户被加到该系统中,并且被配置成可以对一个远程服务器上的文件进行存取,那么它可以使用windows命名方案。比如,管理原可能为所有远程文件选用形式为X:B的名字,其中B标识在远程文件系统中的一条路径
  • 当程序调用open对某个文件进行存取时,操作系统用路径名的语法来选择使用本地的还是远程的文件存取过程。如果路径指向一个远程文件,系统就使用NFS客户软件来存取远程文件;如果路径指向一个本地文件,系统就使用计算机的标准文件系统来存取该文件。如下图所示
    在这里插入图片描述

NFS客户操作

NFS是设计用来适应异构计算机系统的。但是远程文件系统所使用的路径名语法可能与客户所使用的不同。

为了适应这个差异,NFS遵循异构简单的原则:只在客户端解释全路径名。为在服务器的文件分层目录系统中跟踪一个全路径名,客户每次传送路径名的一个单元。比如:

  • 如果某客户用/作为分隔符,需要查找在某台服务器上的路径/a/b/c,
  • 客户先从获得服务器的根目录信息开始
  • 接着,客户要求服务器在给目录中查找名a。服务器发回有关a的信息。假定该信息显示a是一个目录
  • 然后,客户要求服务器在该目录中查找名b。当服务器应答时,客户证实b是否是一个目录,如果是一个目录,客户会继续要求服务器在其中查找名c
  • 最后,服务器发回有关c的信息作为响应

要求客户分析路径名的主要缺点是非常明显的:对路径上的每一个分量,都要在网络上进行一次信息交换。它的主要优点是:在一台给定计算机上,应用程序可用与本地文件相同的路径名语法来存取远程文件。最重要的是,应用程序和客户都可以在不知道文件位置或者服务器的命名上的命名约定的情况下,编写对远程文件就进行存取的操作。因此,客户可以不关心服务器的命名方案

为了保证客户上的程序独立于文件位置和服务器计算系统,NFS要求仅有客户来解释全路径名。客户每次向服务器发送路径的一个分量,并接收关于它所命名文件或者目录的信息。客户通过这种方法在服务器的文件分层结构中跟踪路径

NFS客户与Unix系统

Unix系统使用安装机制为多个磁盘上的每个文件系统创建一个统一的命名分层结构。NFS客户代码的Unix实现使用安装机制的扩展版,把远程文件系统集成到了本地文件系统中。从应用程序的观点来看,用安装机制的主要优点是一致性:所有的文件名都有相同的形式。一个应用程序从名字语法上无法判断一个文件是本地的还是远程的。如果在调用open时指明的路径包括NFS安装目录,操作系统最终将遇到远程安装点并把控制传给NFS客户端代码。NFS客户端继续分析路径名并查找路径分离,最终完成打开文件的操作。最后,NFS客户端到达路径的末尾,并返回远程文件的信息。系统为该远程文件创建描述符,应用程序在后面的read和write操作中使用该描述符。因此,当应用程序打开一个远程文件时,它得到一个针对该文件的整数描述符,正如对本地文件一样。只有操作系统知道描述符相关的内部信息,该信息说明该文件是通过NFS存取的远程文件。

只要应用程序对文件描述符进行操作(比如读),系统将检测描述符指向的是本地文件还是远程文件。如果是本地的,操作系统将按照通常的办法处理该操作。如果文件是远程的,操作系统就调用NFS客户代码,把该操作转换成一个等价的NFS操作,并向服务器发起一个远程过程调用

NFS安装

当管理员把NFS mount加到一个Unix mount表上时,必须指明一条运行NFS服务器的远程机器、在该服务器上的分层结构、一个本地目录(NFS mount将加到它上面)以及有关该mount的细节信息,比如下面:
在这里插入图片描述
上面每一行都对应一个NFS文件mount

  • 第一个字段指明一台运行NFS的服务器以及服务器的分层结构。
  • 第三个字段指明了远程文件系统所按照的本地目录。
  • type nfs意思是可以通过NFS存取到远程文件。每行括号中的参数指明了有关mount的更进一步细节,比如读写(rw)或者只读®

arthur:/p1指明/p1层在arthur目录上,他已经按照到本地目录/p1。系统管理员把arthur的/p1文件系统安装到具有相同木名字的本地目录中,这样便于两台机器上的用户用相同的名字对文件存取

NFS为Unix中的远程安装定义了两个基本的范例。软安装指明NFS客户应实现超时机制,并且,如果超时则认为服务器脱机。硬安装指明NFS不应使用超时机制。

系统管理员通过安排在系统启动时自动创建所有mount。一旦创建了一个NFS mount后,应用程序和用户就无法区别本地和远程文件了,远程文件的操作和本地文件的操作是一样的

文件句柄

一旦某个客户识别并打开了一个文件后,它需要有一种识别该文件的途径以便进行后继的操作(比如读/写)。而且,当客户通过服务器的分层结构来搜索某个目录或者文件时,它也需要一种识别它们的方法。为了解决这些问题,NFS让服务器给每个文件分配一个唯一的文件句柄作为标识符。当客户第一次打开某个文件时,服务器制造一个句柄,并把该句柄发回给客户。当客户再对该文件有操作请求时,就把该句柄发回给服务器

从客户的观点来看,文件句柄是一个用来标识文件的32字节的字符串。从服务器的观点来看,文件句柄是可以唯一标识某个文件的任意的字节集合。比如,某些信息可以使服务器快速的堆句柄解码或者能快速的定位文件,一个文件句柄可以对这些信息进行编码

文件句柄对客户是不透明的,也就是说,客户不能对句柄进行解码或自行创建一个句柄。只有服务器才可以创建文件句柄。而且,NFS服务器的安全实现使用了一种复杂的编码方式,以防止客户猜测某个文件的句柄。具体来说,服务器随机的选择句柄的某些比特以保证客户不能参加合法的句柄

为了提高安全性,服务器也可以限制句柄的使用时间。这样,一个客户就不能永远的拥有一个句柄。为了限制一个句柄的生命周期,服务器在句柄编码中引入了时间戳。如果句柄超时,服务器就拒绝使用该句柄对某文件的操作。

无状服务器的文件定位

因为NFS采用了无状态的服务器设计,所以服务器不能为每个使用文件的程序保存文件位置(file position),而由客户来存储所有文件的位置信息,每个发到服务器的请求也必须给出所要使用的文件位置

对目录的操作

从概念上来说,NFS定义目录是由一个对(pair)的集合组成的,每个对包含一个文件名和一个指向该文件额指针。目录可以为任何长度,没有限制

NFS提供的操作包括允许客户:向目录中insert文件;向目录中delet文件,在目录中搜索(search)一个名字;read目录中的内容

无状态的读目录

因为目录的大小是可以任意的,而通信网络对网络上报文的长度由一定限制,所以对目录内容的读取可能需要多次请求。NFS服务器是无状态的,因而服务器无法记录每个客户在目录中的位置

NFS设计者为了克服无状态服务器的这种限制,选用了这样一个方法:当服务器在应答进入某个目录的请求时,返回一个位置标识符。客户在下一次请求中用该位置标识符来说明它已经收到并还需要哪些目录项。因此,当客户想从一个远程目录中读取某些目录项时,它不断的重复请求,每次请求均用上一次请求所返回的位置标识符来指定本地请求的位置,以此逐步获得该目录

总结

Sun公司定义了一个叫做NFS的远程文件存取机制,它现在已经成为一个工业标准。为了允许多个客户访问同一服务器,并使服务器受客户崩溃的影响,NFS采用无状态服务器

因为NFS的设计是用作异构环境,所以客户无法知道所有服务器上的路径名语法。为了满足异构性,NFS要求客户对路径名进行分解,并且查找路径上的每一个分量。当客户查找某个特定路径名时,服务器返回一个32字节的文件句柄,客户在后继的操作中可以将它作为对文件或者目录的引用

大多数NFS定义与文件系统语法来源自Unix,NFS支持分层的目录结构,把文件看作一个字节的序列,允许文件动态增长,提供对文件的顺序或者随机存取,提供的有关文件的信息和Unix的stat函数所给出的几乎等价

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值