网络文件系统

网络文件系统（Network File System，缩写作 NFS）是一种分布式文件系统，力求客户端主机可以访问服务器端文件，并且其过程与访问本地存储时一样，它由太阳微系统（已被甲骨文公司收购）开发，于1984年发布。

它基于开放网络运算远端程序呼叫（ONC RPC）系统：一个开放、标准的RFC系统，任何人或组织都可以依据标准实现它。

## 版本和产品

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

### NFSv2

NFSv2最初在SunOS 2.0上面实现，1985年发布。

参与NFSv2设计实现的人包括罗素·桑德柏格（Russel Sandberg）、鲍伯·里昂（Bob Lyon）、比尔·乔伊、史提夫·克莱曼（Steve Kleiman）等。

NFSv2 的定义RFC 1094，于1989年3月发布。

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

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

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

### NFSv3

Version 3（RFC 1813，1995年6月）添加如下功能：

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

在NFSv2发布后不久，NFSv3协议提案就在Sun Microsystems内部被提出，其主要目的是解决NFSv2进行同步写操作的性能问题。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

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

### NFSv4.1

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

### NFSv4.2

NFSv4.2 于2016年发布，新增了对稀疏文件、空间预留、跨设备复制等功能的支持。

### 其他扩展

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

各种NFS相关的外挂／捆绑协议：

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

NFS over RDMA 是NFS对远端直接内存存取（RDMA）协议的适配，就是将默认的传输层协议TCP替换为RDMA。

## 平台

NFS 通常用在 Unix 操作系统上（比如 Solaris、AIX及HP-UX）和其他 类Unix 的操作系统（例如 Linux 及 FreeBSD）。同时在其他一些操作系统也提供了NFS实现，例如经典的 Mac OS、OpenVMS、Microsoft Windows、OS/2、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 编码夏季计划的一部分）。

<image>

## 典型实现

假设一个Unix风格的场景，其中一台计算机（客户端）需要访问存储在其他机器上的数据（NFS 服务器）：

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

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

## 外部链接

- RFC 5661 - Network File System (NFS) Version 4 Minor Version 1 Protocol
- RFC 5403 - RPCSEC_GSS Version 2
- RFC 3530 - NFS Version 4 Protocol Specification
- RFC 2054 - WebNFS Specification
- RFC 2339 - Sun/ISOC NFS Change Control Agreement
- RFC 2203 - RPCSEC_GSS Specification
- RFC 1813 - NFS Version 3 Protocol Specification
- RFC 1790 - Sun/ISOC ONC RPC Change Control Agreement
- RFC 1094 - NFS Version 2 Protocol Specification
- IETF: Network File System Version 4 (nfsv4) Charter
- Linux NFS Overview, FAQ and HOWTO Documents
- NFS operation explained with sequence diagrams
- Review of "Why NFS Sucks" Paper from the 2006 Linux Symposium by Mike Eisler, October 27, 2006