UbuntuでNFSマウントを設定する方法(ステップバイステップガイド)
Ubuntu 20.04を使用していませんか?別のバージョンまたはディストリビューションを選択してください。
紹介
NFS(ネットワークファイルシステム)は、リモートディレクトリをサーバーにマウントできる分散ファイルシステムプロトコルです。これにより、異なる場所のストレージスペースを管理し、複数のクライアントからそのスペースに書き込むことができます。NFSは、ネットワークを介してリモートシステムにアクセスするための比較的標準的でパフォーマンスの高い方法を提供し、共有リソースに定期的にアクセスする必要がある状況でうまく機能します。
このガイドでは、UbuntuにNFSサーバーおよびクライアントソフトウェアをインストールし、NFSエクスポートを構成し、NFSマウントポイントを設定し、fstabエントリを使用して永続的なNFSマウントを作成する方法について説明します。
理想的なパフォーマンスを得るためには、NFSサーバーとクライアントの両方に10 Gbitのネットワークを備えたプレミアム専用ドロップレット(PDD)を使用することをお勧めします。
- 10Gbitネットワークを使用することで、NFSのパフォーマンスが公表されたボリューム制限に近づくことができます。
- 10ギガビットのドロップレットがないと、パフォーマンスは2ギガbpsに制限されます。
前提条件
このチュートリアルでは、2つのサーバーを使用し、一方がもう一方とファイルシステムの一部を共有します。これに従うためには、次のものが必要です:
-
2つのUbuntuサーバーがあります。これらの各サーバーには、rootでないユーザーが
sudo権限を持ち、UFWでファイアウォールが設定されており、もし可能であればプライベートネットワークがあるべきです。 非rootユーザーを
sudo権限とファイアウォールで設定するための支援については、私たちのUbuntuを使用した初期サーバー設定ガイドを参照してください。サーバーとクライアントにDigitalOcean Dropletsを使用している場合、VPCを作成する方法に関するドキュメントでプライベートネットワークの設定について詳しく読むことができます。
このチュートリアル全体を通して、ディレクトリを共有するサーバーをホストと呼び、これらのディレクトリをマウントするサーバーをクライアントと呼びます。両方のIPアドレスを知っておく必要があります。利用可能な場合は、プライベートネットワークアドレスを使用してください。
このチュートリアル全体を通して、これらのIPアドレスを host_ip と client_ip のプレースホルダーで参照します。必要に応じて置き換えてください。
ステップ1 — コンポーネントのダウンロードとインストール
まず、各サーバーに必要なNFSコンポーネントをインストールします。
ホストで
ホストサーバーに、ディレクトリを共有するためのnfs-kernel-serverパッケージをインストールします。このセッションでaptを使用する最初の操作なので、インストールする前にローカルパッケージインデックスを更新してください:
- sudo apt update
- sudo apt install nfs-kernel-server
これらのパッケージがインストールされたら、クライアントサーバーに切り替えます。
クライアント上で
クライアントサーバー上で、NFSクライアント機能を提供し、サーバーコンポーネントを含まない
- sudo apt update
- sudo apt install nfs-common
両方のサーバーに必要なパッケージが揃ったので、設定を開始できます。
ステップ2 — ホスト上に共有ディレクトリを作成する
私たちは、スーパーユーザーアクセスに関してNFSマウントが設定できる2つの重要な方法を示すために、異なる構成設定を持つ2つの別々のディレクトリを共有します。
スーパーユーザーはシステム上のどこでも何でもできます。ただし、NFSマウントされたディレクトリは、それがマウントされたシステムの一部ではないため、デフォルトではNFSサーバーはスーパーユーザー特権を必要とする操作を実行することを拒否します。このデフォルトの制限により、クライアント上のスーパーユーザーはrootとしてファイルに書き込むことや所有権を再割り当てすること、あるいはNFSマウント上での他のスーパーユーザー作業を行うことができません。
しかし時には、マウントされたファイルシステム上でこれらの操作を実行する必要がある信頼できるユーザーが<強>クライアント強>システムに存在し、<強>ホスト強>上でスーパーユーザー権限を必要としない場合があります。NFSサーバーをこのように設定することもできますが、リスク要素を導入することになります。そのようなユーザーは実際に全体の<強>ホスト強>システムへのルートアクセスを得る可能性があるからです。
例1:汎用マウントのエクスポート
最初の例では、デフォルトのNFSの動作を使用して、クライアントマシン上のroot権限を持つユーザーが、ホストとそのクライアントのスーパーユーザー権限を使用して対話することを困難にする汎用のNFSマウントを作成します。このようなものを使用して、コンテンツ管理システムを使用してアップロードされたファイルを保存したり、ユーザーがプロジェクトファイルを簡単に共有できるスペースを作成したりすることができます。
まず、共有ディレクトリを作成します:
- sudo mkdir /var/nfs/general -p
私たちはそれをsudoで作成しているので、ディレクトリはホストのルートユーザーによって所有されています。
- ls -la /var/nfs/general
drwxr-xr-x 2 root root 4096 May 14 18:36 .
NFSは、セキュリティ対策として、クライアント上のすべてのルート操作をnobody:nogroupの資格情報に変換します。したがって、これらの資格情報に一致するようにディレクトリの所有権を変更する必要があります。
- sudo chown nobody:nogroup /var/nfs/general
このディレクトリをエクスポートする準備が整いました。
例 2: ホームディレクトリのエクスポート
私たちの2番目の例では、目標は、ホストに保存されたユーザーホームディレクトリをクライアントサーバーで利用できるようにし、信頼された管理者がユーザーを便利に管理できるように必要なアクセスを許可することです。
これを行うために、/home ディレクトリをエクスポートします。既に存在しているので、作成する必要はありません。また、パーミッションも変更しません。もし変更した場合、ホスト マシン上のホームディレクトリを持つ人々にさまざまな問題を引き起こす可能性があります。
ステップ3 — ホストサーバーでのNFSエクスポートの構成
次に、NFS構成ファイルに入り、これらのリソースの共有を設定します。
ホストマシンで、テキストエディタを使用してルート権限で/etc/exportsファイルを開きます:
- sudo nano /etc/exports
ファイルには各設定行の一般的な構造を示すコメントがあります。構文は次のとおりです:
directory_to_share client(share_option1,...,share_optionN)
共有する予定の各ディレクトリに対して行を作成する必要があります。ここに表示されているclient_ipプレースホルダーを実際のIPアドレスに変更することを忘れないでください:
/var/nfs/general client_ip(rw,sync,no_subtree_check)
/home client_ip(rw,sync,no_root_squash,no_subtree_check)
ここでは、no_root_squashを除いて、両方のディレクトリに対して同じ設定オプションを使用しています。これらのオプションがそれぞれ何を意味するか見てみましょう:
rw: このオプションは、クライアントコンピュータにボリュームへの読み取りおよび書き込みアクセスを提供します。sync: このオプションは、NFSが応答する前に変更をディスクに書き込むよう強制します。これにより、応答がリモートボリュームの実際の状態を反映するため、より安定した一貫性のある環境が得られます。ただし、ファイル操作の速度は低下します。no_subtree_check: このオプションはサブツリー検査を無効にします。サブツリー検査とは、ホストがすべてのリクエストに対して、ファイルがエクスポートされたツリー内で実際にまだ利用可能かどうかを確認しなければならないプロセスです。ファイルが名前変更されているときにクライアントがそれを開いている場合、これにより多くの問題が発生する可能性があります。ほとんどの場合、サブツリー検査を無効にする方が良いです。no_root_squash: デフォルトでは、NFSはリモートのrootユーザーからのリクエストをサーバー上の特権のないユーザーに変換します。これは、クライアント上のrootアカウントがホストのファイルシステムをrootとして使用するのを防ぐためのセキュリティ機能を意図していました。no_root_squashは、特定の共有に対してこの動作を無効にします。
変更が完了したら、ファイルを保存して閉じてください。それから、設定したクライアントに対して共有を利用可能にするために、次のコマンドでNFSサーバーを再起動します:
- sudo systemctl restart nfs-kernel-server
ただし、新しい株式を実際に使用する前に、ファイアウォールのルールによってその株式へのトラフィックが許可されていることを確認する必要があります。
ステップ4 — ホストのファイアウォールの調整
まず、ファイアウォールの状態を確認して、それが有効になっているかどうか、もしそうであれば現在許可されているものを見てみましょう:
- sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
私たちのシステムでは、SSHトラフィックのみが許可されているので、NFSトラフィックのためにルールを追加する必要があります。
多くのアプリケーションでは、sudo ufw app listを使用して、名前でそれらを有効にすることができますが、nfsはその中には含まれていません。しかし、ufwはサービスのポートとプロトコルのために/etc/servicesもチェックするため、NFSを名前で追加することができます。ベストプラクティスでは、許可したいトラフィックを許可しつつ、最も制限的なルールを有効にすることが推奨されるため、どこからでもトラフィックを有効にするのではなく、具体的にします。
次のコマンドを使用して、ホスト上でポート 2049 を開き、クライアントのIPアドレスを必ず置き換えてください:
- sudo ufw allow from client_ip to any port nfs
変更を確認するには、次のように入力します:
- sudo ufw status
出力にはポート 2049 からのトラフィックが許可されていることが表示されるべきです:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
2049 ALLOW 203.0.113.24
OpenSSH (v6) ALLOW Anywhere (v6)
これにより、UFWは私たちのクライアントマシンからポート2049でのNFSトラフィックのみを許可することが確認されます。
ステップ5 — クライアント上でのマウントポイントとマウントディレクトリの作成
サーバーが構成され、その共有を提供しているので、クライアントの準備をします。
リモート共有をクライアントで利用できるようにするためには、共有したいホスト上のディレクトリをクライアント上の空のディレクトリにマウントする必要があります。
注: マウントポイントにファイルやディレクトリがある場合、NFSシェアをマウントするとすぐにそれらは隠れます。重要なファイルの損失を避けるために、既存のディレクトリにマウントする場合は、そのディレクトリが空であることを確認してください。
マウント場所用に2つのディレクトリを作成します:
- sudo mkdir -p /nfs/general
- sudo mkdir -p /nfs/home
リモートシェアを配置する場所が確保され、ファイアウォールが開放されたので、ホストサーバーのIPアドレスを使用してシェアをマウントできます:
- sudo mount host_ip:/var/nfs/general /nfs/general
- sudo mount host_ip:/home /nfs/home
NFS共有をクライアントからマウントする際に、特定のワークロードのためにIOPSを向上させるために、-o nconnect=nフラグを使用できます。ここで「n」は、このクライアントとターゲットNFSサーバー間に確立する接続の数です。この数は1から16の範囲内です。ワークロードに最適な異なるnconnect値を試すことができ、例えば8から始めると良いでしょう。nconnectオプションを設定することで、特定のワークロード、特に小規模な書き込み操作において、IOPSがわずかに向上する可能性があります。
これらのコマンドは、ホストコンピュータからクライアントマシンに共有をマウントします。マウントが成功したかどうかを確認する方法はいくつかあります。mountコマンドやfindmntコマンドを使用して確認できますが、df -hはより読みやすい出力を提供します:
- df -h
Filesystem Size Used Avail Use% Mounted on
udev 474M 0 474M 0% /dev
tmpfs 99M 936K 98M 1% /run
/dev/vda1 25G 1.8G 23G 8% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
/dev/vda15 105M 3.9M 101M 4% /boot/efi
tmpfs 99M 0 99M 0% /run/user/1000
10.132.212.247:/var/nfs/general 25G 1.8G 23G 8% /nfs/general
10.132.212.247:/home 25G 1.8G 23G 8% /nfs/home
マウントされた両方の共有は下部に表示されます。同じファイルシステムからマウントされたため、同じディスク使用量を示します。各マウントポイントの下で実際に使用しているスペースを確認するには、ディスク使用量コマンドduとマウントのパスを使用します。-sフラグは、すべてのファイルの使用量を表示するのではなく、使用量の概要を提供します。-hは、人間にとって読みやすい出力を印刷します。
例えば:
- du -sh /nfs/home
36K /nfs/home
これにより、ホームディレクトリ全体の内容が利用可能なスペースのうち36Kしか使用していないことが示されます。
ステップ 6 — NFS アクセスのテスト
次に、両方の共有に何かを書き込むことでアクセスをテストします。
例1: 一般目的の株
まず、/var/nfs/general共有にテストファイルを書き込んでください:
- sudo touch /nfs/general/general.test
それから、それの所有権を確認してください。
- ls -l /nfs/general/general.test
-rw-r--r-- 1 nobody nogroup 0 Aug 1 13:31 /nfs/general/general.test
このボリュームをNFSのデフォルト動作を変更せずにマウントし、クライアントマシンのルートユーザーとしてsudoコマンドを使用してファイルを作成したため、ファイルの所有権はデフォルトでnobody:nogroupになります。クライアントのスーパーユーザーは、このNFSマウントされた共有上でファイルの所有者を変更したり、ユーザーグループのための新しいディレクトリを作成したりするなどの一般的な管理操作を行うことができません。
クライアントからNFSマウント上でパフォーマンステストを実行したい場合は、DigitalOceanの「DigitalOceanボリュームのベンチマークの方法」に記載されている設定手順に従うべきです。
例2: ホームディレクトリ共有
一般目的の共有の権限をホームディレクトリの共有と比較するには、/nfs/homeに同じ方法でファイルを作成します:
- sudo touch /nfs/home/home.test
次に、ファイルの所有権を見てください。
- ls -l /nfs/home/home.test
-rw-r--r-- 1 root root 0 Aug 1 13:32 /nfs/home/home.test
home.testをrootとして作成する際、sudoコマンドを使用し、general.testファイルを作成したのと全く同じ方法を取りました。しかし、この場合、rootが所有者となっているのは、no_root_squashオプションをこのマウントで指定することで、デフォルトの動作を上書きしたからです。これにより、clientマシン上のrootユーザーはrootとして行動できるようになり、ユーザーアカウントの管理が非常に便利になります。同時に、これにより、これらのユーザーにhostでのrootアクセスを与える必要がなくなります。
ステップ7 — ブート時にリモートNFSディレクトリをマウントする
クライアントの /etc/fstab ファイルにそれらを追加することで、永続的なNFSマウントを作成できます。これにより、NFS共有が起動時に自動的にマウントされることが保証されます。
このファイルをルート権限でテキストエディタで開いてください:
- sudo nano /etc/fstab
ファイルの最下部に、私たちの株式の各自についての行を追加してください。それらはこのようになります。
. . .
host_ip:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
host_ip:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
注意: ここで指定しているオプションに関する詳細情報はNFSのマニュアルページで確認できます。次のコマンドを実行することでアクセスできます:
- man nfs
クライアントはブート時にリモートパーティションを自動的にマウントしますが、接続を確立し、共有が利用可能になるまでに数秒かかる場合があります。
ステップ8 — NFSリモート共有のアンマウント
リモートディレクトリをシステムにマウントしたくない場合は、共有のディレクトリ構造から出て、アンマウントすることでアンマウントできます。次のようにします:
- cd ~
- sudo umount /nfs/home
- sudo umount /nfs/general
注意してください、コマンドはあなたが予想するかもしれないように unmount ではなく umount と呼ばれています。
これはリモート共有を削除し、ローカルストレージのみがアクセス可能になります:
- df -h
Filesystem Size Used Avail Use% Mounted on
udev 474M 0 474M 0% /dev
tmpfs 99M 936K 98M 1% /run
/dev/vda1 25G 1.8G 23G 8% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
/dev/vda15 105M 3.9M 101M 4% /boot/efi
tmpfs 99M 0 99M 0% /run/user/1000
次回の再起動時に再マウントされないようにするには、/etc/fstabを編集し、その行を削除するか、行の先頭に#文字を置いてコメントアウトします。また、autoオプションを削除することで自動マウントを防ぐこともでき、その場合でも手動でマウントすることができます。
運用使用のための追加の考慮事項
本番環境でNFSを展開する際は、安定性、性能、安全性を確保するために以下のベストプラクティスを考慮してください:
より高度なNFS設定やユースケースについては、追加のガイドやベストプラクティスを含むNFSマウントコレクションをご覧ください。
1. NFS バージョンの互換性
クライアントとサーバーの両方が互換性のあるバージョンで動作していることを確認してください。簡素化されたファイアウォール要件と向上したセキュリティ機能のため、NFSv4が推奨されます。
マウント中にバージョンの使用を強制するには:
sudo mount -t nfs -o vers=4 host_ip:/path /mountpoint
2. パフォーマンス最適化フラグ
nconnectに加えて、これらのオプションも検討してください:
rsize=8192,wsize=8192: スループットを向上させるために、読み取り/書き込みバッファサイズを増やします。async: 書き込み性能を向上させるが、クラッシュ時にデータ損失のリスクがある。actimeo=1800: 属性キャッシングの頻度を減らします。
3. セキュリティ強化
NFSはデフォルトでデータを暗号化しません。設定を安全にするために:
- NFSは信頼されたプライベートネットワークまたはVPN上でのみ使用してください。
root_squashを適用してください、特権アクセスが必須でない限り。/etc/exportsへのアクセスを特定のIPに制限します。
4. ロギングとモニタリング
監査またはデバッグのためにNFSアクティビティを監視する:
tail -f /var/log/syslog | grep nfs
または使用する:
journalctl -u nfs-server
よくある質問 (FAQ)
LinuxにおけるNFSマウントとは何ですか?
NFSマウントは、一つのシステムがネットワークを介して別のシステムによって共有されているディレクトリにアクセスできるようにします。これにより、Linux/Unixシステム間でシームレスなファイル共有が可能になり、リモートディレクトリがローカルに存在するかのように表示されます。これは特に以下のような場合に便利です。
- 複数のサーバー間でアプリケーションデータを共有する
- バックアップと管理を容易にするためのストレージの集中化
- 複数のサーバーが同じファイルにアクセスできるようにすること
- ネットワーク全体に分散ファイルシステムを作成する
再起動後にNFSマウントを持続させる方法は?
クライアントで/etc/fstabを編集して、マウント設定を追加できます。こちらが詳細な例です:
Format: host_ip:/shared_directory /mount_point nfs options 0 0
192.168.1.100:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
主なオプションとその説明:
自動: 起動時に自動的にマウントするnofail: マウントに失敗してもブートプロセスを停止しないnoatime: アクセスタイムを更新しない(パフォーマンスを向上させる)nolock: ファイルロックを無効にする(特定のアプリケーションに便利)intr: ハードマウントでの割り込みを許可するtcp: UDPの代わりにTCPを使用するactimeo=1800: キャッシュ属性は30分間有効です
NFSが機能するために必要なポートはどれですか?
NFSは、異なるバージョンおよび機能のためにいくつかのポートを必要とします:
- ポート2049(TCP/UDP):主なNFS通信
- ポート111 (TCP/UDP): rpcbind (特にNFSv3用)
- ポート20048(TCP/UDP):NFSマウントデーモン
- ポート20049(TCP/UDP):NFSロックマネージャー
NFSv4では、ポート2049のみが必要であり、ファイアウォールの設定が容易になります。
NFSの代替は何ですか?
あなたのニーズに応じていくつかの選択肢があります:
SSHFS:
- 暗号化された、設定が簡単
- 安全なファイル転送にはSSHを使用します。
- 時折のアクセスには良い
- SSHFSの使い方を学ぶ
サンバ (SMB):
- クロスプラットフォーム(Windows-Linux)共有に最適
- ネイティブWindowsサポート
- 組み込み認証
- 混合環境に適しています
rsync:
- 片道または定期的な同期に最適です
- 大きなファイル転送に効率的です
- バックアップに最適です
- cronを使って自動化できます
NFSマウントの問題をどのようにトラブルシューティングしますか?
一般的なトラブルシューティング手順:
- NFSサービスの状態を確認してください:
sudo systemctl status nfs-kernel-server # On host
sudo systemctl status nfs-common # On client
- 輸出を確認してください:
sudo exportfs -v
- マウントポイントを確認します:
df -h
mount | grep nfs
- NFSログを表示する:
tail -f /var/log/syslog | grep nfs
NFS設定をどのように保護しますか?
NFSセキュリティのベストプラクティス:
- 安全性を向上させるためにNFSv4を使用します
/etc/exportsで特定のIPへのエクスポートを制限するroot_squashを使用してルートアクセスを防止します- ファイアウォールルールを実装する:
sudo ufw allow from client_ip to any port nfs
プライベートネットワークやVPNを使用してください
権限の定期的なセキュリティ監査
どのようなパフォーマンス最適化が利用可能ですか?
NFS性能を改善するためのいくつかのオプション:
nconnectを使用して並列接続を行います:
mount -t nfs -o nconnect=8 host_ip:/share /mountpoint
- 読み書きサイズを調整する:
mount -t nfs -o rsize=8192,wsize=8192 host_ip:/share /mountpoint
asyncを使用して、書き込みパフォーマンスを向上させる(注意が必要)actimeoを使用して適切なキャッシュを実装する- より良いスループットのために10ギガビットネットワークの使用を検討してください
NFSシェアをアンマウントするにはどうすればよいですか?
NFS シェアをアンマウントするには:
sudo umount /mountpoint
もしそのシェアが忙しい場合:
sudo umount -f /mountpoint # Force unmount
sudo umount -l /mountpoint # Lazy unmount
再起動時に自動的にマウントされるのを防ぎたい場合は、/etc/fstabの対応する行を削除するか、コメントアウトすることを忘れないでください。
NFSのバージョン間の違いは何ですか?
NFSの各バージョン間の主な違い:
NFSv3:
- 複数のポートを使用する
- rpcbindが必要です
- v2よりも優れたパフォーマンス
- 今でも広く使われている
NFSv4:
- シングルポート(2049)
- 改善されたセキュリティ
- より良いパフォーマンス
- ステートフルプロトコル
- 新しい展開に推奨されます
NFSv4.1: 親NFSv4.1
- 並列NFS (pNFS)
- より良いスケーラビリティ
- セッション管理
- 高度な機能
NFSのパフォーマンスをどのように監視しますか?
いくつかのツールが利用可能です。
nfsstatはNFS統計のためのものです:
nfsstat -c # Client stats
nfsstat -s # Server stats
iostatによる入出力統計:
iostat -x 1
nfsiostatNFS専用I/O:
nfsiostat 1
- PrometheusやGrafanaなどのシステム監視ツールとNFSエクスポーター
一般的なNFSマウントオプションは何ですか?
重要なマウントオプション:
rw/ro: 読み書き可能または読み取り専用同期/非同期: 同期または非同期の書き込みno_root_squash: ルートアクセスを許可するno_subtree_check: サブツリーのチェックを無効にする- ソフト/ハード: サーバーの利用不可をどのように処理するか
intr: ハードマウントでの割り込みを許可するtcp/udp: 輸送プロトコルvers: 使用するNFSバージョン
複数の選択肢の例:
mount -t nfs -o rw,sync,no_subtree_check,vers=4 host_ip:/share /mountpoint
結論
このチュートリアルでは、NFSホストを作成し、NFSクライアントと共有した2つの異なるNFSマウントを作成することで、いくつかの重要なNFS動作を説明しました。
本番環境でNFSを実装することを検討している場合、プロトコル自体が暗号化されていないことに注意することが重要です。プライベートネットワークで共有している場合は問題ないかもしれませんが、他の場合ではデータを保護するためにVPNや他の種類の暗号化トンネルが必要になります。暗号化された代替手段としては、SSHFSを使用するか、VPN接続を設定することを検討してください。
関連記事
このトピックについて詳しくは、次を探索してください:
- SSHFSを使用してリモートファイルシステムをSSH経由でマウントする方法 - 別の暗号化されたファイル共有ソリューションについて学びましょう
- ブロックストレージを使用してNFSサーバーを設定する方法 - ブロックストレージを用いた高度なNFS設定
- NFSマウントコレクション - NFS関連ガイドの包括的なコレクション
