NFS(Networkファイルシステム)は、サーバー上にリモートディレクトリをマウントできる分散ファイルシステムプロトコルです。これにより、異なる場所のストレージスペースを管理し、複数のクライアントからそのスペースに書き込むことができます。NFSは、ネットワーク経由でリモートシステムにアクセスする一般的かつ恒久的な手段で、共有リソースに定期的にアクセスする場合に適しています。
このガイドでは、NFS機能に必要なコンポーネントをUbuntu 20.04にインストールする方法、サーバーとクライアントそれぞれのNFSマウントの設定方法、NFSリモート共有をマウント・アンマウントする方法について説明します。
このチュートリアルでは、ファイルシステムの一部をもう一方のサーバーと共有するサーバー2台を使用します。進めるには、次のものが必要です。
Ubuntu 20.04サーバー2台。各サーバーには、sudo
権限を持つroot以外のユーザー、UFWでセットアップされたファイアウォール、そして利用可能な場合はプライベートネットワークが必要です。
sudo
権限を持つroot以外のユーザーとファイアウォールをセットアップするには、Ubuntu 20.04の初期サーバーセットアップガイドを参照してください。
サーバーとクライアントにDigitalOcean Dropletsを使用している場合、プライベートネットワークのセットアップについてはVPCの作成方法に関するドキュメントを参照してください。
このチュートリアルでは、自身のディレクトリを共有するサーバーをホスト、これらのディレクトリをマウントするサーバーをクライアントと呼びます。両サーバーのIPアドレスを確認します。利用可能であれば、_プライベート_ネットワークアドレスを使用してください。
このチュートリアルでは、これらのIPアドレスをプレースホルダーごとにhost_ip
、client_ip
と呼びます。必要に応じて置き換えてください。
まず、各サーバーに必要なコンポーネントをインストールします。
ホストサーバーに、nfs-kernel-server
パッケージをインストールします。これにより、ディレクトリを共有できます。このセッションで初めて「 apt
」を使用して実行するので、インストールする前にローカルパッケージインデックスを更新します。
- sudo apt update
- sudo apt install nfs-kernel-server
これらのパッケージをインストールしたら、クライアントサーバーに切り替えます。
クライアントサーバーには、サーバーコンポーネントを含めずにNFS機能を提供する、nfs-common
というパッケージをインストールします。ここでも、インストールする前にローカルパッケージインデックスを更新して、情報が最新であるようにしてください。
- sudo apt update
- sudo apt install nfs-common
両方のサーバーに必要なパッケージが揃ったので、設定を開始します。
設定が異なる2つの個別のディレクトリを共有して、スーパーユーザーアクセスに関してNFSマウントを設定する2つの重要な方法を説明します。
スーパーユーザーは、システムのどこでも何でも実行できます。ただし、NFSマウントされたディレクトリは、それらが★マウントされているシステムの一部ではないため、デフォルトでは、NFSサーバーはスーパーユーザー権限を必要とする操作の実行を拒否します。このデフォルトの制限により、スーパーユーザーはクライアント上で rootとしてファイルを書き込んだり、所有権を再割り当てしたり、NFSマウントで他のスーパーユーザータスクを実行したりすることができません。
ただし、クライアントシステム側の信頼できるユーザーで、マウントされたファイルシステムでこれらのアクションを実行する必要はあっても、ホスト側でスーパーユーザーアクセスが不要なユーザーもいます。これを許可するようにNFSサーバーを設定できますが、ユーザーからホストシステム全体へのルートアクセスが_可能になる_、という危険要素も取り込むことになります。
最初の例では、デフォルトのNFS動作を使用する汎用NFSマウントを作成します。これはクライアントマシンでroot権限を持つユーザーが、 クライアントスーパーユーザー権限を使用してホストとやり取りするのを困難にするものです。 このようなものを使用して、コンテンツ管理システムを使用してアップロードされたファイルを保存したり、ユーザーがプロジェクトファイルを簡単に共有できるスペースを作成したりできます。
まず、共有ディレクトリを作成します。
- sudo mkdir /var/nfs/general -p
sudo
で作成しているため、ディレクトリの所有権はホストのrootユーザーにあります。
- ls -la /var/nfs/general
Outputdrwxr-xr-x 2 root root 4096 May 14 18:36 .
NFSは、セキュリティ対策として、クライアントの root操作をすべて nobody:nogroup
資格情報に変換します。 したがって、これらの資格情報と一致するようにディレクトリの所有権を変更します。
- sudo chown nobody:nogroup /var/nfs/general
これで、このディレクトリをエクスポートする準備が整いました。
次の例では、ゴールは、ホストに保存されているユーザーホームディレクトリをクライアントサーバーで使用できるようにし、それらのクライアントサーバーの信頼できる管理者がユーザーを管理しやすくなるように、必要なアクセスを許可することです。
これを行うには、/home
ディレクトリをエクスポートします。既存のディレクトリなので、作成する必要はありません。権限も変更しません。権限を_変更_すれば、ホストマシンにホームディレクトリを持つ全ユーザーにさまざまな問題をもたらすおそれがあります。
次に、これらのリソースの共有を設定するために、NFS設定ファイルを見ていきます。
ホストマシンで、テキストエディターを使用して、root権限で/etc/export
ファイルを開きます。
- 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
ただし、新しい共有を実際に使用する前に、ファイアウォールルールが共有へのトラフィックを許可しているか確認する必要があります。
まず、ファイアウォールステータスをチェックしてファイアウォールが有効になっているか確認し、有効になっている場合は、現在許可されているものを確認します。
- sudo ufw status
OutputStatus: 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
から許可されたトラフィックが表示されるはずです。
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
2049 ALLOW 203.0.113.24
OpenSSH (v6) ALLOW Anywhere (v6)
これにより、UFWがクライアントマシンからのNFSトラフィックをポート 2049
でのみ許可していることを確認できます。
ホストサーバーが設定され、共有を提供しているので、クライアントを準備します。
**クライアント **でリモート共有を利用できるようにするには、共有する **ホスト **のディレクトリを クライアント の空のディレクトリにマウントする必要があります。
**注:**マウントポイントに既存のファイルとディレクトリがある場合、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
これらのコマンドは、共有をホストコンピューターからクライアントマシンにマウントします。正常にマウントされたか再確認する方法がいくつかあります。プレーンなコマンドであるmount
やfindmnt
でも確認できますが、df -h
を使うと、より読みやすい出力になります。
- df -h
OutputFilesystem 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
マウントした2つの共有が下部に表示されます。同じファイルシステムからマウントされたため、同じディスク使用量を示しています。各マウントポイントの実際のスペース使用量を確認するには、ディスクの使用量を表示するdu
コマンドとマウントのパスを使用します。-s
フラグは、各ファイルの使用量ではなく、全体の使用量を表示します。-h
は人間が読める形式で出力します。
例えば:
- du -sh /nfs/home
Output36K /nfs/home
これは、ホームディレクトリ全体のコンテンツが使用可能な領域のうち36Kだけを使用していることを示しています。
次に、それぞれの共有に何かを書き込んで共有へのアクセスをテストしましょう。
最初に、テストファイルを/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
コマンドを使用してクライアントマシンのroot ユーザーとしてファイルを作成したため、ファイルの所有者はデフォルトでnobody:nogroup
になります。 クライアントのスーパーユーザーは、このNFSマウントされた共有でファイルの所有者を変更したり、ユーザーグループの新しいディレクトリを作成したりするなど、一般的な管理アクションを実行できません。
汎用共有とホームディレクトリ共有の権限を比較するには、同じ方法で/nfs/home
ディレクトリにファイルを作成します。
- 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として機能し、ユーザーアカウントの管理がはるかに便利になります。これは同時に、これらのユーザーにホスト上でルートアクセスを許可する必要がない、ということです。
リモートのNFS共有をclientの/etc/fstab
ファイルに追加することにより、ブート時に自動的にマウントできます。
テキストエディターでこのファイルをroot権限で開きます。
- 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
clientサーバーは、ブート時にリモートパーティションを自動的にマウントしますが、接続を確立して共有を利用できるようになるまでに少し時間がかかる場合があります。
システムにリモートディレクトリをマウントする必要がなくなった場合は、次のように共有のディレクトリ構造から移動してアンマウントすることにより、リモートディレクトリのマウントを解除できます。
- cd ~
- sudo umount /nfs/home
- sudo umount /nfs/general
コマンド名はいかにもそれらしいunmount
ではなくumount
であることに注意してください。
これにより、リモート共有が削除され、ローカルストレージのみがアクセス可能になります。
- df -h
OutputFilesystem 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か他の何らかの暗号化トンネルが必要になります。
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!