Rocky Linux 8でNFSマウントを設定する方法
Rocky Linux 8を使用していませんか?別のバージョンまたはディストリビューションを選択してください。
紹介
NFS、すなわちネットワークファイルシステムは、リモートディレクトリをサーバーにマウントすることを可能にする分散ファイルシステムプロトコルです。これにより、異なる場所のストレージスペースを管理し、複数のクライアントからそのスペースに書き込むことができます。NFSは、ネットワークを介してリモートシステムにアクセスするための比較的一般的かつ高性能な方法を提供し、共有リソースに定期的にアクセスする必要がある状況でうまく機能します。
このガイドでは、Rocky Linux 8でNFS機能に必要なソフトウェアのインストール方法、サーバーとクライアントに2つのNFSマウントを設定し、リモート共有をマウントおよびアンマウントする方法について説明します。
前提条件
このチュートリアルでは、2つのサーバーを使用し、一方がもう一方とファイルシステムの一部を共有します。これに従うためには、以下が必要です:
2つのRocky Linux 8サーバー。それぞれは、root以外のユーザーに
sudo権限があり、UFWで設定されたファイアウォールと、利用可能であればプライベートネットワーキングを持っている必要があります。-
非rootユーザーを設定し、
sudo権限とファイアウォールを設定するためのサポートについては、Rocky Linux 8の初期サーバーセットアップガイドをご覧ください。
-
あなたがサーバーとクライアントにDigitalOcean Dropletsを使用している場合、VPCの作成方法に関するドキュメントでプライベートネットワークの設定についてさらに読むことができます。
このチュートリアル全体を通して、ディレクトリを共有するサーバーはホストと呼ばれ、これらのディレクトリをマウントするサーバーはクライアントと呼ばれます。両方のIPアドレスを知っておく必要があります。利用可能な場合は、プライベートネットワークアドレスを使用してください。
このチュートリアルを通じて、これらのIPアドレスはプレースホルダーhost_ipとclient_ipで言及されます。必要に応じて置き換えてください。
ステップ1 — コンポーネントのダウンロードとインストール
各サーバーに必要なコンポーネントをインストールすることから始めます。
ホストで
ホストサーバー上で、dnfパッケージマネージャを使用してnfs-utilsパッケージをインストールします。これにより、ディレクトリを共有できるようになります:
- sudo dnf install nfs-utils
これらのパッケージがインストールされたら、クライアントサーバーに切り替えます。
クライアント上で
クライアントサーバーに、同じnfs-utilsパッケージをインストールする必要があります。
- sudo dnf install nfs-utils
両方のサーバーに必要なパッケージが揃ったので、設定を開始できます。
ステップ2 — ホスト上に共有ディレクトリを作成する
あなたはスーパーユーザーアクセスに関してNFSマウントがどのように設定できるかを示すために、異なる設定を持つ2つの別々のディレクトリを共有するつもりです。
スーパーユーザーはシステム上のどこでも何でもできます。ただし、NFSマウントされたディレクトリは、それがマウントされたシステムの一部ではないため、デフォルトではNFSサーバーはスーパーユーザー特権を必要とする操作を実行することを拒否します。このデフォルトの制限により、クライアント上のスーパーユーザーはrootとしてファイルに書き込むことや所有権を再割り当てすること、あるいはNFSマウント上での他のスーパーユーザー作業を行うことができません。
しかし時には、マウントされたファイルシステムでこれらの操作を実行する必要がある信頼できるユーザーがクライアントシステムに存在しますが、ホストへのスーパーユーザーアクセスを必要としない場合があります。このような設定をNFSサーバーで許可することができますが、悪意のあるユーザーがホストシステム全体にルートアクセスを得るリスクがあることを考慮する必要があります。
例1:汎用マウントのエクスポート
最初の例では、デフォルトのNFSの動作を使用して、クライアントマシン上のroot権限を持つユーザーが、ホストとそのクライアントのスーパーユーザー権限を使用して対話することを困難にする汎用のNFSマウントを作成します。これを使用して、コンテンツ管理システムを介してアップロードされたファイルを保存したり、ユーザーがプロジェクトファイルを簡単に共有するためのスペースを作成したりすることができます。
まず、共有ディレクトリを作成します(必要に応じてファイルパス全体を作成するmkdirの-pオプションを使用します):
- sudo mkdir /var/nfs/general -p
あなたがsudoで作成しているので、そのディレクトリはホストのrootユーザーによって所有されています。
- ls -dl /var/nfs/general
drwxr-xr-x 2 root root 4096 Apr 17 23:51 /var/nfs/general
NFSは、セキュリティ対策として、クライアント上のすべてのルート操作をnobodyユーザーに翻訳します。したがって、ディレクトリの所有権をnobodyに変更する必要があります。
- sudo chown nobody /var/nfs/general
このディレクトリをエクスポートする準備が整いました。
例 2: ホームディレクトリのエクスポート
第二の例では、目標はホストに保存されているユーザーホームディレクトリをクライアントサーバーで利用可能にし、信頼された管理者がユーザーを便利に管理するために必要なアクセスを許可することです。
これを行うには、/home ディレクトリをエクスポートします。すでに存在しているので、作成する必要はありません。また、パーミッションも変更しません。もし変更した場合、ホスト マシン上のホームディレクトリを持つ人々にさまざまな問題を引き起こす可能性があります。
ステップ3 — ホストサーバーでのNFSエクスポートの構成
次に、NFS構成ファイルに飛び込んで、これらのリソースの共有を設定します。
Rocky Linux 9に付属するデフォルトのテキストエディタはviです。viは非常に強力なテキストエディタですが、使い慣れていないユーザーには少し難解かもしれません。Rocky Linux 8サーバーの設定ファイルを編集するために、よりユーザーフレンドリーなエディタであるnanoをインストールすることをお勧めします:
- sudo dnf install nano
ホスト マシンで、/etc/exports ファイルを nano またはお気に入りのテキストエディタで ルート 権限で開きます:
- sudo nano /etc/exports
Rocky Linux 8では、このファイルはデフォルトで空です。これを作成するために必要な構文は次の通りです:
directory_to_share client(share_option1,...,share_optionN)
共有する予定の各ディレクトリのために1行追加してください。ここに表示されているclient_ipのプレースホルダーを実際のIPアドレスに変更することを忘れないでください:
/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: このオプションは、クライアントコンピュータにボリュームへの読み取りおよび書き込みアクセスを提供します。sync: このオプションは、NFSが応答する前に変更をディスクに書き込むよう強制します。これにより、応答がリモートボリュームの実際の状態を反映するため、より安定した一貫性のある環境が得られます。ただし、ファイル操作の速度は低下します。no_subtree_check: このオプションはサブツリー検査を無効にします。サブツリー検査とは、ホスト がすべてのリクエストに対して、ファイルがエクスポートされたツリー内で実際にまだ利用可能かどうかを確認しなければならないプロセスです。ファイルが名前変更されているときにクライアントがそれを開いている場合、これにより多くの問題が発生する可能性があります。ほぼすべての場合、サブツリー検査を無効にする方が良いです。no_root_squash: デフォルトでは、NFSはリモートのrootユーザーからのリクエストをサーバー上の特権のないユーザーに変換します。これは、クライアント上のrootアカウントがホストのファイルシステムをrootとして使用するのを防ぐためのセキュリティ機能を意図していました。no_root_squashは、特定の共有に対してこの動作を無効にします。
変更が完了したら、ファイルを保存して閉じてください。nanoを使用している場合は、Ctrl+Xを押し、プロンプトが表示されたらYを押してEnterを押します。次に、設定したクライアントに共有を利用可能にするために、NFSサーバーを起動し、systemctlで自動的に実行できるようにします。
- sudo systemctl enable nfs-server
- sudo systemctl start nfs-server
systemctl statusを使用して、サービスが開始されていることを確認してください:
- sudo systemctl status nfs-server
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: >
Drop-In: /run/systemd/generator/nfs-server.service.d
└─order-with-mounts.conf
Active: active (exited) since Mon 2022-08-08 17:41:18 UTC; 4s ago
Process: 14348 ExecStart=/bin/sh -c if systemctl -q is-active gssproxy; then systemct>
Process: 14336 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
Process: 14335 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Main PID: 14348 (code=exited, status=0/SUCCESS)
Aug 08 17:41:18 rocky8-nfs-host systemd[1]: Starting NFS server and services...
Aug 08 17:41:18 rocky8-nfs-host systemd[1]: Started NFS server and services.
ただし、新しい共有を実際に使用する前に、ファイアウォールのルールによって共有へのトラフィックが許可されていることを確認する必要があります。
ステップ4 — ホストのファイアウォールの調整
Rocky Linux 8ガイドの初期サーバーセットアップで推奨されているように、firewalldファイアウォールを実行している場合は、firewall-cmdの出力のservices行で現在許可されているサービスを確認してください。
- firewall-cmd --permanent --list-all | grep services
services: cockpit dhcpv6-client ssh
あなたのシステムでは、コアシステムサービスのみが許可されているため、NFSトラフィックのためのルールを追加する必要があります。Rocky LinuxのNFSは3つの異なるサービスを利用しており、すべてのサービスがファイアウォールを通過できるようにする必要があります。これらのルールはfirewall-cmdを使用して追加できます。
- firewall-cmd --permanent --add-service=nfs
- firewall-cmd --permanent --add-service=mountd
- firewall-cmd --permanent --add-service=rpc-bind
- firewall-cmd --reload
追加されたことを確認できます:
- firewall-cmd --permanent --list-all | grep services
services: cockpit dhcpv6-client mountd nfs rpc-bind ssh
注意してください、これはこれらのサービスのためにファイアウォールを全世界に対して開放することになります、単一のクライアントのみに対してではありません。これは問題ではないはずです、なぜならあなたはすでにNFSマウントを単一のIPアドレスのみにアクセス可能に設定しているからです。もしあなたがファイアウォールの設定にさらなるセキュリティを追加する必要がある場合は、firewalldのゾーンを実装することができます。
ステップ5 — クライアント上でのマウントポイントとマウントディレクトリの作成
サーバーが構成され、その共有を提供しているので、クライアントの準備をします。
リモート共有をクライアントで利用可能にするためには、共有したいディレクトリをホスト上の空のディレクトリにマウントする必要があります。
注: マウントポイントにファイルやディレクトリがある場合、NFSシェアをマウントするとすぐにそれらは隠れます。重要なファイルの損失を避けるために、既存のディレクトリにマウントする場合は、そのディレクトリが空であることを確認してください。
マウント用に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
これらのコマンドは、ホストコンピュータからクライアントマシンに共有をマウントします。マウントが成功したかどうかを確認する方法はいくつかあります。mountコマンドやfindmntコマンドを使用して確認できますが、df -hはより読みやすい出力を提供します:
- df -h
Filesystem Size Used Avail Use% Mounted on
Filesystem Size Used Avail Use% Mounted on
devtmpfs 370M 0 370M 0% /dev
tmpfs 405M 0 405M 0% /dev/shm
tmpfs 405M 11M 394M 3% /run
tmpfs 405M 0 405M 0% /sys/fs/cgroup
/dev/vda1 25G 1.5G 24G 6% /
tmpfs 81M 0 81M 0% /run/user/0
host_ip:/var/nfs/general 25G 1.6G 24G 7% /nfs/general
host_ip:/home 25G 1.6G 24G 7% /nfs/home
あなたがマウントした両方の共有は、下部に表示されます。どちらも同じファイルシステムからマウントされたため、同じディスク使用量を示しています。
ステップ 6 — NFS アクセスのテスト
次に、それぞれの共有フォルダーに何かを書き込んでアクセスをテストします。
例1: 一般目的の株
まず、/var/nfs/general共有にテストファイルを書き込んでください:
- sudo touch /nfs/general/general.test
それから、それの所有権を確認してください。
- ls -l /nfs/general/general.test
-rw-r--r--. 1 nobody nobody 0 Aug 8 18:24 /nfs/general/general.test
このボリュームをNFSのデフォルトの動作を変更せずにマウントし、クライアントマシンのルートユーザーとしてsudoコマンドを介してファイルを作成したため、ファイルの所有権はnobodyにデフォルトで設定されます。クライアントのスーパーユーザーは、ファイルの所有者を変更したり、ユーザーグループのために新しいディレクトリを作成したりするなど、通常の管理操作をNFSマウント共有で実行することができません。
例2: ホームディレクトリ共有
一般的な用途の共有の権限をホームディレクトリの共有と比較するには、/nfs/homeに同じようにファイルを作成します:
- sudo touch /nfs/home/home.test
次に、ファイルの所有権を見てください。
- ls -l /nfs/home/home.test
-rw-r--r--. 1 root root 0 Aug 8 18:26 /nfs/home/home.test
home.testをrootとして作成したのは、sudoコマンドを使用したからで、general.testファイルを作成したのと全く同じ方法です。しかし、この場合は、rootに所有されているのは、マウント時にオプションを指定したため、デフォルトの動作をオーバーライドしたからです。これにより、clientマシン上のrootユーザーがrootとして動作できるようになり、ユーザーアカウントの管理がはるかに便利になります。同時に、これにより、これらのユーザーにhost上でのrootアクセスを与える必要がなくなります。
ステップ7 — ブート時にリモートNFSディレクトリをマウントする
クライアントのclient上の/etc/fstabファイルにリモートNFS共有を追加することで、起動時に自動的にマウントできます。
テキストエディタでルート権限を使って/etc/fstabを開いてください:
- sudo nano /etc/fstab
ファイルの最下部に、あなたの共有分ごとに1行を追加してください。それらはこのように見えます。
. . .
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
注意:ここで指定しているオプションについての詳細情報は、NFSマニュアルにあります。
クライアントはブート時にリモートパーティションを自動的にマウントしますが、接続を確立し、共有が利用可能になるまでに数秒かかる場合があります。
ステップ8 — NFSリモート共有のアンマウント
リモートディレクトリをシステムにマウントしたくない場合は、共有のディレクトリ構造から出て、アンマウントすることでアンマウントできます。次のようにします:
- cd ~
- sudo umount /nfs/home
- sudo umount /nfs/general
注意してください、コマンドはあなたが予想するかもしれないように unmount ではなく umount と呼ばれています。
これはリモート共有を削除し、ローカルストレージのみがアクセス可能になります:
- df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 370M 0 370M 0% /dev
tmpfs 405M 0 405M 0% /dev/shm
tmpfs 405M 11M 394M 3% /run
tmpfs 405M 0 405M 0% /sys/fs/cgroup
/dev/vda1 25G 1.5G 24G 6% /
tmpfs 81M 0 81M 0% /run/user/0
次回の再起動時に再マウントされないようにするには、/etc/fstabを編集し、その行を削除するか、行の先頭に#文字を置いてコメントアウトします。また、autoオプションを削除することで自動マウントを防ぐこともでき、その場合でも手動でマウントすることができます。
結論
このチュートリアルでは、NFSホストを作成し、NFSクライアントと共有した2つの異なるNFSマウントを作成することで、いくつかの重要なNFS動作を説明しました。
もし本番環境でNFSを実装しようとしているのであれば、プロトコル自体が暗号化されていないことを理解しておくことが重要です。プライベートネットワーク上で共有する場合は、問題にならないこともありますが、他のケースではデータを保護するためにVPNまたは他の種類の暗号化トンネルが必要になるでしょう。
