Ubuntu 18.04にNFSマウントを設定する方法

紹介

NFS、またはネットワークファイルシステムは、リモートディレクトリをサーバーにマウントできるようにする分散ファイルシステムプロトコルです。これにより、異なる場所のストレージスペースを管理し、複数のクライアントからそのスペースに書き込むことができます。NFSはネットワーク経由でリモートシステムにアクセスする比較的標準的でパフォーマンスの良い方法を提供し、共有リソースに定期的にアクセスする必要がある状況でうまく機能します。

このガイドでは、Ubuntu 18.04でNFS機能に必要なソフトウェアをインストールし、サーバーとクライアントでNFSマウントを構成し、リモート共有をマウントおよびアンマウントする方法について学びます。

前提条件

このチュートリアルでは、1つのサーバーが別のサーバーとその一部のファイルシステムを共有する形で2つのサーバーを使用します。このチュートリアルを完了するには、以下が必要です:

  • 2つのUbuntu 18.04サーバー。それぞれに、sudo権限が設定されたroot以外のユーザー、UFWで設定されたファイアウォール、そして可能であればプライベートネットワークを持つ必要があります。

    • rootユーザーのsudo権限とファイアウォールの設定についての支援は、当社のUbuntu 18.04での初期サーバーセットアップガイドに従ってください。

    • サーバーとクライアントにDigitalOcean Dropletsを使用している場合は、VPCの作成方法を読んでプライベートネットワークを設定してください。

このチュートリアルでは、ディレクトリを共有するサーバーをホストと呼び、これらのディレクトリをマウントするサーバーをクライアントと呼びます。次のIPアドレスをホストおよびクライアントの値の代用として使用します:

  • ホスト: 203.0.113.0
  • クライアント: 203.0.113.24

これらのIPアドレスがコマンドや構成ファイルに表示される場合は、それぞれのホストおよびクライアントIPアドレスに置き換えてください。

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

まず、各サーバーに必要なコンポーネントをインストールしてください。

ホストで

ホストサーバーに、ディレクトリを共有するためのnfs-kernel-serverパッケージをインストールします。このセッションで最初に行う操作なので、インストールの前にローカルパッケージインデックスを更新してください:

  1. sudo apt update

次に、パッケージをインストールします:

  1. sudo apt install nfs-kernel-server

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

クライアントで

クライアントサーバーで、NFSの機能を提供するnfs-commonパッケージをインストールします。再度、インストールの前にローカルパッケージインデックスを更新して、最新の情報を確認してください:

  1. sudo apt update

その後、パッケージをインストールします:

  1. sudo apt install nfs-common

両方のサーバーに必要なパッケージがインストールされたので、それらの設定を開始できます。

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

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

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

しかし、クライアントシステムには信頼されたユーザーがいる場合があり、これらのアクションをマウントされたファイルシステムで実行する必要があるが、ホスト上でスーパーユーザーアクセスは不要な場合があります。これを許可するように NFS サーバーを設定できますが、このようなユーザーがrootアクセスを取得し、全体のホストシステムにアクセスする可能性があるため、リスクが伴います。

例 1: 一般目的のマウントのエクスポート

最初の例では、デフォルトの NFS 動作を使用して、クライアントマシン上のスーパーユーザーがそのクライアントのスーパーユーザー特権を使用してホストとやり取りすることが難しくなる一般的な NFS マウントを作成します。これは、コンテンツ管理システムを使用してアップロードされたファイルを保存したり、ユーザーがプロジェクトファイルを共有するためのスペースを作成するために使用するかもしれません。

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

  1. sudo mkdir /var/nfs/general -p

sudoを使用して作成しているため、ディレクトリはホストrootユーザーによって所有されています:

  1. ls -la /var/nfs/general
Output
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は、セキュリティ上の措置として、クライアントでのroot操作をnobody:nogroupの資格情報に変換します。したがって、ディレクトリの所有権をこれらの資格情報に合わせる必要があります:

  1. sudo chown nobody:nogroup /var/nfs/general

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

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

2番目の例では、ユーザーホームディレクトリをホストに保存し、それらのクライアントサーバーの信頼できる管理者がユーザーを便利に管理できるようにします。

これを行うには、/homeディレクトリをエクスポートします。既に存在しているため、作成する必要はありません。また、アクセス許可を変更しません。そうすると、ホストマシンのホームディレクトリを持つユーザーにさまざまな問題が発生する可能性があります。

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

次に、これらのリソースの共有を設定するために、NFS構成ファイルに入り込んでみましょう。

ホストマシンで、お好みのテキストエディタ(ここではnano)をroot権限で使用して、/etc/exportsファイルを開きます。

  1. sudo nano /etc/exports

ファイルには、各構成行の一般的な構造を示すコメントがあります。構文は次のようになります:

/etc/exports
directory_to_share    client(share_option1,...,share_optionN)

共有する各ディレクトリに対して1行を作成する必要があります。例えば、私たちの例のクライアントのIPが203.0.113.24である場合、次のような行になります。IPアドレスをあなたのクライアントのものに変更してください:

/etc/exports
/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を押してYENTERを押します。次に、構成したクライアントに共有を利用可能にするには、以下のコマンドでNFSサーバーを再起動します:

  1. sudo systemctl restart nfs-kernel-server

ただし、新しい共有を実際に使用するには、共有へのトラフィックがファイアウォールルールで許可されていることを確認する必要があります。

ステップ4 — ホストのファイアウォールの調整

まず、ファイアウォールの状態を確認して、有効になっているかどうか、現在何が許可されているかを確認します:

  1. sudo ufw status
Output
Status: 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アドレスに置き換えてください。

  1. sudo ufw allow from 203.0.113.24 to any port nfs

変更を確認するには、次のコマンドを実行します。

  1. sudo ufw status

出力でポート2049から許可されたトラフィックのリストが表示されます。

Output
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つのディレクトリを作成します。最初のディレクトリを作成するには、次のコマンドを実行します::

  1. sudo mkdir -p /nfs/general

次に、2番目のディレクトリを作成するために、次のコマンドを実行します::

  1. sudo mkdir -p /nfs/home

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

  1. sudo mount 203.0.113.0:/var/nfs/general /nfs/general
  2. sudo mount 203.0.113.0:/home /nfs/home

これらのコマンドは、ホストコンピューターから共有をクライアントマシンにマウントします。マウントが成功したかどうかは、いくつかの方法で確認できます。これは、mountまたはfindmntコマンドで確認できますが、df -hは、NFS共有のディスク使用状況が異なる方法で表示される、より読みやすい出力を提供します::

  1. df -h
Output
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は人間に読みやすい出力を表示します::

  1. du -sh /nfs/home
Output
44K /nfs/home

これにより、ホームディレクトリ全体の内容が利用可能なスペースの44Kしか使用していないことがわかります。

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

次に、それぞれの共有へのアクセスをテストします。何かを書き込んでみてください。

例1: 汎用共有

まず、テストファイルを /var/nfs/general 共有に書き込んでください。

  1. sudo touch /nfs/general/general.test

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

  1. ls -l /nfs/general/general.test
Output
-rw-r--r-- 1 nobody nogroup 0 Feb 7 23:53 /nfs/general/general.test

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

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

汎用共有とホームディレクトリ共有のパーミッションを比較するために、同じ方法で /nfs/home にファイルを作成します。

  1. sudo touch /nfs/home/home.test

その後、ファイルの所有権を確認します:

  1. ls -l /nfs/home/home.test
Output
-rw-r--r-- 1 root root 0 Feb 7 23:56 /nfs/home/home.test

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

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

リモート NFS 共有をブート時に自動的にマウントするには、クライアント/etc/fstab ファイルにそれらを追加します。

お好みのテキストエディタで、次のファイルをルート権限で開きます:

  1. sudo nano /etc/fstab

ファイルの末尾に、次のように各共有に対する行を追加します:

/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 ページで確認できます。次のコマンドを実行してアクセスできます:

  1. man nfs

クライアントサーバーは、起動時にリモートパーティションを自動的にマウントしますが、接続を確立し、共有が利用可能になるまでに数分かかる場合があります。

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

もはやリモートディレクトリをシステムにマウントしたくない場合は、共有のディレクトリ構造から抜け出してアンマウントすることができます。

まず、ホームディレクトリに移動します:

  1. cd ~

次に、/nfs/homeをアンマウントします。コマンドはumountという名前であり、unmountと予想されるかもしれませんが、注意してください:

  1. sudo umount /nfs/home

次に、/nfs/generalをアンマウントします:

  1. sudo umount /nfs/general

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

  1. df -h
Output
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を本番環境で実装する場合は、プロトコル自体が暗号化されていないことに注意することが重要です。プライベートネットワークを介してファイルを共有する場合、これは問題にならないかもしれません。他の場合では、VPNやその他の種類の暗号化トンネルがデータを保護するために必要になります。パフォーマンスに問題がある場合は、SSHFSの使用を検討してください。

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-mount-on-ubuntu-18-04