Debian 11でNFSマウントの設定方法
はじめに
NFS(ネットワークファイルシステム)は、サーバー上でリモートディレクトリをマウントすることができる分散ファイルシステムプロトコルです。これにより、異なる場所にあるストレージスペースを管理し、複数のクライアントからそのスペースに書き込むことが可能です。NFSは、ネットワークを介してリモートシステムにアクセスするための比較的標準的でパフォーマンスの良い方法を提供し、共有リソースに定期的にアクセスする必要がある状況においても優れた機能を発揮します。
このガイドでは、Debian 11でNFS機能に必要なソフトウェアをインストールする方法、サーバーとクライアントで2つのNFSマウントを設定する方法、およびリモート共有をマウントおよびアンマウントする方法について説明します。
前提条件
このチュートリアルでは、2つのサーバーを使用し、片方のサーバーがその一部のファイルシステムをもう一方と共有します。このチュートリアルに従うためには、次のものが必要です。
- Two Debian 11 servers. Each of these should have a non-root user with sudo privileges, a firewall set up with UFW, and private networking, if it’s available to you.For assistance setting up a non-root user with sudo privileges and a firewall, follow our Initial Server Setup with Debian 11 guide.
If you’re using Silicon Cloud vServers for your server and client, you can read more about setting up a private network in our documentation on How to Create a VPC.
このチュートリアルでは、ディレクトリを共有するサーバーを「ホスト」とし、これらのディレクトリをマウントするサーバーを「クライアント」と呼びます。両方のIPアドレスを知る必要があります。使用可能な場合は、プライベートネットワークアドレスを使用してください。
このチュートリアルでは、これらのIPアドレスはホストIPとクライアントIPというプレースホルダーで参照されます。必要に応じて置き換えてください。
ステップ1- コンポーネントのダウンロードとインストール
各サーバーに必要なコンポーネントをインストールして始めます。
ホストについて
ホストサーバーにnfs-kernel-serverパッケージをインストールし、ディレクトリを共有できるようにします。このセッションで行う最初の操作なので、インストールする前にローカルパッケージインデックスを更新してください。
- sudo apt update
- sudo apt install nfs-kernel-server
これらのパッケージがインストールされたら、クライアントサーバーに切り替えてください。
クライアントについてのネイティブな日本語での言い換え:
クライアントに関して
クライアントサーバーでは、サーバーコンポーネントを含まずにNFS機能を提供するnfs-commonと呼ばれるパッケージをインストールする必要があります。インストール前にローカルパッケージインデックスを更新し、最新の情報があることを確認してください。
- sudo apt update
- sudo apt install nfs-common
今、両方のサーバーに必要なパッケージがそろいましたので、それらを設定することができます。
ステップ2−ホスト上で共有ディレクトリを作成します。
2つの別々のディレクトリを異なる設定で共有することにより、NFSマウントにおけるスーパーユーザーアクセスの設定方法の2つの主要な方法を説明します。
スーパーユーザーは自分のシステム上ですべての操作を行うことができます。ただし、NFSでマウントされたディレクトリは、マウントされたシステムの一部ではないため、NFSサーバーはデフォルトでスーパーユーザー権限を必要とする操作を拒否します。このデフォルトの制限により、クライアント上のスーパーユーザーはルートとしてファイルを書き込んだり、所有権を再設定したり、NFSマウント上で他のスーパーユーザータスクを実行することができません。
時には、クライアントシステム上の信頼できるユーザーが、マウントされたファイルシステムでこれらの操作を行う必要がありますが、ホストへのスーパーユーザーアクセスは必要ありません。 これを許可するためにNFSサーバーを設定することができますが、これにはリスク要素があります。なぜなら、そのようなユーザーがホストシステム全体へのルートアクセスを取得する可能性があるからです。
例1:一般的な用途のマウントの輸出
最初の例では、デフォルトのNFSの挙動を使って汎用のNFSマウントを作成し、クライアントマシン上でroot権限を持つユーザーがそのクライアントのスーパーユーザー権限を使用してホストと対話することを難しくします。このようなマウントを使用すると、コンテンツ管理システムを使用してアップロードされたファイルを保存したり、ユーザー間でプロジェクトファイルを簡単に共有するスペースを作成したりすることができます。
最初に、ホストサーバー上で共有ディレクトリを作成してください。
- sudo mkdir /var/nfs/general -p
mkdirの-pオプションは、ディレクトリを作成し、必要な場合は親ディレクトリもすべて作成します。
「sudoで作成しているので、ディレクトリはホストのrootユーザーが所有しています。」
- ls -dl /var/nfs/general
drwxr-xr-x 2 root root 4096 Apr 17 23:51 /var/nfs/general
NFSは、セキュリティ対策として、クライアント上のすべてのルート操作をnobody:nogroupの認証情報に変換します。そのため、ディレクトリの所有権をそれに合わせる必要があります。
- sudo chown nobody:nogroup /var/nfs/general
drwxr-xr-x 2 nobody nogroup 4096 Apr 17 23:51 /var/nfs/general
このディレクトリをエクスポートする準備ができました。
例2: ホームディレクトリのエクスポート
第2の例では、ユーザーのホームディレクトリをホスト上に保存し、同時にクライアントサーバー上の信頼できる管理者が必要なアクセスを簡単に行えるようにすることが目標です。
これを行うために、/homeディレクトリをエクスポートします。既に存在しているので、作成する必要はありません。また、アクセス権限も変更しません。もし変更した場合、ホストマシンのホームディレクトリを持つ他のユーザーにさまざまな問題が生じる可能性があります。
ステップ3 – ホストサーバー上でNFSエクスポートを設定する
次に、これらのリソースの共有を設定するために、NFSの設定ファイルを調べます。
ホストマシンで、テキストエディタをルート権限で使用して、/etc/exportsファイルを開いてください。
- sudo nano /etc/exports
ファイルには、各構成行の一般的な構造を示すコメントがあります。構文は以下のようになります。
directory_to_share client(share_option1,...,share_optionN)
各ディレクトリのためにラインを作成する必要があります。ここに表示されているclient_ipプレースホルダを、実際のクライアントのパブリックIPアドレスに変更してください。
/etc/exportsを日本語で言い換えると、次のようになります:
– エーティーシーエクスポーツ
– /エーティーシーエクスポーツ
– チーム /エーティーシーエクスポーツ
– エクスポート/エーティーシーエクスポーツ.
/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: This option gives the client computer both read and write access to the volume.
- sync: This option forces NFS to write changes to disk before replying. This results in a more stable and consistent environment since the reply reflects the actual state of the remote volume. However, it also reduces the speed of file operations.
- no_subtree_check: This option prevents subtree checking, which is a process where the host must check whether the file is actually still available in the exported tree for every request. This can cause many problems when a file is renamed while the client has it opened. In almost all cases, it is better to disable subtree checking.
- no_root_squash: By default, NFS translates requests from a root user remotely into a non-privileged user on the server. This was intended as security feature to prevent a root account on the client from using the file system of the host as root. no_root_squash disables this behavior for certain shares.
変更が完了したら、ファイルを保存して閉じてください。その後、設定したクライアントに共有を利用可能にするために、次のコマンドで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 client_ip to any port nfs
「変更を確認するために、入力してください。」
- sudo ufw status
出力には、ポート2049からのトラフィックが許可されていることを確認してください。
Status: active To Action From — —— —- OpenSSH ALLOW Anywhere 2049 ALLOW client_ip OpenSSH (v6) ALLOW Anywhere (v6)
これによって、UFWがクライアントマシンからのポート2049のNFSトラフィックのみを許可することが確認されます。
ステップ5 — クライアント上でマウントポイントとマウントディレクトリの作成
ホストサーバーが設定され、共有フォルダを提供しているので、クライアントを準備します。
クライアントでリモート共有を利用可能にするためには、クライアント上の空のディレクトリにホスト上の共有したいディレクトリをマウントする必要があります。
Note
クライアントマシンには、マウント用の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
これらのコマンドは、ホストコンピュータから共有をクライアントマシンにマウントします。マウントが正常に行われたかを複数の方法で確認することができます。マウントコマンドやfindmntコマンドで確認することもできますが、利用可能なディスク容量を表示するdf -hコマンドは、より読みやすい出力を提供します。
- df -h
Filesystem Size Used Avail Use% Mounted on tmpfs 198M 972K 197M 1% /run /dev/vda1 50G 3.5G 47G 7% / tmpfs 989M 0 989M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock /dev/vda15 105M 5.3M 100M 5% /boot/efi tmpfs 198M 4.0K 198M 1% /run/user/1000 10.124.0.3:/var/nfs/general 25G 5.9G 19G 24% /nfs/general 10.124.0.3:/home 25G 5.9G 19G 24% /nfs/home
2つのマウントしたシェアが下部に表示されます。同じファイルシステムからマウントされたため、同じディスク使用量が表示されます。各マウントポイントごとに実際に使用されているスペースを確認するには、ディスク使用量コマンドduとマウントのパスを使用します。-sフラグは、すべてのファイルの使用量を表示する代わりに使用量の概要を提供します。-hは人が読める出力を印刷します。
例えば:
- du -sh /nfs/home
36K /nfs/home
このことから、ホームディレクトリ全体の内容が利用可能なスペースの36Kしか使用していないことがわかります。
6 ステップ – NFS アクセスのテスト
次に、各共有フォルダへのアクセスをテストするために、それぞれに何かしらの書き込みを行ってください。
例1:一般利用株
最初に、/var/nfs/generalの共有にテストファイルを作成してください。
- sudo touch /nfs/general/general.test
その後、所有権を確認してください。 (Sono ato, shoyūken o kakunin shite kudasai.)
- ls -l /nfs/general/general.test
-rw-r–r– 1 nobody nogroup 0 Apr 18 00:02 /nfs/general/general.test
NFSのデフォルト動作を変更せずにこのボリュームをマウントし、sudoコマンドを使用してクライアントマシンのルートユーザーとしてファイルを作成したため、ファイルの所有権はnobody:nogroupにデフォルトで設定されます。クライアントのスーパーユーザーは、このNFSマウントされた共有でファイルの所有者を変更したり、ユーザーグループのための新しいディレクトリを作成するなどの通常の管理操作を行うことができません。
例2:ホームディレクトリの共有
「一般目的シェア」と「ホームディレクトリシェア」のパーミッションを比較するために、/nfs/homeにファイルを同様に作成してください。」
- sudo touch /nfs/home/home.test
その後、ファイルの所有権を確認してください。
- ls -l /nfs/home/home.test
-rw-r–r– 1 root root 0 Apr 18 00:03 /nfs/home/home.test
sudoコマンドを使用して、一般と同じ方法でhome.testをrootとして作成しました。ただし、この場合はデフォルトの動作を上書きして、no_root_squashオプションを指定したため、rootが所有しています。これにより、クライアントマシン上のrootユーザーはrootとして操作できるようになり、ユーザーアカウントの管理がより便利になります。同時に、これらのユーザーにホスト上でのrootアクセス権限を与える必要がなくなります。
ステップ7—ブート時にリモートNFSディレクトリのマウント
クライアントの/etc/fstabファイルにNFSリモート共有を追加することで、起動時に自動的にマウントできます。
テキストエディタでこのファイルをルート権限で開いてください。
- 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
このファイルを保存して閉じることを確認してください。そうすれば変更が反映されます。
Note
クライアントは起動時に自動的にリモートパーティションをマウントしますが、接続を確立し、共有が利用可能になるまで少し時間がかかる場合があります。
ステップ8 — NFSリモートシェアのアンマウント
もしあなたがもはやリモートディレクトリをシステムにマウントしたくない場合は、共有ディレクトリ構造から移動して、次のようにアンマウントすることができます。
- cd ~
- sudo umount /nfs/home
- sudo umount /nfs/general
以下に注意してください。コマンドは、期待通りの「unmount」ではなく、「umount」という名前です。
「これにより、リモート共有は削除され、ローカルストレージのみがアクセス可能となります。」
- df -h
Filesystem Size Used Avail Use% Mounted on tmpfs 198M 972K 197M 1% /run /dev/vda1 50G 3.5G 47G 7% / tmpfs 989M 0 989M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock /dev/vda15 105M 5.3M 100M 5% /boot/efi tmpfs 198M 4.0K 198M 1% /run/user/1000
次回の再起動時にもそれらが再マウントされるのを防ぎたい場合は、/etc/fstabを編集し、行を削除するか、行の先頭に#文字を置いてコメントアウトしてください。また、自動マウントを防止するためにautoオプションを削除することもできます。これにより手動でマウントすることは可能です。
結論
このチュートリアルでは、NFSホストを作成し、異なる2つのNFSマウントを作成してNFSクライアントと共有することによって、いくつかの主要なNFSの動作を説明しました。
NFSを本番環境で導入しようとしている場合、プロトコル自体は暗号化されていないことに留意することが重要です。プライベートネットワーク上で共有する場合は、これは問題ではありません。他の場合では、データ保護のためにVPNやその他の暗号化トンネルが必要になるでしょう。