Ubuntu 18.04でNFSマウントを設定する方法
Ubuntu 18.04を使用していませんか?別のバージョンやディストリビューションを選択してください。
紹介
NFS、つまりネットワークファイルシステムは、リモートディレクトリをサーバーにマウントすることを可能にする分散ファイルシステムプロトコルです。これにより、異なる場所のストレージスペースを管理し、複数のクライアントからそのスペースに書き込むことができます。NFSは、ネットワーク越しにリモートシステムにアクセスするための比較的標準的でパフォーマンスの良い方法を提供し、共有リソースに定期的にアクセスする必要がある状況でうまく機能します。
このガイドでは、Ubuntu 18.04にNFS機能に必要なソフトウェアをインストールする方法、サーバーとクライアントにNFSマウントを設定する方法、リモート共有をマウントおよびアンマウントする方法について学びます。
前提条件
このチュートリアルでは、2つのサーバーを使用し、一方がもう一方とそのファイルシステムの一部を共有します。このチュートリアルを完了するには、次のものが必要です:
2つのUbuntu 18.04サーバー。これらの各サーバーには、root以外のユーザーが
sudo権限を設定されている必要があります。また、UFWでファイアウォールを設定し、利用可能であればプライベートネットワークを構成する必要があります。-
非rootユーザーを設定し、
sudo権限とファイアウォールを設定するための支援については、Ubuntu 18.04の初期サーバーセットアップガイドをご覧ください。
-
サーバーとクライアントにDigitalOcean Dropletsを使用している場合は、プライベートネットワークを設定する方法について「VPCの作成方法」をお読みください。
このチュートリアル全体を通して、ディレクトリを共有するサーバーをホストと呼び、これらのディレクトリをマウントするサーバーをクライアントと呼びます。以下のIPアドレスをホストとクライアントの値の代わりとして使用します:
- ホスト:
203.0.113.0 - クライアント:
203.0.113.24
これらのIPアドレスがコマンドや設定ファイルに表示された場合は、それぞれのホストおよびクライアントのIPアドレスに置き換えてください。
ステップ1 — コンポーネントのダウンロードとインストール
最初に各サーバーに必要なコンポーネントをインストールします。
ホストで
ホストサーバーに、ディレクトリを共有するための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サーバーをこのように構成することができますが、それはリスクを伴います。なぜなら、そのようなユーザーが<強>ホスト強>システム全体に<強>ルート強>アクセスを得る可能性があるからです。
例1:汎用マウントのエクスポート
最初の例では、デフォルトのNFS動作を使用して、クライアントマシン上のroot権限を持つユーザーが、これらのクライアントスーパーユーザー権限を使用してホストと相互作用するのを難しくする、一般的なNFSマウントを作成します。このようなもので、コンテンツ管理システムを使用してアップロードされたファイルを保存したり、ユーザーがプロジェクトファイルを共有するためのスペースを作成したりするかもしれません。
まず、共有ディレクトリを作成します:
- sudo mkdir /var/nfs/general -p
あなたがsudoで作成しているので、そのディレクトリはホストのルートユーザーが所有しています。
- ls -la /var/nfs/general
total 8
drwxr-xr-x 2 root root 4096 Feb 7 23:21 .
drwxr-xr-x 3 root root 4096 Feb 7 23:21 ..
NFSは、セキュリティ対策として、クライアント上のすべてのルート操作をnobody:nogroupの資格情報に変換します。したがって、ディレクトリの所有権をこれらの資格情報に一致させる必要があります:
- sudo chown nobody:nogroup /var/nfs/general
このディレクトリをエクスポートする準備が整いました。
例 2: ホームディレクトリのエクスポート
私たちの2番目の例では、目標は、ホストに保存されたユーザーホームディレクトリをクライアントサーバーで利用できるようにし、信頼された管理者がユーザーを便利に管理できるように必要なアクセスを許可することです。
これを行うには、/home ディレクトリをエクスポートします。すでに存在しているため、作成する必要はありません。また、権限を変更することもありません。もし変更した場合、ホスト マシン上のホームディレクトリを持つ人々にさまざまな問題が発生する可能性があります。
ステップ3 — ホストサーバーでのNFSエクスポートの構成
次に、NFS構成ファイルに入り、これらのリソースの共有を設定します。
ホストマシンで、好みのテキストエディタを使って、/etc/exportsファイルをルート権限で開きます。ここではnanoを使用します:
- sudo nano /etc/exports
ファイルには各設定行の一般的な構造を示すコメントがあります。構文は次のとおりです:
directory_to_share client(share_option1,...,share_optionN)
共有する予定の各ディレクトリのためにラインを作成する必要があります。私たちの例のクライアントのIPが203.0.113.24であるため、私たちのラインは次のようになります。必ずクライアントのIPアドレスに変更してください:
/var/nfs/general 203.0.113.24(rw,sync,no_subtree_check)
/home 203.0.113.24(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は、特定の共有に対してこの動作を無効にします。
変更を終えたら、ファイルを保存して閉じてください。nanoを使用している場合は、CTRL + Xを押し、その後YとENTERを押すことでこれを行うことができます。次に、設定したクライアントに共有を利用可能にするために、次のコマンドで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.24 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
次に、このコマンドを実行して2番目を作成します:
- sudo mkdir -p /nfs/home
リモート共有を配置する場所ができ、ファイアウォールを開放したので、このガイドでの 203.0.113.0 の ホスト サーバーのIPアドレスを使用して共有をマウントできます。
- 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 480M 0 480M 0% /dev
tmpfs 99M 5.6M 94M 6% /run
/dev/vda1 25G 1.3G 23G 6% /
tmpfs 493M 0 493M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 493M 0 493M 0% /sys/fs/cgroup
/dev/vda15 105M 4.4M 100M 5% /boot/efi
tmpfs 99M 0 99M 0% /run/user/1000
203.0.113.0:/var/nfs/general 25G 1.3G 23G 6% /nfs/general
203.0.113.0:/home 25G 1.3G 23G 6% /nfs/home
マウントされた両方の共有は下部に表示されます。同じファイルシステムからマウントされたため、ディスク使用量も同じです。それぞれのマウントポイントの下で実際にどれだけのスペースが使用されているかを確認するには、ディスク使用量コマンドduとマウントのパスを使用します。-sフラグは、すべてのファイルの使用量を表示するのではなく、使用量の概要を提供します。-hは、人間が読みやすい出力を印刷します:
- du -sh /nfs/home
44K /nfs/home
これにより、ホームディレクトリ全体の内容が利用可能なスペースのうちわずか44Kを使用していることが示されます。
ステップ 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 Feb 7 23:53 /nfs/general/general.test
NFSのデフォルトの動作を変更せずにこのボリュームをマウントし、sudoコマンドを使用してclientマシンのrootユーザーとしてファイルを作成したため、ファイルの所有権はデフォルトでnobody:nogroupになります。clientのスーパーユーザーは、このNFSマウントされた共有上でファイルの所有者を変更したり、ユーザーグループのために新しいディレクトリを作成するなどの一般的な管理作業を行うことができません。
例2: ホームディレクトリ共有
一般目的の共有の権限をホームディレクトリの共有と比較するには、/nfs/homeに同じ方法でファイルを作成します:
- sudo touch /nfs/home/home.test
次に、ファイルの所有権を確認します:
- ls -l /nfs/home/home.test
-rw-r--r-- 1 root root 0 Feb 7 23:56 /nfs/home/home.test
home.testをrootとしてsudoコマンドを使用して作成しましたが、general.testファイルを作成したのとまったく同じ方法です。しかし、このケースでは、rootによって所有されているのは、no_root_squashオプションをこのマウントで指定することによってデフォルトの動作を上書きしたためです。これにより、クライアントマシンのrootユーザーはrootとして機能でき、ユーザーアカウントの管理がはるかに便利になります。同時に、これにより、これらのユーザーにホスト上でrootアクセスを与える必要がなくなります。
ステップ7 — ブート時にリモートNFSディレクトリをマウントする
クライアントのclient上の/etc/fstabファイルにリモートNFS共有を追加することで、起動時に自動的にマウントできます。
お好みのテキストエディタで以下のファイルをルート権限で開いてください:
- sudo nano /etc/fstab
ファイルの最後に、以下のように自分の株ごとに行を追加してください:
. . .
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
注: ここで指定されたオプションに関する詳細情報は、NFSのmanページで確認できます。次のコマンドを実行することでアクセスできます:
- man nfs
クライアントサーバーは、起動時にリモートパーティションを自動的にマウントしますが、接続を確立し、共有が利用可能になるまでに数瞬かかる場合があります。
ステップ8 — NFSリモート共有のアンマウント
リモートディレクトリをシステムにマウントし続けたくない場合は、共有のディレクトリ構造から出て、アンマウントすることでアンマウントできます。
まずホームディレクトリに移動してください:
- cd ~
その後、/nfs/home をアンマウントします。コマンドの名前は、あなたが予想するかもしれない unmount ではなく、umount であることに注意してください:
- sudo umount /nfs/home
次に、/nfs/generalをアンマウントします:
- sudo umount /nfs/general
これはリモート共有を削除し、ローカルストレージのみがアクセス可能になります:
- df -h
Filesystem Size Used Avail Use% Mounted on
udev 480M 0 480M 0% /dev
tmpfs 99M 5.5M 94M 6% /run
/dev/vda1 25G 1.3G 23G 6% /
tmpfs 493M 0 493M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 493M 0 493M 0% /sys/fs/cgroup
/dev/vda15 105M 4.4M 100M 5% /boot/efi
tmpfs 99M 0 99M 0% /run/user/1000
次回の再起動時に再マウントされるのを防ぎたい場合は、/etc/fstabを編集し、その行を削除するか、行の先頭に#文字を追加してコメントアウトしてください。また、autoオプションを削除することで、自動マウントを防ぎ、手動でマウントすることができます。
結論
このチュートリアルでは、NFSホストを作成し、2つの異なるNFSマウントを作成することで、いくつかの重要なNFSの動作を示しました。これらのマウントは、NFSクライアントと共有しました。プロダクションでNFSを実装することを検討している場合、プロトコル自体は暗号化されていないことに注意が必要です。プライベートネットワーク上でファイルを共有する場合は、問題にならないことがありますが、他の場合ではデータを保護するためにVPNやその他の種類の暗号化トンネルが必要になることがあります。その場合、パフォーマンスが大幅に低下することが多くあります。パフォーマンスが問題である場合は、SSHFSの使用を検討してください。
