Ubuntu 16.04でNFSマウントを設定する方法
Ubuntu 16.04を使用していませんか?別のバージョンやディストリビューションを選択してください。
紹介
NFS、すなわちネットワークファイルシステムは、リモートディレクトリをサーバーにマウントすることを可能にする分散ファイルシステムプロトコルです。これにより、異なる場所のストレージスペースを管理し、複数のクライアントからそのスペースに書き込むことができます。NFSは、ネットワークを介してリモートシステムにアクセスするための比較的迅速かつ簡単な方法を提供し、共有リソースが定期的にアクセスされる状況でうまく機能します。
このガイドでは、NFSマウントの構成方法について説明します。
前提条件
このチュートリアルでは、2つのサーバーを使用します。一方のサーバーは、もう一方とファイルシステムの一部を共有します。続けていくためには、次のものが必要です:
非ルートユーザーが
sudo権限を持つ2台のUbuntu 16.04サーバーとプライベートネットワークが有効になっています。-
これらの特権を持つユーザーを設定するための支援については、Ubuntu 16.04の初期サーバー設定ガイドに従ってください。
-
プライベートネットワーキングの設定に関するヘルプは、「DigitalOceanプライベートネットワーキングの設定と使用方法」を参照してください。
チュートリアル全体を通して、ディレクトリを共有するサーバーを ホスト と呼び、それらのディレクトリをマウントするサーバーを クライアント と呼びます。混乱を避けるために、以下のIPアドレスをホストとクライアントの値の代わりに使用します:
- ホスト: 203.0.113.0
- クライアント: 203.0.113.256
これらの値を自分のホストおよびクライアントのIPアドレスに置き換えるべきです。
ステップ1 — コンポーネントのダウンロードとインストール
各サーバーに必要なコンポーネントをインストールすることから始めましょう。
ホストで
ホストサーバーに、ディレクトリを共有するために nfs-kernel-server パッケージをインストールします。このセッションで apt を使用して最初の操作を行うため、インストールの前にローカルのパッケージインデックスを更新します:
- sudo apt-get update
- sudo apt-get install nfs-kernel-server
これらのパッケージがインストールされたら、クライアントサーバーに切り替えます。
クライアント上で
クライアントサーバーには、不要なサーバーコンポーネントを含まずにNFS機能を提供するnfs-commonというパッケージをインストールする必要があります。再度、インストール前にローカルパッケージインデックスを更新して、最新の情報を確保します:
- sudo apt-get update
- sudo apt-get install nfs-common
両方のサーバーに必要なパッケージが揃ったので、設定を開始できます。
ステップ2 — ホスト上に共有ディレクトリを作成する
私たちは、スーパーユーザーアクセスに関してNFSマウントが設定できる2つの重要な方法を示すために、異なる構成設定を持つ2つの別々のディレクトリを共有します。
スーパーユーザーは、自分のシステム上のどこでも何でも行うことができます。しかし、NFSマウントされたディレクトリは、マウントされているシステムの一部ではないため、デフォルトでは、NFSサーバーはスーパーユーザー権限を必要とする操作を拒否します。このデフォルトの制限により、クライアントのスーパーユーザーは、ルートとしてファイルを書き込んだり、所有権を再割り当てしたり、NFSマウント上で他のスーパーユーザーのタスクを実行したりできません。
ただし、時々、クライアントシステム上に信頼できるユーザーがいて、マウントされたファイルシステム上でこれらの作業を行う必要があるが、ホスト上でスーパーユーザー権限を必要としない場合があります。NFSサーバーはこれを許可するように設定できますが、それはリスク要素を伴います。なぜなら、そのようなユーザーが全体のホストシステムにルートアクセスを得る可能性があるからです。
例1:汎用マウントのエクスポート
最初の例では、デフォルトのNFS動作を使用して、クライアントマシンでのroot権限を持つユーザーがそのクライアントのスーパーユーザー権限を使用してホストと対話するのを難しくする一般的なNFSマウントを作成します。このようなものは、コンテンツ管理システムを使用してアップロードされたファイルを保存するためや、ユーザーがプロジェクトファイルを簡単に共有できるスペースを作成するために使用することがあります。
まず、nfsという共有ディレクトリを作成します。
- sudo mkdir /var/nfs/general -p
私たちがsudoを使って作成しているので、このホスト上のディレクトリはrootが所有しています。
- ls -la /var/nfs/general
4 drwxr-xr-x 2 root root 4096 Jul 25 15:26 .
NFSは、セキュリティ対策として、クライアントでのすべてのroot操作をnobody:nogroupの資格情報に変換します。したがって、これらの資格情報に一致するようにディレクトリの所有権を変更する必要があります。
- sudo chown nobody:nogroup /var/nfs/general
このディレクトリは現在、エクスポートの準備が整いました。
例 2: ホームディレクトリのエクスポート
私たちの第二の例では、目的はホストに保存されたユーザーホームディレクトリをクライアントサーバーで利用可能にし、信頼された管理者がユーザーを便利に管理するために必要なアクセスを許可することです。
これを実行するために、/home ディレクトリをエクスポートします。すでに存在しているので、作成する必要はありません。また、権限も変更しません。もし変更した場合、ホストマシンにホームディレクトリを持つすべての人にさまざまな問題を引き起こすことになります。
ステップ3 — ホストサーバーでのNFSエクスポートの構成
次に、NFS構成ファイルに入り、これらのリソースの共有を設定します。
テキストエディタでルート権限を使用して /etc/exports ファイルを開いてください:
- sudo nano /etc/exports
ファイルには各設定行の一般的な構造を示すコメントがあります。構文は基本的に次のようになります:
directory_to_share client(share_option1,...,share_optionN)
私たちは、共有する予定の各ディレクトリのために行を作成する必要があります。私たちの例のクライアントのIPは203.0.113.256なので、私たちの行は以下のようになります。クライアントに合わせてIPを変更することを忘れないでください:
/var/nfs/general 203.0.113.256(rw,sync,no_subtree_check)
/home 203.0.113.256(rw,sync,no_root_squash,no_subtree_check)
両方のディレクトリに対して、no_root_squash を除いて同じ設定オプションを使用しています。それぞれが何を意味するのか見てみましょう。
- rw: このオプションは、クライアントコンピュータにボリュームへの読み取りおよび書き込みアクセスを提供します。
- 同期: このオプションは、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 203.0.113.256 to any port nfs
変更を確認するには、次のように入力します:
- sudo ufw status
出力にポート2049からのトラフィックが許可されていることが表示されるはずです:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
2049 ALLOW 203.0.113.256
OpenSSH (v6) ALLOW Anywhere (v6)
これは、UFWがクライアントマシンからのポート2049でのNFSトラフィックのみを許可することを確認します。
ステップ5 — クライアント上でのマウントポイントの作成
ホストサーバーが設定され、共有を提供できるようになったので、クライアントを準備します。
リモート共有をクライアントで利用できるようにするためには、ホストディレクトリを空のクライアントディレクトリにマウントする必要があります。
注意:マウントポイントにファイルやディレクトリがある場合、NFS共有をマウントするとすぐにそれらは隠れます。既に存在するディレクトリにマウントする場合は、そのディレクトリが空であることを確認してください。
マウント用に2つのディレクトリを作成します:
- sudo mkdir -p /nfs/general
- sudo mkdir -p /nfs/home
ステップ6 — クライアント上のディレクトリをマウントする
リモート共有を置く場所ができ、ファイアウォールを開いたので、ホストサーバーにアクセスすることで共有をマウントできます。このガイドでのホストサーバーは203.0.113.0です。次のように:
- sudo mount 203.0.113.0:/var/nfs/general /nfs/general
- sudo mount 203.0.113.0:/home /nfs/home
これらのコマンドは、ホストコンピュータからクライアントマシンに共有をマウントするべきです。マウントが成功したかどうかは、いくつかの方法で再確認できます。単純なmountまたはfindmntコマンドで確認することもできますが、df -hを使用すれば、ディスク使用量がnfs共有に対してどのように異なって表示されるかを示す、より人間に読みやすい出力を得ることができます。
- df -h
Filesystem 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
203.0.113.0:/home 20G 1.2G 18G 7% /nfs/home
203.0.113.0:/var/nfs/general 20G 1.2G 18G 7% /nfs/general
取り付けた2つの共有は下部に表示されます。これらは同じファイルシステムからマウントされたため、同じディスク使用量を示しています。それぞれのマウントポイントの下で実際に使用されているスペースを確認するには、ディスク使用量コマンドduとマウントのパスを使用してください。-sフラグは、すべてのファイルの使用量を表示するのではなく、使用量の概要を提供します。-hは、人間が読みやすい出力を印刷します。
例えば:
- du -sh /nfs/home
36K /nfs/home
これにより、ホームディレクトリ全体の内容が利用可能なスペースのうち20Kしか使用していないことが示されます。
ステップ7 — 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マウントされた共有上で実行することができません。
例2: ホームディレクトリ共有
一般目的共有とホームディレクトリ共有の権限を比較するために、同様にファイルホームディレクトリを作成します。
- 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
私たちは、sudoコマンドを使用してhome.testをルートとして作成しましたが、これはgeneral.testファイルを作成したのと全く同じ方法です。ただし、この場合は、マウント時にno_root_squashオプションを指定したため、ルートが所有者になっています。これにより、クライアントマシンのルートユーザーがルートとして行動でき、ユーザーアカウントの管理がはるかに便利になります。一方で、ホスト上でこれらのユーザーにルートアクセスを与える必要がないことを意味します。
ステップ8 — ブート時にリモートNFSディレクトリをマウントする
クライアントの /etc/fstab ファイルにリモート NFS シェアを追加することで、起動時に自動的にマウントできます。
このファイルをルート権限でテキストエディタで開いてください:
- sudo nano /etc/fstab
ファイルの最後に、私たちの各シェアに対して1行を追加します。それらはこのように見えます:
. . .
203.0.113.0:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
203.0.113.0:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
注意: ここで指定しているオプションに関する詳細情報は、man nfsコマンドを使用してfstabでNFSマウントを説明するマニュアルページにあります。
クライアントサーバーは、リモートパーティションを自動的にブート時にマウントしますが、接続が確立され、共有が利用可能になるまでに数分かかることがあります。
ステップ 9 — NFS リモート共有のマウント解除
リモートディレクトリをシステムにマウントしたくない場合は、共有のディレクトリ構造から出て、アンマウントすることでアンマウントできます。次のようにします:
- cd ~
- sudo umount /nfs/home
- sudo umount /nfs/general
これはリモート共有を削除し、ローカルストレージのみがアクセス可能になります:
- df -h
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クライアントと共有した2つの異なるNFSマウントを作成することで、いくつかの重要なNFSの動作を説明しました。生産環境でNFSを実装することを検討している場合、プロトコル自体が暗号化されていないことに注意することが重要です。公開可能なファイルを共有する場合、深刻な問題を引き起こすことはありません。
ただし、プライベートデータにNFSを使用している場合は、そのデータをどのように保護するかを決定する必要があります。より安全な体験を確保するために、SSHまたはVPN接続を介してNFSをルーティングできるかもしれませんが、これにはしばしばパフォーマンスの深刻な低下が伴います。パフォーマンスが問題である場合は、SSHFSを検討してください。暗号化されていないNFSトラフィックよりはわずかに遅いですが、トンネル化されたNFSよりは通常ずっと速いです。NFSのためのKerberos認証暗号化も検討するオプションです。
