網路文件系統

網路文件系統（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