【ITニュース解説】Network File System (NFS): A Guide to Shared Storage
2025年09月28日に「Dev.to」が公開したITニュース「Network File System (NFS): A Guide to Shared Storage」について初心者にもわかりやすく解説しています。
ITニュース概要
NFSは、ネットワーク上のファイルをローカルのようにアクセス可能にするプロトコルだ。サーバーがディレクトリを共有し、クライアントがそれをマウントして利用する。NFSv4は現代の標準で、セキュリティ機能も備える。サーバー・クライアント間の設定手順を理解すれば、簡単にファイル共有システムを構築できる。
ITニュース解説
Network File System (NFS) とは、ネットワーク越しにファイルを共有し、あたかも自分のパソコンにあるかのように利用できる分散ファイルシステムプロトコルである。これは、ユーザーがファイルがローカルにあるかリモートにあるかを意識せずに利用できる「透明性」を目的としている。
NFSの基本的な仕組みは、クライアントとサーバーのモデルで動作する。ファイルを共有したいコンピューターが「NFSサーバー」となり、そのファイルをネットワーク越しに利用したいコンピューターが「NFSクライアント」となる。サーバーは特定のディレクトリを「エクスポート」(共有設定)し、クライアントはその共有されたディレクトリを「マウント」(自身のファイルシステムに接続)することでアクセスできるようになる。クライアントとサーバー間の通信には、Remote Procedure Call (RPC) というプロトコルが使われる。これは、クライアントがサーバーに対して「このファイルを読み込んでほしい」といった操作要求を送り、サーバーがそれを実行して結果を返す仕組みである。
NFSにはいくつかのバージョンが存在するが、特にNFSv3とNFSv4が重要だ。NFSv3は「ステートレス」であり、サーバーはクライアントの開いているファイルや状態に関する情報を保持しない。このため、サーバーが予期せず停止しても、クライアントは単純に最後の操作を再試行できるため、復旧が比較的容易である。しかし、この特性はファイルロックなどの高度な機能の実装を複雑にする側面がある。一方、NFSv4は「ステートフル」であり、セッションや強制的なファイルロックなど、クライアントの状態をサーバーが維持するようになった。これにより、パフォーマンスの向上、セキュリティの強化、ファイアウォールを越えた通信の改善など、多くの新機能と改善がもたらされた。現代ではNFSv4が標準として推奨されている。
セキュリティ面では、「root squash」という機能が重要である。これはNFSv3およびNFSv4でデフォルトで有効になっており、クライアントのroot(管理者)ユーザーがNFSサーバー上の共有ファイルにアクセスする際、サーバー上では権限の低い「nobody」や「nfsnobody」といったユーザーとして扱われる仕組みだ。これにより、もしクライアント側が乗っ取られてroot権限が奪われたとしても、サーバー上の全ファイルにrootとしてアクセスされることを防ぎ、セキュリティが向上する。
次に、具体的なNFSサーバーとクライアントの設定手順について解説する。例として、Ubuntu環境を使用し、IPアドレス192.168.1.100をNFSサーバー、192.168.1.200をNFSクライアントとする。
まず、NFSサーバー側の設定である。
- NFSサーバーのインストール: サーバーとなるマシンで、
sudo apt updateでパッケージリストを更新し、sudo apt install nfs-kernel-server -yコマンドでNFSサーバーパッケージをインストールする。通常、インストール後にNFSサービスは自動で有効化され起動するが、sudo systemctl enable nfs-serverとsudo systemctl start nfs-serverで明示的に有効化と起動も可能である。 - 共有ディレクトリの作成と設定: 共有したいディレクトリを作成する。例えば、
sudo mkdir -p /mnt/nfs_shareで/mnt/nfs_shareディレクトリを作成する。次に、このディレクトリの所有者をnobody:nogroupに変更し、すべてのユーザーが読み書き実行できる777のパーミッションを設定する (sudo chown nobody:nogroup /mnt/nfs_shareとsudo chmod 777 /mnt/nfs_share)。これは一般的なアクセスを許可する場合の例であり、セキュリティ要件に応じて細かく設定することも可能だ。 - ディレクトリのエクスポート設定: どのディレクトリをどのクライアントにどのような権限で共有するかは、
/etc/exportsファイルに記述する。sudo nano /etc/exportsでファイルを開き、共有したいディレクトリとその設定を追加する。例えば/mnt/nfs_share 192.168.1.200(rw,sync,no_subtree_check)と記述する。/mnt/nfs_share: サーバー上で共有するディレクトリのパスである。192.168.1.200: このディレクトリにアクセスを許可するクライアントのIPアドレスを指定する。特定のサブネット(例: 192.168.1.0/24)や、すべてを許可する*を指定することもできる。(rw,sync,no_subtree_check): 共有オプションである。rw: クライアントに読み書き両方のアクセスを許可する(読み取り専用の場合はro)。sync: クライアントからの書き込み要求があった場合、データがディスクに完全に書き込まれるまで待機してから応答を返す。これによりデータの一貫性と安全性が高まる。no_subtree_check: サブツリーチェック機能を無効にする。パフォーマンスと信頼性が向上するが、ごくわずかにセキュリティが低下する可能性がある。一般的に推奨されるオプションである。
- エクスポート設定の適用とファイアウォール設定:
/etc/exportsを変更したら、sudo exportfs -aコマンドで設定を即座に適用し、sudo systemctl restart nfs-serverでNFSサービスを再起動して変更を反映させる。さらに、ファイアウォールが有効な場合は、クライアントからのNFS通信を許可する必要がある。UbuntuのUFWを使用している場合、sudo ufw allow from 192.168.1.200 to any port nfsでクライアントIPからのNFSポートへのアクセスを許可するルールを追加し、sudo ufw enableでファイアウォールを有効化する。sudo ufw statusでルールの確認が可能だ。
次に、NFSクライアント側の設定である。
- NFSクライアントのインストール: クライアントとなるマシンで、
sudo apt updateでパッケージリストを更新し、sudo apt install nfs-common -yコマンドでNFSクライアントパッケージをインストールする。 - ローカルマウントポイントの作成: サーバーの共有ディレクトリをマウントするための、クライアント側のディレクトリ(マウントポイント)を作成する。例えば、
sudo mkdir -p /nfs/projectsで/nfs/projectsディレクトリを作成する。 - リモート共有のマウント: 作成したマウントポイントに、サーバーの共有ディレクトリをマウントする。
sudo mount 192.168.1.100:/mnt/nfs_share /nfs/projectsコマンドを実行する。192.168.1.100:/mnt/nfs_share: NFSサーバーのIPアドレスと、サーバーが共有しているディレクトリのパスである。/nfs/projects: クライアント側のマウントポイントである。
- マウントの確認:
df -hTコマンドを実行すると、マウントされたファイルシステムの一覧が表示される。この出力の中に、NFSサーバーのIPアドレスと共有ディレクトリがクライアントのマウントポイントに接続されていることが確認できるはずである。
これでNFSの共有設定は完了だ。実際にファイルを操作してテストできる。クライアント(192.168.1.200)で echo "Hello from the NFS client!" | sudo tee /nfs/projects/client_test.txt と実行し、クライアントのマウントポイント内にファイルを作成する。その後、サーバー(192.168.1.100)で cat /mnt/nfs_share/client_test.txt と実行すると、クライアントで作成したファイルの内容が表示される。これにより、ネットワーク越しにファイルが正常に共有され、アクセスできることが確認できる。