序章

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

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

前提条件

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

  • 2つのUbuntu18.04サーバー。 これらのそれぞれには、sudo特権が構成された非rootユーザー、UFWでセットアップされたファイアウォール、および利用可能な場合はプライベートネットワークが必要です。

    • sudo権限とファイアウォールを備えたroot以外のユーザーのセットアップについては、 Ubuntu18.04の初期サーバーセットアップガイドに従ってください。

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

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

  • 亭主: 203.0.113.0
  • クライアント: 203.0.113.24

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

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

まず、各サーバーに必要なコンポーネントをインストールすることから始めます。

ホスト上

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

  1. sudo apt update

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

  1. sudo apt install nfs-kernel-server

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

クライアント上

client サーバーに、nfs-commonというパッケージをインストールします。これは、サーバーコンポーネントを含まずにNFS機能を提供します。 繰り返しになりますが、インストールする前にローカルパッケージインデックスを更新して、最新の情報があることを確認してください。

  1. sudo apt update

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

  1. sudo apt install nfs-common

両方のサーバーに必要なパッケージが用意されたので、それらの構成を開始できます。

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

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

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

ただし、 client システムには、マウントされたファイルシステムでこれらのアクションを実行する必要があるが、hostではスーパーユーザーアクセスを必要としない信頼できるユーザーがいる場合があります。 これを許可するようにNFSサーバーを構成できますが、リスクの要素が発生するため、ユーザーはhostシステム全体へのrootアクセスを取得できます。

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

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

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

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

sudoで作成しているため、ディレクトリはhostrootユーザーが所有しています。

  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は、セキュリティ対策として、clientでのroot操作をnobody:nogroupクレデンシャルに変換します。 したがって、これらの資格情報と一致するようにディレクトリの所有権を変更する必要があります。

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

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

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

2番目の例では、 hostに格納されているユーザーのホームディレクトリをclient サーバーで使用できるようにすると同時に、それらのclientサーバーの信頼できる管理者がアクセスできるようにすることを目的としています。ユーザーを便利に管理する必要があります。

これを行うには、/homeディレクトリをエクスポートします。 すでに存在しているので、作成する必要はありません。 権限も変更しません。 そうした場合、hostマシンにホームディレクトリを持っている人にとってはさまざまな問題が発生する可能性があります。

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

次に、NFS構成ファイルを詳しく調べて、これらのリソースの共有を設定します。

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

  1. sudo nano /etc/exports

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

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

共有する予定のディレクトリごとに1行を作成する必要があります。 この例のclientのIPは203.0.113.24であるため、行は次のようになります。 必ずIPアドレスをクライアントの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:このオプションは、clientコンピューターにボリュームへの読み取りアクセスと書き込みアクセスの両方を提供します。
  • sync:このオプションは、応答する前にNFSに変更をディスクに書き込むように強制します。 これにより、応答がリモートボリュームの実際の状態を反映するため、より安定した一貫性のある環境が実現します。 ただし、ファイル操作の速度も低下します。
  • no_subtree_check:このオプションは、サブツリーチェックを防ぎます。これは、 host が、リクエストごとにエクスポートされたツリーでファイルが実際にまだ利用可能かどうかをチェックする必要があるプロセスです。 これにより、clientが開いているときにファイルの名前が変更されると多くの問題が発生する可能性があります。 ほとんどの場合、サブツリーチェックを無効にすることをお勧めします。
  • no_root_squash:デフォルトでは、NFSはrootユーザーからの要求をサーバー上の非特権ユーザーにリモートで変換します。 これは、クライアントルートアカウントがホストのファイルシステムをルートとして使用しないようにするためのセキュリティ機能として意図されていました。 no_root_squashは、特定の共有に対してこの動作を無効にします。

変更が完了したら、ファイルを保存して閉じます。 nanoを使用している場合は、CTRL + XYENTERの順に押すとこれを行うことができます。 次に、構成したクライアントが共有を使用できるようにするには、次のコマンドを使用して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—クライアントでのマウントポイントとマウントディレクトリの作成

host サーバーが構成され、その共有を提供するようになったので、clientを準備します。

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

注:マウントポイントにファイルとディレクトリがある場合、NFS共有をマウントするとすぐにそれらは非表示になります。 重要なファイルの損失を回避するために、すでに存在するディレクトリにマウントする場合は、そのディレクトリが空であることを確認してください。

マウント用に2つのディレクトリを作成します。 次のコマンドを実行して、最初のコマンドを作成します。

  1. sudo mkdir -p /nfs/general

次に、このコマンドを実行して2番目のコマンドを作成します::

  1. sudo mkdir -p /nfs/home

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

  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コマンドを使用してclientマシンのroot ユーザーとしてファイルを作成したため、ファイルの所有権はデフォルトでnobody:nogroup client スーパーユーザーは、この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

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

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

リモートNFS共有は、クライアント/etc/fstabファイルに追加することで、起動時に自動的にマウントできます。

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

  1. sudo nano /etc/fstab

ファイルの最後に、次のように、共有ごとに1行追加します。

/ 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

注:ここで指定されているオプションの詳細については、NFSmanページを参照してください。 次のコマンドを実行して、これにアクセスできます。

  1. man nfs

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

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

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

最初にホームディレクトリに移動します。

  1. cd ~

次に、/nfs/homeをアンマウントします。 コマンドの名前はunmountではなくumountであることに注意してください。

  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ホストを作成し、NFSクライアントと共有する2つの異なるNFSマウントを作成することでいくつかの主要なNFS動作を説明しました。 本番環境でNFSを実装しようとしている場合は、プロトコル自体が暗号化されていないことに注意することが重要です。 プライベートネットワークを介してファイルを共有している場合、これは問題ではない可能性があります。 それ以外の場合は、データを保護するためにVPNまたはその他の種類の暗号化トンネルが必要になります。 これにより、パフォーマンスが大幅に低下することがよくあります。 パフォーマンスが問題になる場合は、SSHFSの使用を検討してください。