网络文件系统

网络文件系统(英语:Network File System,缩写作 NFS)是一种分布式文件系统,力求客户端主机可以访问伺服器端文件,并且其过程与访问本地存储时一样,它由Sun微系统(已被甲骨文公司收购)开发,于1984年发布[1]

它基于开放网络运算远程过程调用(ONC RPC)系统:一个开放、标准的RFC系统,任何人或组织都可以依据标准实现它。

版本和产品

编辑

NFSv1 只在SUN公司内部用作实验目的。开发团队在NFSv1的基础上做了重大改进之后将其对外发布,版本NFSv2由此产生。[2]

NFSv2最初在SunOS 2.0上面实现,1985年发布[3]

参与NFSv2设计实现的人包括罗素·桑德柏格(Russel Sandberg)、鲍伯·里昂(Bob Lyon)、比尔·乔伊、史提夫·克莱曼(Steve Kleiman)等。[1][4] NFSv2 的定义RFC 1094,于1989年3月发布。

NFSv2 最初只是基于 UDP。设计者旨在保持服务端是无状态的,而将“”等机制的实现独立于核心协议之外。[1] 这是一个关键决定,它使伺服器从故障恢复变得简单:当一个伺服器变得不可用时,所有的网络客户端冻结,但一旦伺服器恢复,每一个尝试重传的状态都包含在每个RPC里面,这是由客户端存根发起的。这样的设计决策允许UNIX应用程式可以忽视伺服器端的问题。

虚拟文件系统接口很容易模块化地实现一个简单的协议。在1986年2月,诸多操作系统实现了对NFSv2的支持,例如 System V release 2、DOS,以及使用Eunice英语Eunice (software)VAX/VMS[4]

由于 32-bit 的限制,NFSv2 只允读写文件起始2G大小的内容。

Version 3(RFC 1813,1995年6月)添加如下功能:

  • 支持 64 bit 文件大小和偏移量,即突破 2GB 文件大小的限制;
  • 支持服务端的异步写操作,提升写入性能;
  • 在许多响应报文中额外增加文件属性,避免用到这些属性时重新获取;
  • 增加 READDIRPLUS 调用,用于在遍历目录时获取文件描述符和文件属性;
  • 其他改进。

在NFSv2发布后不久,NFSv3协议提案就在Sun Microsystems内部被提出,其主要目的是解决NFSv2进行同步写操作的性能问题[5]。1992年7月的实现版本已经解决了NFSv2的许多不足之处,但是大文件支持(64位文件大小和偏移量)这一紧迫的问题还没有解决。这成为迪吉多公司的一个痛点,他们当时推出64位版本的Ultrix,以支持其新推出的64位RISC处理器Alpha 21064。在引入NFSv3时厂商们正在越来越多的支持TCP作为传输层协议。当时有些厂商已经在NFS version 2支持TCP做为传输层,Sun Microsystems 在发布NFSv3时也增加了将TCP作为传输层的支持。使用TCP做传输层使得NFS跨越 WAN 成为可能,并且可以突破 UDP 传输大小8K的限制,使用更大的读写数据单元。

NFSv4协议(RFC 3010,2000年12月;更新版 RFC 3530,2003年4月),借鉴了AFS(Andrew File System)和SMB/CIFS(Server Message Block)的特性,主要做了如下改进:性能提升,强制安全策略,引入有状态的协议。[6]从NFSv4开始,协议的实现/开发工作不再是由SUN公司主导开发,而是改为由互联网工程任务组(IETF)开发。

NFSv4.1

编辑

NFSv4.1(RFC 5661,2010年1月)旨在为并行访问可横向扩展的集群服务(pNFS扩展)提供协议支持。

NFSv4.2

编辑

NFSv4.2 于2016年发布。

其他扩展

编辑

WebNFS,一个NFSv2 v3的扩展,使得用户可以方便的通过网页浏览器与NFS服务端交互,且不受防火墙限制。在2007年,SUN公司开源了WebNFS客户端的实现[7]

各种NFS相关的外挂/捆绑协议:

  • 字节区间建议锁网络锁定管理(Network Lock Manager,缩写 NLM)协议(支持 UNIX System V 文件锁定 APIs)。
  • 远程配额记录(RQUOTAD)协议;使NFS用户可以查看服务端数据存储配额。

NFS over RDMA 是NFS对远程直接存储器存取(RDMA)协议的适配[8][9],就是将默认的传输层协议TCP替换为RDMA。

平台

编辑

NFS 通常用在 Unix 操作系统上(比如 SolarisAIXHP-UX)和其他 类Unix 的操作系统(例如 LinuxFreeBSD)。同时在其他一些操作系统也提供了NFS实现,例如经典的 Mac OSOpenVMSMicrosoft Windows[10]OS/2[11]Novell NetWare 还有 IBM AS/400。可选的远程文件访问协议还有服务器消息块(SMB, 或 CIFS)、 苹果归档协议(AFP)、NetWare核心协议(NCP)和 OS/400 文件伺服器文件系统(QFileSvr.400)。

在Microsoft Windows系统上 SMB 和 NetWare核心协议(NCP)的使用比 NFS 更广泛;在Apple Macintosh 操作系统上则 AFP 的使用更广泛;而在 AS/400 系统上 QFileSvr.400 更为常用。Haiku 在2013年3月添加了 NFSv4 支持(作为Google 编码夏季项目的一部分)[12]

 
NFS specint2008 性能比较,2013年12月22日

典型实现

编辑

假设一个Unix风格的场景,其中一台电脑(客户端)需要访问存储在其他机器上的数据(NFS 伺服器):

  1. 服务端实现 NFS 守护进程,默认运行 nfsd,用来使得数据可以被客户端访问。
  2. 服务端系统管理员可以决定哪些资源可以被访问,导出目录的名字和参数,通常使用 /etc/exports 配置文件 和 exportfs 命令。
  3. 服务端安全-管理员保证它可以组织和认证合法的客户端。
  4. 服务端网络配置保证可以跟客户端透过防火墙进行协商。
  5. 客户端请求导出的数据,通常调用一个 mount 命令。
  6. 如果一切顺利,客户端的用户就可以通过已经挂载的文件系统查看和访问服务端的文件了。

提醒:NFS自动挂载可以通过—可能是 /etc/fstab 或者自动安装管理进程。

参考文献

编辑
  1. ^ 1.0 1.1 1.2 Russel Sandberg, David Goldberg, Steve Kleiman, Dan Walsh, Bob Lyon. Design and Implementation of the Sun Network Filesystem. USENIX. 1985 [2015-05-14]. (原始内容存档于2011-12-13). 
  2. ^ NFS Illustrated (2000) by Brent Callaghan - ISBN 0-201-32570-5
  3. ^ Solaris Operating System (Unix). Operating System Documentation Project. [2015-03-11]. (原始内容存档于2019-04-03). 
  4. ^ 4.0 4.1 Russel Sandberg. The Sun Network Filesystem: Design, Implementation and Experience (PDF). Technical Report (Sun Microsystems). [2015-05-18]. (原始内容存档 (PDF)于2020-10-25). 
  5. ^ Brian Pawlowski, Chet Juszczak, Peter Staubach, Carl Smith, Diane Lebel, David Hitz. NFS Version 3 Design and Implementation. USENIX. 1994 [2016-01-12]. (原始内容存档于2015-11-24). 
  6. ^ NFS Version 4. USENIX. 2005-04-14 [2017-05-08]. (原始内容存档于2011-07-28). 
  7. ^ yanfs.dev.java.net[永久失效链接]
  8. ^ Tom Talpey. NFS/RDMA Implementation(s) Update (PDF). Network Appliance, Inc. February 28, 2006. (原始内容 (PDF)存档于2011年5月12日). 
  9. ^ Brent Callaghan. NFS over RDMA (PDF). Sun Microsystems. January 28, 2002 [2016-02-14]. (原始内容存档 (PDF)于2011-05-12). 
  10. ^ Introduction to Microsoft Windows Services for UNIX 3.5. technet.microsoft.com. Microsoft. [24 September 2016]. (原始内容存档于2018-06-18). 
  11. ^ NTFS plugin for NetDrive. ecsoft2.org. [2020-09-22]. (原始内容存档于2021-11-19). 
  12. ^ Paweł Dziepak. NFSv4 client finally merged. 2013-03-15 [2016-02-14]. (原始内容存档于2021-02-26). 

外部链接

编辑