よくある質問・用語集

  • もっと調べる
  • どうやって使う?

NFSとは

NFSとは、LinuxなどUNIX系のOSで利用されるファイル共有システムである。NFSでは、データの実体はNFSサーバと呼ばれるファイルサーバに存在する。NFSクライアントは、NFSサーバの公開されたディレクトリをネットワーク越しにマウントする。この機能を使うと、複数のホストから同じファイルを共有することができる。

NFSの使い方

NFSは、Linuxには標準的に取り込まれている。そのため、インストールも容易であり、導入は難しくない。なお、使い方については、「CentOS 7で作る ネットワークサーバ構築ガイド」などで詳しく解説されている。

NFSサーバ

NFSサーバでは、自サーバのストレージの中から、どのディレクトリを誰に公開するかを設定する。設定は、/etc/exportsファイルで行い、exportfsコマンドで管理する。

NFSクライアント

NFSクライアントでは、NFSサーバ名と共有名を指定して、マウント処理を行う。マウントするときに、次のようないくつかのオプションを指定することができる。

  • NFSを利用するプロトコル(TCP/UDP)

  • 利用するNFSバージョン

  • 読み込み専用か書込み可能か

  • rootアカウントの扱い

  • NFSキャッシュの有無

  • タイムアウト時の扱い

用途によって、タイムアウトの扱いには注意が必要である。ハードマウントの場合には、NFSサーバが応答するまで無条件に待機する。ソフトマウントの場合には、NFSサーバが無応答になると、上位プロセスにI/Oエラーを返す。また、割り込み(intr)モードにしておくと、ハードマウントの状態から、シグナル操作でソフトマウントに切り替えることができる。

NFSでのrootアカウントの扱い

NFSでは、rootアカウントの扱いには注意する必要がある。原則としては、クライアントのrootアカウントは、NFSサーバ上のファイルやディレクトリに対して管理する権限を持たず、常にother(ユーザでなく、グループにも所属しない)パーミッションとして扱われる。そのため、重要な変更はNFSサーバ側で行う必要がある。

NFSのバージョンと問題点

初期のNFSの通信はUDPのみがサポートされていたが、NFSv3以降はTCPもサポートされるようになった。現在のNFSプロトコルの主流はNFSv3とNFSv4である。

NFSは、ロック機構を利用するとパフォーマンスがあまりよくない、NFSクライアントのキャッシュの持ち方によって正確な情報が保証されない、などといった問題を抱えている。

NFSv3とセキュリティ

NFSv3は、非常に古い設計になっているため、インターネット上では安全に利用することができない。例えば、NFSでは標準ではUDPを利用し、ポート番号は、portmapperという仕組みでランダムに割り当てられるようになっている。そのため、ファイアウォールなどで通信相手を絞り込むことが難しい。RedHat Enterprise Linuxでは、mountdやstatdなどのサービスプログラム毎にTCP Wrapperで通信相手を制御できるようになっているが、十分とは言えない。
そのため、NFSv3のサーバは、インターネットに直接的に接続しないように利用する必要がある。

NFSv4

NFSv4は、NFSをインターネット上でも利用できるように改良したバージョンである。portmapperが必要なくなり、TCPが標準になった。2049番ポートで通信が行われるため、パケットフィルタリングなどのセキュリティを掛けることも容易になった。また、NFSv4では、Kerberos認証もサポートされ、パフォーマンスの向上も図られている。

NFSv4では、NFSサーバ上のエクスポートしたい複数のファイルシステムを一つにまとめてエクスポートすることができる仮想ファイルシステムに対応している。その他、ロックのメカニズムも変更になっている。

NFSキャッシュの扱い

NFSでは、パフォーマンスを高めるため、クライアント側でデータをキャッシュする。そのため、多数のクライアントからNFSサーバ上のファイルの読み書きをしていると、まれにキャッシュの一貫性が取れなくなり、クライアントによって見えるファイルのバージョンが異なる状況が発生する場合がある。これは、ファイルのinode、サイズ、更新日時などだけで、ファイルの更新を管理しているためである。このような場合には、キャッシュを無効にするなどの対策が必要になることがある。ただし、キャッシュを無効にすると、パフォーマンスは低下してしまう。

そのため、よりファイルを安全に更新するために、ファイルを移動してから、元の名前に新しいファイルを書き出すなどの手法を使う場合もある。

NFSのロック処理

NFS上でのロックの扱いについては、十分に考慮する必要がある。NFSのロック機構は問題を引き起こすことが多いためである。そのため、NFSのロックは基本的に使わない前提でシステム設計を行なうことが多い。データベースのようなロック処理が必須のアプリケーションのデータストアとしてNFSを使うことは推奨されない。

なお、NFSv3とNFSv4では、ロックの扱いが大幅に変わっている。そのため、注意が必要である。

NFSサーバの用途

NFSサーバでデータを共有する用途としては、メールサーバやWWWサーバのストレージが多い。また、最近ではCloudStackOpenStack、VMWareなどの仮想基盤のストレージとしても頻繁に使われている。バックアップファイルの配置場所として利用されることも多い。ただし、最近は、バックアップにはオブジェクトストレージを利用することも多い。
一方、前述したロック処理の問題で、データベースなどのデータ保管には適さない。

NFSは、コンテナとの相性も非常に良い。Kubernetesなどのコンテナ管理基盤を利用しても、永続的なストレージを何にするのかは、非常に重要な問題である。NFSは、複数のコンテナから同時に永続ストレージとして利用することができる。そのため、コンテナをステートレスに保つことができる。

NFSサーバのスケーラビリティ

NFSは、残念ながらスケーラビリティに配慮した設計になっているとは言えない。しかし、現実的にはパフォーマンスの改善が必要になったり、容量の拡大が必要になる場合がある。

NFSのパフォーマンス

NFSサーバのパフォーマンスは、NFSサーバで利用しているディスクのスピードと、NFSを管理するプロセスの数によって左右される。そのため、できるだけ高速なディスクを利用することが推奨される。また、多数のクライアントから利用する場合には、管理プロセス数をチューニングする必要がある。また、キャッシュの大きさも性能に大きな影響を与えるため、キャッシュサイズのチューニングも必要となる。

NFS容量の拡大

NFSサーバのディスク容量を拡大するためには、サーバ自体のディスク容量を拡大する必要がある。NFSは物理ストレージの配置とは無関係なため、ディスク容量が必要なディレクトリに外部ストレージをマウントするなどの方法で、ディスク容量を拡大することができる。特に、NFSv4では仮想ファイルシステムをサポートしているため、追加のディスクは利用しやすくなっている。
また、LVMなどを利用してファイルシステムの容量を拡大できるようにサーバを設計しておけば、後から全体の容量を増やすこともできる。

NFSサーバの冗長化

NFSは、重要なデータの保管に利用される場合が多い。仮想基盤のストレージや、負荷分散を行うサービスで利用している場合、データを配置するNFSサーバが停止すると、システム全体が停止してしまう。そのため、NFSサーバを使うときには、冗長化を考慮する必要がある

NFSをサポートした外部ストレージ機器は、この冗長化のレベルによって、価格が大きく異なる。最近では、安価な製品でも、ハードディスクの故障では停止しないようにRAIDなどを使ってハードディスクの冗長性を確保しているものが多い。しかし、実際にはLANインタフェース、CPU、データバスなども冗長化する必要がある。このように完全な冗長化を実現できるNFS専用機は、非常に高価である。

そのため、OSSの冗長化ソフトウェアであるPacemakerDRBDなどを使ったNFSクラスタを構築することも多い。ほとんどの場合には、LinuxサーバでNFSストレージを作成し、適切にチューニングすることで十分な機能、性能を得ることができるからである。専用機に比べて、バックアップなどの自由度も大きく、メリットも大きい。

NFSと互換性のあるネットワークファイル共有

NFSは、通信プロトコルとしても一般的であり、NFSと互換性のあるファイルシステムも公開されている。

GlusterFS

GlusterFSは、分散型のファイル共有システムである。複数のサーバのディスクをつなげて、一つの大きなファイルシステムを作ることもできる。データのレプリケーションもサポートしており、冗長性を担保することもできる。
GlusterFSは、専用のプロトコルで利用することもできるが、オプションでNFSをサポートしている。NFSを使ってマウントすることで、キャッシュも利用できるようになり、パフォーマンスの改善も期待できる。
GlusterFSについては、「GlusterFS調査報告書」に詳しく解説されている。

NFS以外のネットワークファイル共有との違い

NFS以外にもファイル共有を行うことができる方法には、いくつかの方法がある。

オブジェクトストレージ

オブジェクトストレージは、データをファイルではなく、オブジェクトという単位で保存する。オブジェクトストレージには、NFSのような階層構造のファイルシステムという概念はない。ファイルには属性を付けて管理、検索することが可能である。膨大なデータを扱うのに適している。
Amazon S3互換の通信プロトコルを利用するものが多い。OSSでは、OpenStack Swift、Ceph、Minioなどのオブジェクトストレージが知られている。

ネットワークストレージ

インターネット上で頻繁に使われるようになったストレージサービスのように、Webや専用のアプリケーションで操作を行うストレージである。DropboxやGoogle Driveなどが有名である。インターネット上のサービスは、ディスク容量によって課金されたり、機密情報を扱うためにはセキュリティの心配があるため、ownCloudNextcloudなどのオープンソースのネットワークストレージソフトウェアを使って、オンプレミス/クラウド上に専用のシステムを構築して利用するケースも多い。主に、文書ドキュメント、画像、動画などの管理に利用される。

CIFS

CIFS(Common Internet File System)は、Microsoft社のWindowsなどで利用できる共有ファイルシステムである。LinuxなどのUNIX系OSでは、CIFSを利用するためにSambaという互換プロトコルが実装されている。

CIFSはファイルシステム自体を利用するためにユーザ認証(ユーザ名とパスワード)を必要とするのに対し、NFSでは利用許可したホストがファイルシステムをマウントでき、ユーザ認証という概念が存在しない。

これはそれぞれのシステムの歴史的背景による。Windowsシステムの前身であるMS-DOSはシングルユーザOSであり、ネットワーク上のファイルシステムにアクセスするためにより個人を特定するのに重きを置いていた。これに対し、UNIX系のシステムでは当初からマルチユーザ環境のOSであったことから、ネットワーク上のファイルシステムも複数ユーザが同時利用することを前提としていた。NFSサーバからファイルシステムをマウントすること自体にはユーザ認証という概念を持たず、ファイルシステム上のファイルやディレクトリにUNIXファイルシステムと同様のユーザ権限を与えるといった設計思想になっている。

このことから分かるように、NFSは運用管理や仕組みが簡明になっているため、UNIX系のOSで作られたシステムでは、Windows系のOSがファイルシステムをマウントして利用することがない場合には、NFSを利用するほうが運用管理しやすく、またオーバヘッドも少ない。Windows系のOSがネットワークファイルシステムに直接アクセスするような環境では、CIFSを利用するのが望ましい。

例えばデージーネットでは、フロントエンドにメール受信サーバやPOPサーバなど複数のサーバを備えたメールシステムでのメールボックスの共有にはNFSを利用して構築しており、また社内のファイル共有(社内の個人端末にはWindows端末やLinux端末が混在している)にはCIFSを利用している。

デージーネットのNFSに対する取り組み

デージーネットでは、負荷分散の目的で複数のサーバでシステムを構成することが多い。ロードバランサを使って、2台以上のサーバに処理を分散する。このような場合には、データ共有をNFSを使って行なうことが多い。また、最近ではOpenStackCloudStackKubernetesなどの仮想基盤のストレージとして利用することも多い。
こうした用途では、NFSサーバの冗長化は必須である。そのため、OSSのクラスタソフトウェアを使ったNFSクラスタを構築するサービスを行っている。

【カテゴリ】:ファイルシステム  Linux関連技術  ネットワークインフラ  システム管理  

  • もっと調べる
  • どうやって使う?

【Webセミナー】自社でOSSを採用しよう!今更聞けないOSSの基本セミナー

日程: 11月22日(金)Webセミナー「BigBlueButton」を使用します。
内容: OSSを導入したいけど、どこから手をつければいいかわからない方必見!
ご興味のあるかたはぜひご参加ください。

セミナー申込

関連用語

NFSに関連するページ(事例など)

NFSとは先頭へ