Rocky Linux 8でNFSマウントを設定する方法
はじめに
NFS、またはネットワーク ファイル システムは、リモートディレクトリをサーバーにマウントすることができる分散ファイルシステムプロトコルです。これにより、別の場所にあるストレージスペースを管理し、複数のクライアントからそのスペースへ書き込むことができます。NFSは、ネットワークを介してリモートシステムにアクセスするための比較的標準的かつ高性能な方法を提供し、共有リソースが定期的にアクセスされる必要がある状況ではうまく機能します。
このガイドでは、Rocky Linux 8でNFS機能に必要なソフトウェアをインストールする方法、サーバーとクライアントで2つのNFSマウントを設定する方法、そしてリモート共有をマウントおよびアンマウントする方法について説明します。
前提条件
このチュートリアルでは、2つのサーバーを使用し、片方のサーバーがもう一方とファイルシステムを共有します。一緒に進めるためには、以下が必要です。
- Two Rocky Linux 8 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 Rocky Linux 8 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アドレスはhost_ipとclient_ipというプレースホルダーで参照されます。必要に応じて置き換えてください。
ステップ1- コンポーネントのダウンロードとインストール
各サーバーに必要なコンポーネントをインストールすることから始めます。
ホスト上で
ホストサーバー上で、dnfパッケージマネージャーを使用してnfs-utilsパッケージをインストールし、ディレクトリを共有できるようにします。
- sudo dnf install nfs-utils
これらのパッケージがインストールされたら、クライアントサーバーに切り替えてください。
クライアントについて
クライアントサーバー上では、同じnfs-utilsパッケージをインストールする必要があります。
- sudo dnf install nfs-utils
今、両方のサーバーに必要なパッケージが揃ったので、設定を開始することができます。
ステップ2 — ホスト上に共有ディレクトリを作成する
2つの異なる設定を持つ別々のディレクトリを共有することで、NFSマウントのスーパーユーザーアクセスに関する2つの主な設定方法を説明します。
スーパーユーザーは、自分のシステム上でどんなことでもどこでも行うことができます。しかし、NFSでマウントされたディレクトリは、マウントされたシステムの一部ではないため、NFSサーバーはデフォルトでスーパーユーザー権限が必要な操作を拒否します。このデフォルトの制限により、クライアント上のスーパーユーザーはルートとしてファイルを書き込んだり、所有権を再割り当てしたり、NFSマウント上で他のスーパーユーザータスクを実行することができません。
しかし、時にはクライアントシステム上の信頼できるユーザーが、ホスト上でのスーパーユーザーアクセスは不要ですが、マウントされたファイルシステム上でこれらのアクションを実行する必要がある場合があります。これを許可するためにNFSサーバーを設定することができますが、悪意のあるユーザーがホストシステム全体のルートアクセスを取得する可能性があるというリスク要素を導入します。
例1:汎用マウントの輸出
最初の例では、デフォルトのNFS動作を使用して汎用の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:ホームディレクトリのエクスポート
第2の例では、ユーザーのホームディレクトリをホスト上に保存し、クライアントサーバー上でそれらのユーザーのトラストできる管理者が必要なアクセスを便利に管理できるようにすることを目的としています。
これをするために、/homeディレクトリをエクスポートします。すでに存在するため、作成する必要はありません。権限も変更しません。変更すると、ホストマシンのホームディレクトリを持つユーザーに多くの問題を引き起こす可能性があります。
ステップ3-ホストサーバーでのNFSエクスポートの設定
次に、これらのリソースの共有を設定するために、NFSの設定ファイルに入ります。
Rocky Linux 9には、デフォルトのテキストエディタとしてviが付属しています。viは非常にパワフルなテキストエディタですが、経験がないユーザーにとってはややわかりにくいかもしれません。Rocky Linux 8サーバー上で構成ファイルの編集を容易にするため、nanoなどのより使いやすいエディタをインストールすることをお勧めします。
- sudo dnf install nano
ホストマシンで、nanoまたはお気に入りのテキストエディタをルート権限で使用して、/etc/exports ファイルを開いてください。
- sudo nano /etc/exports
Rocky Linux 8では、このファイルはデフォルトで空になります。作成するために必要な文法は以下のとおりです。
directory_to_share client(share_option1,...,share_optionN)
各ディレクトリごとにラインを追加してください。ここに示されているclient_ipのプレースホルダを、実際のIPアドレスに変更してください。
– エティーシーエクスポート
– エティーシーディレクトリの公開設定
– 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.
変更作業が完了したら、ファイルを保存して閉じてください。もしも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ガイドのInitial Server Setupで推奨されるように、ファイアウォールとして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
追加されたことを確認することができます。 (Tsuiyashita koto o kakunin suru koto ga dekimasu.)
- firewall-cmd –permanent –list-all | grep services
services: cockpit dhcpv6-client mountd nfs rpc-bind ssh
以下の点に留意してください。これにより、これらのサービスに対するファイアウォールがグローバルに開かれることになります。単一のクライアントにのみアクセスを制限するのではなく、これは問題ありません。すでにNFSマウントを単一のIPアドレスにのみアクセス可能なように設定しているためです。もし直接ファイアウォールの構成にさらなるセキュリティを追加する必要がある場合は、firewalldゾーンを実装できます。
ステップ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 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
次に、ファイルの所有権を確認してください。 (Tsugi ni, fairu no shoyūken o kakunin shite kudasai.)
- ls -l /nfs/home/home.test
-rw-r–r–. 1 root root 0 Aug 8 18:26 /nfs/home/home.test
sudoコマンドを使用して、general.testファイルと同様にrootとしてhome.testを作成しました。ただし、この場合、no_root_squashオプションを指定したため、rootユーザーが所有することになります。これにより、クライアントマシン上のrootユーザーがrootとしてアクションを起こすことができ、ユーザーアカウントの管理がより便利になります。同時に、これらのユーザーにホストへのrootアクセス権限を与える必要はありません。
ステップ7- ブート時にリモートNFSディレクトリをマウントする
クライアントの/etc/fstabファイルにNFS共有を追加することで、リモートのNFS共有を自動的に起動時にマウントすることができます。
ルート特権でテキストエディタで/etc/fstabを開きます。
- sudo nano /etc/fstab
ファイルの一番下に、各種株式ごとに1行追加してください。以下のような形式で表示されます。
「/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
コマンドの名前は予想とは異なり、「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ホストを作成し、2つの異なるNFSマウントを作成して重要なNFSの動作を説明し、それらをNFSクライアントと共有しました。
もしもプロダクション環境でNFSを導入する場合は、プロトコル自体が暗号化されていないことに注意する必要があります。プライベートネットワーク上で共有する場合は問題ありませんが、他の場合ではデータを保護するためにVPNや他の暗号化されたトンネルが必要になる場合があります。