はじめに

NFS(Networkファイルシステム)は、サーバー上にリモートディレクトリをマウントできる分散ファイルシステムプロトコルです。これにより、異なる場所のストレージスペースを管理し、複数のクライアントからそのスペースに書き込むことができます。NFSは、ネットワーク経由でリモートシステムにアクセスする一般的かつ恒久的な手段で、共有リソースに定期的にアクセスする場合に適しています。

このガイドでは、NFS機能に必要なコンポーネントをUbuntu 20.04にインストールする方法、サーバーとクライアントそれぞれのNFSマウントの設定方法、NFSリモート共有をマウント・アンマウントする方法について説明します。

前提条件

nfs illustration for: 前提条件

このチュートリアルでは、ファイルシステムの一部をもう一方のサーバーと共有するサーバー2台を使用します。進めるには、次のものが必要です。

  • Ubuntu 20.04サーバー2台。各サーバーには、sudo権限を持つroot以外のユーザー、UFWでセットアップされたファイアウォール、そして利用可能な場合はプライベートネットワークが必要です。
  • サーバーとクライアントにthe cloud provider Dropletsを使用している場合、プライベートネットワークのセットアップについてはVPCの作成方法に関するドキュメントを参照してください。

このチュートリアルでは、自身のディレクトリを共有するサーバーをホスト、これらのディレクトリをマウントするサーバーをクライアントと呼びます。両サーバーのIPアドレスを確認します。利用可能であれば、_プライベート_ネットワークアドレスを使用してください。

このチュートリアルでは、これらのIPアドレスをプレースホルダーごとにhost_ipclient_ipと呼びます。必要に応じて置き換えてください。

ステップ1 — コンポーネントのダウンロードとインストール

まず、各サーバーに必要なコンポーネントをインストールします。

ホスト側

ホストサーバーに、nfs-kernel-serverパッケージをインストールします。これにより、ディレクトリを共有できます。このセッションで初めて「 apt 」を使用して実行するので、インストールする前にローカルパッケージインデックスを更新します。

				
					
sudo apt update

sudo apt install nfs-kernel-server

				
			

これらのパッケージをインストールしたら、クライアントサーバーに切り替えます。

クライアント側

クライアントサーバーには、サーバーコンポーネントを含めずにNFS機能を提供する、nfs-commonというパッケージをインストールします。ここでも、インストールする前にローカルパッケージインデックスを更新して、情報が最新であるようにしてください。

				
					
[environment second]

sudo apt update

sudo apt install nfs-common

				
			

両方のサーバーに必要なパッケージが揃ったので、設定を開始します。

ステップ2 — ホストで共有ディレクトリの作成

設定が異なる2つの個別のディレクトリを共有して、スーパーユーザーアクセスに関してNFSマウントを設定する2つの重要な方法を説明します。

スーパーユーザーは、システムのどこでも何でも実行できます。ただし、NFSマウントされたディレクトリは、それらが★マウントされているシステムの一部ではないため、デフォルトでは、NFSサーバーはスーパーユーザー権限を必要とする操作の実行を拒否します。このデフォルトの制限により、スーパーユーザーはクライアント上で rootとしてファイルを書き込んだり、所有権を再割り当てしたり、NFSマウントで他のスーパーユーザータスクを実行したりすることができません。

ただし、クライアントシステム側の信頼できるユーザーで、マウントされたファイルシステムでこれらのアクションを実行する必要はあっても、ホスト側でスーパーユーザーアクセスが不要なユーザーもいます。これを許可するようにNFSサーバーを設定できますが、ユーザーからホストシステム全体へのルートアクセスが_可能になる_、という危険要素も取り込むことになります。

例1:汎用マウントのエクスポート

最初の例では、デフォルトのNFS動作を使用する汎用NFSマウントを作成します。これはクライアントマシンでroot権限を持つユーザーが、 クライアントスーパーユーザー権限を使用してホストとやり取りするのを困難にするものです。 このようなものを使用して、コンテンツ管理システムを使用してアップロードされたファイルを保存したり、ユーザーがプロジェクトファイルを簡単に共有できるスペースを作成したりできます。

まず、共有ディレクトリを作成します。

				
					
sudo mkdir /var/nfs/general -p

				
			

sudoで作成しているため、ディレクトリの所有権はホストrootユーザーにあります。

				
					
ls -la /var/nfs/general

				
			
				
					
[secondary_label Output]

drwxr-xr-x 2 <^>root root<^> 4096 May 14 18:36 .

				
			

NFSは、セキュリティ対策として、クライアントroot操作をすべて nobody:nogroup資格情報に変換します。 したがって、これらの資格情報と一致するようにディレクトリの所有権を変更します。

				
					
sudo chown nobody:nogroup /var/nfs/general

				
			

これで、このディレクトリをエクスポートする準備が整いました。

例2:ホームディレクトリのエクスポート

次の例では、ゴールは、ホストに保存されているユーザーホームディレクトリをクライアントサーバーで使用できるようにし、それらのクライアントサーバーの信頼できる管理者がユーザーを管理しやすくなるように、必要なアクセスを許可することです。

これを行うには、/homeディレクトリをエクスポートします。既存のディレクトリなので、作成する必要はありません。権限も変更しません。権限を_変更_すれば、ホストマシンにホームディレクトリを持つ全ユーザーにさまざまな問題をもたらすおそれがあります。

ステップ3 — ホストサーバーでのNFSエクスポートの設定

次に、これらのリソースの共有を設定するために、NFS設定ファイルを見ていきます。

ホストマシンで、テキストエディターを使用して、root権限で/etc/exportファイルを開きます。

				
					
sudo nano /etc/exports

				
			

ファイルには、各設定行の一般的な構造を示すコメントが含まれています。構文は次のとおりです。

				
					
[label /etc/exports]

<^>directory_to_share<^> <^>client<^>(<^>share_option1<^>,<^>...<^>,<^>share_optionN<^>)

				
			

共有する予定のディレクトリごとに行を作成します。<^>client_ip<^>を実際のIPアドレスに必ず変更してください。

				
					
[label /etc/exports]

/var/nfs/general &lt;^&gt;client_ip&lt;^&gt;(rw,sync,no_subtree_check)

/home &lt;^&gt;client_ip&lt;^&gt;(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

				
			
				
					
[secondary_label Output]

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 &lt;^&gt;client_ip&lt;^&gt; to any port nfs

				
			

次のように入力して、変更を確認できます。

				
					
sudo ufw status

				
			

出力にポート2049から許可されたトラフィックが表示されるはずです。

				
					
[secondary_label Output]

Status: active



To Action From

-- ------ ----

OpenSSH ALLOW Anywhere 

2049 ALLOW &lt;^&gt;203.0.113.24&lt;^&gt; 

OpenSSH (v6) ALLOW Anywhere (v6)

				
			

これにより、UFWがクライアントマシンからのNFSトラフィックをポート 2049でのみ許可していることを確認できます。

ステップ5 — クライアントでのマウントポイントの作成とディレクトリのマウント

ホストサーバーが設定され、共有を提供しているので、クライアントを準備します。

クライアント でリモート共有を利用できるようにするには、共有する ホスト のディレクトリを クライアント の空のディレクトリにマウントする必要があります。

注:マウントポイントに既存のファイルとディレクトリがある場合、NFS共有をマウントするとすぐに見えなくなります。 重要なファイルが失われないように、既存のディレクトリにマウントする場合はディレクトリが空であることを必ず確認してください。

マウント用に2つのディレクトリを作成します。

				
					
[environment second]

sudo mkdir -p /nfs/general

sudo mkdir -p /nfs/home

				
			

リモート共有を配置する場所ができ、ファイアウォールを開いたので、ホストサーバーのIPアドレスを使用して共有をマウントでします。

				
					
[environment second]

sudo mount &lt;^&gt;host_ip&lt;^&gt;:/var/nfs/general /nfs/general

sudo mount &lt;^&gt;host_ip&lt;^&gt;:/home /nfs/home

				
			

これらのコマンドは、共有をホストコンピューターからクライアントマシンにマウントします。正常にマウントされたか再確認する方法がいくつかあります。プレーンなコマンドであるmountfindmntでも確認できますが、df -hを使うと、より読みやすい出力になります。

				
					
[environment second]

df -h

				
			
				
					
[secondary_label Output]

[environment second]

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

&lt;^&gt;10.132.212.247:/var/nfs/general 25G 1.8G 23G 8% /nfs/general&lt;^&gt;

&lt;^&gt;10.132.212.247:/home 25G 1.8G 23G 8% /nfs/home&lt;^&gt;

				
			

マウントした2つの共有が下部に表示されます。同じファイルシステムからマウントされたため、同じディスク使用量を示しています。各マウントポイントの実際のスペース使用量を確認するには、ディスクの使用量を表示するduコマンドとマウントのパスを使用します。-sフラグは、各ファイルの使用量ではなく、全体の使用量を表示します。-hは人間が読める形式で出力します。

例えば:

				
					
[environment second]

du -sh /nfs/home

				
			
				
					
[secondary_label Output]

[environment second]

36K	/nfs/home

				
			

これは、ホームディレクトリ全体のコンテンツが使用可能な領域のうち36Kだけを使用していることを示しています。

ステップ6 — NFSアクセスのテスト

次に、それぞれの共有に何かを書き込んで共有へのアクセスをテストしましょう。

例1:汎用共有

最初に、テストファイルを/var/nfs/general共有に書き込みます。

				
					
[environment second]

sudo touch /nfs/general/general.test

				
			

次に、所有権を確認します。

				
					
[environment second]

ls -l /nfs/general/general.test

				
			
				
					
[secondary_label Output]

[environment second]

-rw-r--r-- 1 nobody nogroup 0 Aug 1 13:31 /nfs/general/general.test

				
			

NFSのデフォルトの動作を変更せずにこのボリュームをマウントし、sudoコマンドを使用してクライアントマシンのroot ユーザーとしてファイルを作成したため、ファイルの所有者はデフォルトでnobody:nogroupになります。 クライアントのスーパーユーザーは、このNFSマウントされた共有でファイルの所有者を変更したり、ユーザーグループの新しいディレクトリを作成したりするなど、一般的な管理アクションを実行できません。

例2:ホームディレクトリ共有

汎用共有とホームディレクトリ共有の権限を比較するには、同じ方法で/nfs/homeディレクトリにファイルを作成します。

				
					
[environment second]

sudo touch /nfs/home/home.test

				
			

次に、ファイルの所有権を確認します。

				
					
[environment second]

ls -l /nfs/home/home.test

				
			
				
					
[secondary_label Output]

[environment second]

-rw-r--r-- 1 root root 0 Aug 1 13:32 /nfs/home/home.test

				
			

general.testファイルを作成したのとまったく同じ方法で、 sudoコマンドを使用してhome.testrootとして作成しました。 ただし、この場合、このマウントでno_root_squashオプションを指定した際にデフォルトの動作を無効にしているため、所有権は root にあります。これにより、クライアントマシンのrootユーザーがrootとして機能し、ユーザーアカウントの管理がはるかに便利になります。これは同時に、これらのユーザーにホスト上でルートアクセスを許可する必要がない、ということです。

ステップ7 — 起動時にリモートNFSディレクトリをマウントする

リモートのNFS共有をclient/etc/fstabファイルに追加することにより、ブート時に自動的にマウントできます。

テキストエディターでこのファイルをroot権限で開きます。

				
					
[environment second]

sudo nano /etc/fstab

				
			

ファイルの最下部に、各共有の行を追加します。次のようになります。

				
					
[label /etc/fstab]

. . .

&lt;^&gt;host_ip&lt;^&gt;:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0

&lt;^&gt;host_ip&lt;^&gt;:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0



				
			

注: ここで記述されたオプションについての詳細は、NFSマニュアルページを参照してください。次のコマンドを実行してここにアクセスできます。

				
					
man nfs

				
			

clientサーバーは、ブート時にリモートパーティションを自動的にマウントしますが、接続を確立して共有を利用できるようになるまでに少し時間がかかる場合があります。

ステップ8 — NFSリモート共有のアンマウント

システムにリモートディレクトリをマウントする必要がなくなった場合は、次のように共有のディレクトリ構造から移動してアンマウントすることにより、リモートディレクトリのマウントを解除できます。

				
					
[environment second]

cd ~

sudo umount /nfs/home

sudo umount /nfs/general

				
			

コマンド名はいかにもそれらしいunmountではなくumount であることに注意してください。

これにより、リモート共有が削除され、ローカルストレージのみがアクセス可能になります。

				
					
[environment second]

df -h

				
			
				
					
[secondary_label Output]

[environment second]

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クライアントと共有する2つの異なるNFSマウントを作成することにより、主要なNFS動作をいくつか説明しました。

実稼働環境でNFSの実装を検討する場合は、プロトコル自体が暗号化されていないことに注意が重要です。プライベートネットワークでファイルを共有している場合、これは深刻な問題ではありません。それ以外の場合は、データを保護するためにVPNか他の何らかの暗号化トンネルが必要になります。