The Network File System (NFS)は、分散ストレージソリューションです。リモートディレクトリをローカルサーバーにマウントし、ローカルストレージであるかのように使用できるようにするファイルシステムプロトコルです。NFSを使用すると、複数のクライアントがリモートストレージを共有できます。定期的に共有リソースを必要とする環境に適しています。NFSは、ONC RPC(Open Network Computing Remote Procedure Call)システム上に構築されています。これはRFC(Request for Comments)で定義されているオープン標準です。これにより、誰でもこのプロトコルを実装できます。
このガイドでは、 Ubuntu 20.04上でNFSマウントをセットアップおよび設定する手順について説明します。
前提条件
NFSの説明が示すように、NFSの設定には2つの部分があります。
-
ホスト: 物理的にデータを保存し、そのストレージを「クライアント」システムと共有します。
-
クライアント: 「ホスト」に接続し、リモートストレージをローカルストレージであるかのように使用するシステム。
デモンストレーションでは、どちらもUbuntu 20.04で構成された2つのサーバーを使用します。以下は、Ubuntuサーバーをセットアップする方法に関する簡単なガイドです。このガイド全体を通して、これらのサーバーは ホストおよび クライアントと呼ばれます。なお、 クライアントに対する操作は、複数ある場合でも同じです。
サーバーには以下のIPアドレスが割り当てられています。これらのサーバーはCloudSigmaによってホストされています:
-
host: 31.171.240.79
-
client: 31.171.250.109
これらを適切なIPアドレスに置き換えてください。
NFSのインストール
NFSは公式のUbuntuリポジトリから簡単に入手できます。 ホスト用と クライアントシステム用で異なるソフトウェアパッケージがあります。
-
ホストへのNFSのインストール
ホスト側では、マシンがNFS ホストとして機能するためのコンポーネントが必要です。これは、パッケージ nfs-kernel-serverの形式で提供されます。UbuntuはパッケージマネージャーとしてAPTを使用します。まず、ターミナルを起動し、 APTパッケージデータベースを更新します:
|
1 |
host$ sudo apt update |

次に、 nfs-kernel-serverパッケージをインストールします。必要に応じて、 APTが追加の依存関係を処理します:
|
1 |
host$ sudo apt install nfs-kernel-server |

-
クライアントへのNFSのインストール
On the クライアントシステムでは、ネットワーク経由で ホストのディレクトリに接続する機能が必要です。NFSサーバー機能は必要ありません。Ubuntuでは、パッケージ nfs-commonにバンドルされています。 APTパッケージデータベースを更新します:
|
1 |
client$ sudo apt update |

次に、 nfs-commonパッケージをインストールします:
|
1 |
$ sudo apt install nfs-common |

ホスト上の共有ディレクトリ
次に、それぞれ異なる設定を持つ2つの個別のディレクトリを共有します。スーパーユーザーアクセスに関して、NFSマウントが機能する2つの主要な方法を示します。デフォルトでは、スーパーユーザーはシステム全体で何でも実行できる権限を持っています。ただし、NFSマウントされたディレクトリは、マウント先システムの一部ではありません。NFSサーバーは、スーパーユーザー権限を必要とする操作の実行を拒否します。この制限により、クライアントはNFSマウントに対して書き込み、所有権の再割り当て、その他のスーパーユーザーのタスクを実行する権限を持たなくなります。
マウントされたファイルシステム上で、特定の信頼できるユーザーにこれらのタスクの実行を許可することは可能です。ただし、そのような クライアントが ホストへのフルアクセスを取得する可能性があるため、一定のリスクが伴います。これは、適切なユーザー権限管理によって軽減できます。Linuxでは、sudoersファイルがシステム上のすべてのユーザー権限を制御します。詳細については、Linuxのsudoersファイルを設定する方法.
-
汎用マウント
最初の例は、デフォルトのNFS動作を使用する汎用NFSマウントです。このアプローチでは、クライアントがマウント上でスーパーユーザーのアクションを実行することは非常に困難です。このタイプのNFSマウントは、ファイルストレージ、CMS(コンテンツ管理システム)を使用したアップロード、またはプロジェクトファイルの共有などのためにデプロイするのが一般的です。
次の手順は、 ホストシステムで実行します。まず、 nfs:
|
1 |
host$ sudo mkdir -pv /var/nfs/general |

ディレクトリは sudo 権限で作成されたため、所有者は root:
|
1 |
$ ls -la /var/nfs/general |

デフォルトの設定では、NFSはセキュリティ対策として、クライアント側からのroot操作をすべて nobody:nogroup の資格情報に変換します。一貫性を保つために、ディレクトリの所有権を資格情報に合わせて変更します:
|
1 |
host$ sudo chown nobody:nogroup /var/nfs/general |
![]()
-
ホームディレクトリ
2つ目の例は、 host ユーザーのホームディレクトリをクライアントが利用できるようにすることです。選択されたクライアントの信頼できる管理者がアクセスして、ユーザーを便利に管理できます。 /home ディレクトリはデフォルトで存在するため、ディレクトリを作成する必要はありません。ディレクトリの権限に関しては、メリットよりも問題が多く発生するため、変更を加える必要はありません。
NFSエクスポートの設定
共有するディレクトリが作成されました。次に、クライアントがこれらを利用できるようにNFSを設定する必要があります。NFSは、共有するディレクトリを追跡するために設定ファイルを使用します。お好みのテキストエディタで次のNFS設定ファイルを開きます。
|
1 |
host$ sudo nano /etc/exports |

ファイルのコメントセクションには、設定の一般的な構文構造が記載されています。簡単に言うと、すべてのディレクトリは次の形式で宣言する必要があります。
|
1 |
$ <directory> <client>(<option_1>,<option_2>,...,<option_N>) |
共有することにした2つのディレクトリの設定は次のようになります。両方のディレクトリにほぼ同じ設定オプションがあります。
|
1 2 3 |
host$/var/nfs/general 31.171.250.221(rw,sync,no_subtree_check) host$ /home 31.171.250.221(rw,sync,no_root_squash,no_subtree_check) |

設定オプションの簡単な内訳は次のとおりです。
-
rw: クライアントにボリュームへの読み取りと書き込みの両方の権限が付与されます。
-
sync: 応答する前に、NFSに変更をディスクに書き込むよう強制します。これにより、より安定し一貫したエクスペリエンスが提供されます。応答はリモートボリュームの実際の状態を反映します。ただし、ファイル操作は遅くなります。
-
no_subtree_check: サブツリーチェックを防止します。無効にしない場合、ホストはクライアントからのすべてのリクエストに対して、エクスポートされたツリー内のファイルの存在を確認することを強制されます。これにより、クライアントがファイルを使用している間にファイル名が変更されるなど、多くの問題が発生する可能性があります。ほとんどの場合、サブツリーチェックを無効にすることをお勧めします。
-
no_root_squash: 前述のように、NFSはリモートのrootユーザーからのリクエストを非特権ユーザーに変換します。これは、ホストシステムへの不要なアクセスを防ぐための意図されたセキュリティ機能です。ただし、このオプションを使用すると、この動作が無効になります。
設定ファイルを保存してエディタを終了します。変更を有効にするには、NFSサーバーを再起動します。
|
1 |
host$ sudo systemctl restart nfs-kernel-server |
![]()
ファイアウォールの調整
どのサーバーにとっても、適切なファイアウォール設定は必須です。すでにUbuntu 20.04サーバーを適切に設定していると仮定すると、UFWファイアウォールが有効になっているはずです。これは、ほとんどのLinuxディストリビューションに付属している、シンプルでありながら強力なファイアウォールです。初心者向けに、UFW、その仕組み、および一般的なUFWの使用例を説明するクイックガイド.
デフォルトでは、ファイアウォールはすべての送受信トラフィックをブロックします。NFSサーバーが適切に接続してトラフィックを交換できるようにするには、NFSプロトコルの例外を追加する必要があります。まず、ファイアウォールのステータスを確認します。現在のすべてのルールも出力されます。
|
1 |
host$ sudo ufw status |

ご覧のとおり、システムへのSSHトラフィックのみが許可されています。NFSトラフィックを許可するための例外を追加する必要があります。
ほとんどの場合、必要なトラフィックを許可しつつ、最も制限の厳しいルールを使用することを強くお勧めします。そのため、特定のクライアントのみがホストに接続できるようにします。
|
1 |
host$ sudo ufw allow from 31.171.250.221 to any port nfs |

その後、ファイアウォールのステータスを再度確認します:
|
1 |
host$ sudo ufw status |

マウントポイントの作成
サーバーは、 クライアント システムがNFSプロトコルに接続することを許可する準備が整いました。次に、 クライアント を準備する必要があります。リモートボリュームにアクセスするには、それを クライアント にローカルマウントする必要があります。マウントポイントとしては、専用の空のディレクトリを使用することをお勧めします。
2つのリモートボリュームに対して、2つの個別のマウントポイントを作成します。
|
1 |
client$ sudo mkdir -pv /nfs/general |

|
1 |
client$ sudo mkdir -pv /nfs/home |

マウントポイントの準備ができたので、リモートボリュームをマウントする必要があります。
|
1 |
client$ sudo mount 31.171.240.236:/var/nfs/general /nfs/general |
![]()
|
1 |
client$ sudo mount 31.171.240.236:/home /nfs/home |
![]()
マウントが成功したかどうかを確認できます。マウントされているすべてのボリュームのリストを確認します。
|
1 |
client$ df -h |

これで完了です!リモートボリュームが正常にマウントされました。次のコマンドを使用して、スペースの使用状況を確認することもできます。
|
1 |
client$ du -sh /nfs/home |

NFSアクセスのテスト
ここまでは、リモートボリュームが正しくマウントされています。しかし、クライアントがリモートボリューム上のデータを読み書きできなければ意味がありません。検証するために、NFSマウント上にダミーファイルを作成します。ここでは、 root 権限でファイルを作成し、ルート固有の設定が正しく機能しているかどうかをテストします:
|
1 |
client$ sudo touch /nfs/general/write_test.txt |
![]()
次に、ファイルの所有権を確認します。
|
1 |
client$ ls -l /nfs/general/write_test.txt |

ご覧の通り、NFSはファイルの所有者を nobody:nogroup に変換しています。 /var/nfs/ generalディレクトリの所有権は nobody:nogroup になっているため、NFSがファイルの所有権を変換しています。もう一方のNFSマウントをテストしてみましょう。
|
1 |
client$ sudo touch /nfs/home/test_home.txt |
![]()
ファイルの存在と所有権を確認します。
|
1 |
Client $ ls -l /nfs/home/test_home.txt |

この場合、NFSはファイルの所有権を変換しませんでした。このクライアントは、管理者アクションを実行できるように設定されています。さらに、元の ホスト ディレクトリ /home の所有権は nobody:nogroup にはなっていません。.
追加のトリック
-
起動時のマウント
これまでは、ローカルディレクトリにNFSボリュームを手動でマウントする必要がありました。アンマウントしない限り、NFSマウントはシステムが再起動するまで維持されます。NFSボリュームを定期的に使用する場合、手動でのマウントは非常に面倒になります。複数のNFSマウントがある場合、それらを手動で1つずつマウントするのは現実的ではありません。
Using the /etc/fstab ファイルを使用すると、プロセスを自動化できます。起動時に、このスクリプトはターゲットのマウントポイントにNFSボリュームを自動的にマウントします。テキストエディタでファイルを開きます。
|
1 |
client$ sudo nano /etc/fstab |

ホストシステムのリモートボリュームをマウントするために、次の行を追加します。
|
1 2 3 |
client$ 31.171.240.236:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0 client$31.171.240.236:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0 |

スクリプトを保存してテキストエディタを閉じます。次回の起動時に、Linuxはリモートボリュームを自動的にマウントします。ボリュームの接続とマウントが行われるため、システムの起動に少し時間がかかる場合があることに注意してください。
-
NFSボリュームのアンマウント
リモートボリュームが不要になった場合は、ボリュームをアンマウントすることでクライアントシステムから削除されます。ただし、アンマウントする前に、アプリケーションやスクリプトがリモートボリュームを使用していないことを確認してください。NFSマウントのアンマウントは、他のマウントのアンマウントと同様です。この場合は、 /nfs/home および /nfs/general をアンマウントします。:
|
1 2 3 |
client$ sudo umount /nfs/home client$ sudo umount /nfs/一般 |

次に、動作を確認します:
|
1 |
クライアント$ df -h |

おわりに
このガイドでは、NFSサーバーを作成し、NFSリモート共有の基本をいくつか紹介しました。本番環境へのNFSの導入を検討している場合は、NFSプロトコルが暗号化されていないことに留意してください。これにより、中間者攻撃などのセキュリティ上の懸念が生じる可能性があります。
快適なコンピューティングを!
コメント
コメントはまだありません。最初のコメントを投稿しましょう。