Network File System

**Network File System**（**NFS）**は、ネットワークを介して他のコンピュータ上のファイルを共有・操作するための分散ファイルシステムおよびその通信プロトコルである。1984年にサン・マイクロシステムズ開発し、主にUnix系システムにおける共有ストレージ基盤として用いられる。

最初の規格はNFS version 2 (NFS v2) であり、・・・・・ などによって定義されている。

## 概要
NFSは、ローカルに接続されたストレージをネットワークを介してリモートの計算機に提供する分散ファイルシステムとそのプロトコルである。マウントされたNFSボリュームは、ネットワーク上にあることを意識せずローカルと同じように利用出来る。NFS v2, v3 では、Network File System#関連プロトコルで述べるように、ファイルロック機能やクォータ管理機能などはNFSプロトコル本体に含まれず、それぞれ別のプロトコルによって提供される。これらは NFS v4 ではプロトコル本体に含まれている。
　ネットワークファイルシステムに代わる方法としてリモートファイルシェアリング()がある。リモートファイルシェアリング(RFS)は、大部分の System V 系 UNIX や BSD 系 SunOS にてオプションである。

### ポート番号
NFSのサービスは一般的にTCPの2049番ポートで提供される。NFS v4はTCPのみだが、NFS v3はTCPとUDP（同じく2049番ポート）を使える。ボリュームを提供するNFSサーバとそれを利用するクライアント間の遠隔手続き呼出し (RPC) には、NFSの一部として開発されたONC RPCを利用している。NFSv3までは、ファイルロックやマウント要求等のONC RPCに使われるポート番号はポートマッパーによって動的に割り当てられることが一般的であった。そのため、ポート番号を固定するオプションを持たない実装の場合、ファイアウォールによるポート番号ベースの通信制御は困難であった。NFSv4からは、同等の機構がNFS本体に組み込まれ、サーバ-クライアント間の通信にはTCPの2049番ポートのみを利用するようになった。

## 歴史
### NFS version 1
NFS version 1 (NFS v1) は、サン・マイクロシステムズ内の実験にとどまり、対外的なリリースはされなかった。

### NFS version 2
NFS v2の仕様は1984年に発表され、1985年にはNFS v2を初めて実装したSunOS 2.0がリリースされた。その後1989年3月には  が取りまとめられ標準化された。
NFS v2の開発にはRusty Sandberg, Bob Lyon, Bill Joy, Steve Kleimanなどが参加していた。元々のNFS v2では通信にUDPのみを利用することになっているが、これはファイルロック機能をNFSの枠組みの外で実装することでプロトコルをステートレスに保つのが目的であった。

### NFS version 3
1995年6月に  で定義されたNFS v3では、主に以下の機能追加が行われた。
* ファイルサイズおよび読み書き時に指定するオフセットの型を32bitから64bitに拡張し、4GiB以上のファイルをサポートした。
* 書き込み性能を向上させるため、サーバへの非同期書き込みをサポートした。
* ファイル属性を別途取得するプロシージャ呼び出しを省くために、多くのプロシージャでその返値にファイル属性を追加した。
* ディレクトリを走査する時、そこに含まれるファイル名に加えファイルハンドルと属性を一度に取得できる*READDIRPLUS*プロシージャを追加した。
また、NFS v2の時点ですでにTCPによる転送をサポートするベンダーが複数存在したことから、サン・マイクロシステムズはNFS v3からTCP転送を仕様に追加した。これによりWANを介したNFSがより安定して動作するようになった。

### NFS version 4
AFSやCIFSの存在を踏まえ、2000年12月に  で、また2003年4月に  で、さらに2015年3月に  で改定されたNFS v4では、COMPOUNDプロシージャを用いた複数のNFS処理の統合による性能の向上、ONC RPCにおけるKerberos認証を用いた強力なセキュリティ、またステートフルなプロトコルを導入した。NFS v4からはその開発主体がInternet Engineering Task Forceへ移動し、サン・マイクロシステムズに加えネットアップなども規格策定に携わった。

NFS version 4.1 は、2010年1月に  で、2020年8月に  で公開された。

NFS version 4.2 は、2016年11月に  で公開された。

## 関連プロトコル
NFSに付随するプロトコルは次のようなものがある。
;Network Lock Manager (NFS v2, v3)
:UNIX System Vに追加されたファイルロック機構
;クォータ情報の遠隔通知 (NFS v2, v3)
:NFSサーバが管理するクォータの状態をクライアントに通知するもので、*rquota*とも呼ばれる。なお、クォータ管理そのものはサーバの役割であり、クライアントはその情報を受け取っているだけである。
;WebNFS (NFS v2, v3)
:ウェブブラウザとNFSを統合し、ファイアウォールを介した利用を実現するNFS v2, v3の拡張

## アクセスコントロール
NFS v2およびNFS v3では、ユーザーのアクセス権限を表現するためにUNIXのユーザー識別子およびグループ識別子の整数値をそのまま用いている。
デフォルトではクライアント側に設定された識別子の整数値がそのままNFSサーバに渡され、サーバはそれを見てアクセスを制御する。クライアントとサーバ間でグループ識別子を別々に管理している場合では、管理者が用意したサーバ側とクライアント側の識別子対応表を参照するか、クライアントが用意したNISサーバあるいは専用のデーモン*ugidd*をサーバが参照するように設定することでアクセスコントロールを行う。

NFS v4では、原則としてユーザー識別子/グループ識別子を直接使うのではなく、書式「*(識別子)@(ドメイン名)*」にて記述されたユーザー名/グループ名を使用する。特に、ONC RPCにてKerberos認証を使用する場合は必ずこの書式を用いる必要がある。ホスト内部におけるユーザおよびグループ識別子の表現とこの書式との間の変換にあってはNFS v4の仕様では定義しておらず、全く変換しないことを含めて実装に任せている。Kerberos認証を用いない場合は、NFS v3以前の仕様であるユーザおよびグループ識別子の整数値をサポートすべきとしており(サーバでの送受信およびクライアントでの送信はSHOULD、クライアントでの受信はMUST)、それに加えてNFS v4にて追加された書式をサポートしても構わない。クライアントはサーバの整数値識別子対応を確認するためにユーザ名およびグループ名を一旦整数値として送信し、エラーとなった場合はNFS v4の書式に切り替えても良い。

### root squash
一般的に、「NFSサーバとクライアントは、互いに相手のホスト上での管理者特権をそのまま信頼することはできない」ため、管理者権限による無制限なアクセスをNFSクライアントに許可することは危険である。そのため、UNIXシステムでスーパーユーザを示す root (NFS v4) ユーザー識別子0 (NFS v2, v3) によるクライアントからのアクセスを、NFSサーバ側でより権限の低いユーザー識別子（例えば NFS v4 では nobody、NFS v2, v3 では65534や-2など）に強制的に割り当てる*root_squash*という機能を標準で有効にするものが多い。

## 利用可能なプラットフォーム
1985年にSunOS 2.0に最初に実装された後、HP-UX、Solaris、NEWS-OS、EWS-UX、Linux、FreeBSDなど多くのUNIX系OSに実装された。その他にもMac OSやWindows Server、クライアントWindowsの一部のエディション、NetWare、AS/400でも利用できる。1990年代初頭、Macintosh用NFSソフトウェアが米Wollongong社によりサポートされた。System 6.0.3以上のシステムで、かつAppleShareが必要とされ、日本では1991年有限会社データコントロールリミテッドが販売した。WindowsではServices for UNIXがNFSサーバおよびクライアントの機能を提供している。

## 注釈

## 関連項目
*Common Internet File System
*WebDAV
*ネットワークアタッチトストレージ (NAS)
*TCP Wrapper

## 参考文献
*
*
*
*
*
**
*
**
* 

### 出典


### 各プラットフォームに関する情報
*Linux
**
*FreeBSD
**
*Solaris
**