前書き
NFS、またはネットワークファイルシステムは、サーバー上のリモートディレクトリをマウントできる分散ファイルシステムプロトコルです。 これにより、異なる場所のストレージスペースを管理し、複数のクライアントからそのスペースに書き込むことができます。 NFSは、ネットワーク経由で比較的迅速かつ簡単にリモートシステムにアクセスする方法を提供し、共有リソースに定期的にアクセスする必要がある状況で適切に機能します。
このガイドでは、NFS機能に必要なコンポーネントのインストール方法、NFSマウントの構成方法、NFSリモート共有のマウント解除方法について説明します。
前提条件
このチュートリアルでは、2つのサーバーを使用します。1つのファイルシステムの一部を他のサーバーと共有します。 従うには、次のものが必要です。
-
2つのUbuntu 18.04サーバー。 これらのそれぞれには、 `+ sudo +`特権が設定された非* root *ユーザー、UFWで設定されたシンプルなファイアウォール、およびプライベートネットワークが利用可能であれば、それらが必要です。
-
`+ sudo +`特権とファイアウォールを持つ非* root *ユーザーのセットアップについては、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04を参照してください。 [Ubuntu 18.04での初期サーバー設定]ガイド。
-
プライベートネットワーキングの設定については、https://www.digitalocean.com/community/tutorials/how-to-set-up-and-use-digitalocean-private-networking [DigitalOceanプライベートネットワーキングを設定および使用する方法]を参照してください。 。
このチュートリアルでは、ディレクトリを共有するサーバーを* host として、これらのディレクトリをマウントするサーバーを client として参照します。 まっすぐに保つために、次のIPアドレスを host および client *値の代用として使用します。
-
ホスト:
+ 203.0.113.0 +
-
クライアント:
+ 203.0.113.24 +
これらのIPアドレスがコマンドおよび構成ファイルに表示される場合、それらをそれぞれ独自の* host および client * IPアドレスに置き換える必要があります。
ステップ1-コンポーネントのダウンロードとインストール
まず、各サーバーに必要なコンポーネントをインストールします。
ホスト上
*ホスト*サーバーに、 `+ nfs-kernel-server `パッケージをインストールします。これにより、ディレクトリを共有できます。 これは、このセッションで「 apt +」を使用して実行する最初の操作なので、インストールの前にローカルパッケージインデックスを更新します。
sudo apt update
sudo apt install nfs-kernel-server
これらのパッケージをインストールしたら、* client *サーバーに切り替えます。
クライアントで
*クライアント*サーバーに、不要なサーバーコンポーネントを含めずにNFS機能を提供する `+ nfs-common +`というパッケージをインストールする必要があります。 繰り返しますが、インストール前にローカルパッケージインデックスを更新して、最新の情報があることを確認してください。
sudo apt update
sudo apt install nfs-common
両方のサーバーに必要なパッケージがあるので、それらの構成を開始できます。
手順2-ホストでの共有ディレクトリの作成
スーパーユーザーアクセスに関してNFSマウントを構成する2つの重要な方法を説明するために、構成設定が異なる2つの個別のディレクトリを共有します。
スーパーユーザーは、システムのどこでも何でもできます。 ただし、NFSマウントされたディレクトリは、それらがマウントされているシステムの一部ではないため、デフォルトでは、NFSサーバーはスーパーユーザー特権を必要とする操作の実行を拒否します。 このデフォルトの制限は、* client のスーパーユーザーが root *としてファイルを書き込んだり、所有権を再割り当てしたり、NFSマウントで他のスーパーユーザータスクを実行したりできないことを意味します。
ただし、マウントされたファイルシステムでこれらのアクションを実行する必要があるが、*ホスト*でのスーパーユーザーアクセスが不要な*クライアント*システム上の信頼できるユーザーがいる場合があります。 これを許可するようにNFSサーバーを設定できますが、ユーザーがホスト*システム全体へのルートアクセスを取得する可能性があるため、リスクの要素が導入されます。
例1:汎用マウントのエクスポート
最初の例では、デフォルトのNFS動作を使用する汎用NFSマウントを作成し、* client マシンでroot権限を持つユーザーが client スーパーユーザー権限を使用して host *とやり取りするのを困難にします。 このようなものを使用して、コンテンツ管理システムを使用してアップロードされたファイルを保存したり、ユーザーがプロジェクトファイルを簡単に共有できるスペースを作成したりできます。
まず、 `+ nfs +`という名前の共有ディレクトリを作成します。
sudo mkdir /var/nfs/general -p
`+ sudo +`で作成しているため、ディレクトリは* host の root *ユーザーが所有しています。
ls -la /var/nfs/general
Output4 drwxr-xr-x 2 root root 4096 Jul 25 15:26 .
NFSは、セキュリティ対策として、* client 上の root *操作を `+ nobody:nogroup +`資格情報に変換します。 したがって、これらの資格情報と一致するようにディレクトリの所有権を変更する必要があります。
sudo chown nobody:nogroup /var/nfs/general
これで、このディレクトリをエクスポートする準備ができました。
例2:ホームディレクトリのエクスポート
2番目の例の目標は、*ホスト*に保存されているユーザーホームディレクトリを*クライアント*サーバーで使用できるようにし、それらの*クライアント*サーバーの信頼できる管理者がユーザーを便利に管理するために必要なアクセスを許可することです。
これを行うために、 `+ / home`ディレクトリをエクスポートします。 既に存在するため、作成する必要はありません。 権限も変更しません。 _did_の場合、* host *マシン上にホームディレクトリを持つすべてのユーザーにさまざまな問題を引き起こす可能性があります。
手順3-ホストサーバーでのNFSエクスポートの構成
次に、これらのリソースの共有を設定するために、NFS構成ファイルに飛び込みます。
-
root *権限でテキストエディターで `+ / etc / exports +`ファイルを開きます。
sudo nano /etc/exports
ファイルには、各構成行の一般的な構造を示すコメントが含まれています。 構文は基本的に次のとおりです。
/ etc / exports
(,,)
共有する予定のディレクトリごとに行を作成する必要があります。 この例の* client *のIPは `+ 203.0.113.24 +`であるため、行は次のようになります。 ここに表示されているIPアドレスを*クライアント*のIPアドレスに必ず変更してください。
/ etc / exports
/var/nfs/general (rw,sync,no_subtree_check)
/home (rw,sync,no_root_squash,no_subtree_check)
ここでは、 `+ no_root_squash +`を除き、両方のディレクトリに同じ設定オプションを使用しています。 これらの各オプションの意味を見てみましょう。
-
+ rw +
:このオプションは、* client *コンピューターにボリュームへの読み取りと書き込みの両方のアクセスを許可します。 -
+ sync +
:このオプションは、NFSが応答する前に変更をディスクに強制的に書き込むようにします。 これにより、応答がリモートボリュームの実際の状態を反映するため、より安定した一貫した環境が実現します。 ただし、ファイル操作の速度も低下します。 -
+ no_subtree_check +
:このオプションは、サブツリーのチェックを防ぎます。これは、* host が、リクエストごとにエクスポートされたツリーでファイルが実際にまだ利用可能かどうかをチェックするプロセスです。 これは、 client *が開いている間にファイルの名前が変更されると、多くの問題を引き起こす可能性があります。 ほとんどすべての場合、サブツリーチェックを無効にすることをお勧めします。 -
+ no_root_squash +
:デフォルトでは、NFSは* root ユーザーからのリクエストをリモートでサーバー上の非特権ユーザーに変換します。 これは、 client の root アカウントが host のファイルシステムを root *として使用するのを防ぐセキュリティ機能として意図されていました。 `+ no_root_squash +`は特定の共有に対してこの動作を無効にします。
変更が完了したら、ファイルを保存して閉じます。 次に、構成したクライアントが共有を使用できるようにするには、次のコマンドを使用してNFSサーバーを再起動します。
sudo systemctl restart nfs-kernel-server
ただし、新しい共有を実際に使用する前に、共有へのトラフィックがファイアウォールルールによって許可されていることを確認する必要があります。
ステップ4-ホスト上のファイアウォールの調整
まず、ファイアウォールのステータスをチェックして、有効になっているかどうかを確認し、有効になっている場合は、現在許可されているものを確認します。
sudo ufw status
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
このシステムでは、SSHトラフィックのみが許可されているため、NFSトラフィックのルールを追加する必要があります。
多くのアプリケーションでは、 + sudo ufw app list +`を使用して名前で有効にできますが、 `+ nfs +`はそれらの1つではありません。 ただし、 `+ ufw`はサービスのポートとプロトコルの
+ / etc / services`もチェックするため、名前でNFSを追加できます。 ベストプラクティスでは、許可するトラフィックを許可する最も制限の厳しいルールを有効にすることをお勧めします。そのため、どこからでもトラフィックを有効にするのではなく、具体的にします。
次のコマンドを使用して、ホスト*でポート `+ 2049 +`を開きます。必ず*クライアントの IPアドレスに置き換えてください。
sudo ufw allow from to any port nfs
次のように入力して、変更を確認できます。
sudo ufw status
出力にポート「2049」から許可されたトラフィックが表示されるはずです。
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
2049 ALLOW
OpenSSH (v6) ALLOW Anywhere (v6)
これにより、UFWが*クライアント*マシンからのポート `+ 2049 +`でのみNFSトラフィックを許可することが確認されます。
手順5-クライアントでのマウントポイントの作成とディレクトリのマウント
*ホスト*サーバーが構成され、その共有を提供しているので、*クライアント*を準備します。
-
client でリモート共有を利用できるようにするには、共有する host のディレクトリを client *の空のディレクトリにマウントする必要があります。
マウント用に2つのディレクトリを作成します。
sudo mkdir -p /nfs/general
sudo mkdir -p /nfs/home
リモート共有を配置する場所ができ、ファイアウォールを開いたので、このガイドでは「203.0.113.0」である* host *サーバーのアドレスを指定して共有をマウントできます。
sudo mount :/var/nfs/general /nfs/general
sudo mount :/home /nfs/home
これらのコマンドは、共有をホストコンピューターから*クライアント*マシンにマウントします。 いくつかの方法で正常にマウントされたことを再確認できます。 これは、プレーンな「+ mount 」または「 findmnt 」コマンドで確認できますが、「 df -h +」は、NFS共有のディスク使用状況が異なる方法で表示される、より読みやすい出力を提供します。
df -h
OutputFilesystem Size Used Avail Use% Mounted on
udev 238M 0 238M 0% /dev
tmpfs 49M 628K 49M 2% /run
/dev/vda1 20G 1.2G 18G 7% /
tmpfs 245M 0 245M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 245M 0 245M 0% /sys/fs/cgroup
tmpfs 49M 0 49M 0% /run/user/0
マウントした両方の共有が下部に表示されます。 同じファイルシステムからマウントされたため、同じディスク使用量を示しています。 各マウントポイントで実際に使用されているスペースの量を確認するには、ディスク使用コマンド「+ du 」とマウントのパスを使用します。 ` -s `フラグは、すべてのファイルの使用状況を表示するのではなく、使用状況の概要を提供します。 ` -h +`は人間が読める形式で出力します。
例えば:
du -sh /nfs/home
Output36K /nfs/home
これは、ホームディレクトリ全体のコンテンツが使用可能な領域のうち36Kだけを使用していることを示しています。
ステップ6-NFSアクセスのテスト
次に、各共有に何かを書き込んで共有へのアクセスをテストしましょう。
例1:汎用共有
最初に、テストファイルを `+ / var / nfs / general +`共有に書き込みます。
sudo touch /nfs/general/general.test
次に、所有権を確認します。
ls -l /nfs/general/general.test
Output-rw-r--r-- 1 nobody nogroup 0 Aug 1 13:31 /nfs/general/general.test
NFSのデフォルトの動作を変更せずにこのボリュームをマウントし、 `+ sudo `コマンドを使用して* client *マシンの* root *ユーザーとしてファイルを作成したため、ファイルの所有権はデフォルトで ` nobody:nogroup +`になります。 *クライアント*スーパーユーザーは、このNFSマウントされた共有で、ファイルの所有者を変更したり、ユーザーグループの新しいディレクトリを作成したりするなど、一般的な管理アクションを実行できません。
例2:ホームディレクトリ共有
汎用共有のアクセス許可をホームディレクトリ共有と比較するには、同じ方法でファイルホームディレクトリを作成します。
sudo touch /nfs/home/home.test
次に、ファイルの所有権を確認します。
ls -l /nfs/home/home.test
Output-rw-r--r-- 1 root root 0 Aug 1 13:32 /nfs/home/home.test
+ general.test +`ファイルを作成したのとまったく同じ方法で、 `+ sudo`コマンドを使用して
+ home.test`を* root として作成しました。 ただし、この場合、このマウントで `+ no_root_squash +`オプションを指定したときのデフォルトの動作を無効にしているため、 root が所有しています。 これにより、*クライアント*マシンの root ユーザーが root *として機能し、ユーザーアカウントの管理がはるかに便利になります。 同時に、これらのユーザーに*ホスト*でのルートアクセスを許可する必要がないことを意味します。
手順7-起動時にリモートNFSディレクトリをマウントする
リモートのNFS共有を* client *の `+ / etc / fstab +`ファイルに追加することにより、ブート時に自動的にマウントできます。
テキストエディタでこのファイルをルート権限で開きます。
sudo nano /etc/fstab
ファイルの下部に、各共有の行を追加します。 次のようになります。
/ etc / fstab
. . .
:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
-
client *サーバーは、ブート時にリモートパーティションを自動的にマウントしますが、接続を確立して共有を利用できるようになるまでに少し時間がかかる場合があります。
手順8-NFSリモート共有のアンマウント
システムにリモートディレクトリをマウントする必要がなくなった場合は、次のように共有のディレクトリ構造から移動してアンマウントすることにより、リモートディレクトリをアンマウントできます。
cd ~
sudo umount /nfs/home
sudo umount /nfs/general
これにより、リモート共有が削除され、ローカルストレージのみがアクセス可能になります。
df -h
Output
Filesystem Size Used Avail Use% Mounted on
/dev/vda 59G 1.3G 55G 3% /
none 4.0K 0 4.0K 0% /sys/fs/cgroup
udev 2.0G 12K 2.0G 1% /dev
tmpfs 396M 320K 396M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 2.0G 0 2.0G 0% /run/shm
none 100M 0 100M 0% /run/user
次回の再起動時にそれらが再マウントされないようにしたい場合は、 `+ / etc / fstab `を編集し、行を削除するか、行の先頭に#記号を置いてコメントアウトします。 ` auto +`オプションを削除することで自動マウントを防ぐこともできます。これにより、手動でマウントできるようになります。
結論
このチュートリアルでは、NFSホストを作成し、NFS * client *と共有する2つの異なるNFSマウントを作成することにより、いくつかの主要なNFS動作を説明しました。 実稼働環境でNFSを実装する場合は、プロトコル自体が暗号化されていないことに注意することが重要です。 一般公開されているファイルを共有している場合、これは深刻な問題を引き起こしません。
ただし、プライベートデータにNFSを使用している場合は、そのデータを保護する方法を決定する必要があります。 SSHまたはVPN接続を介してNFSをルーティングしてより安全なエクスペリエンスを作成できる場合がありますが、多くの場合、パフォーマンスが大幅に低下します。 パフォーマンスが問題になる場合は、https://www.digitalocean.com/community/tutorials/how-to-use-sshfs-to-mount-remote-file-systems-over-ssh [SSHFS]を検討してください。 暗号化されていないNFSトラフィックよりも若干遅くなりますが、通常、トンネル化されたNFSよりもはるかに高速です。 NFSのKerberos認証暗号化は、検討するもう1つのオプションです。