0.はじめに
次回の案件でRockyLinuxを使用することから備忘録として残します。
今回はRockyLinuxでの NFSサーバ の構築を行っていきます。
実行結果まで含めて、できるだけ丁寧に実践していこうと思います。
1. NFSとは?sambaとの違いは?
NFS(Network File System)のこと。
ファイルを共有することが目的のサービス。
NFS、sambaの違いは?
おそらく知名度でいえば圧倒的sambaだと思いますが、sambaとの違いは何でしょうか。
NFSもsambaもどちらもファイル共有プロトコル、違いは下記になります。
NFS
Linux/UNIX世界の標準的なファイル共有プロトコルであり、
「マウントしてローカルディスクみたいに使う」感覚。
・UID/GIDベースで権限制御
・軽量で高速
・主にサーバ間共有用途
・/etc/fstabでマウント運用が基本
samba
WindowsのSMB/CIFSプロトコルをLinuxで使えるようにする仕組み。
・Windowsのユーザー認証と連携
・Active Directory統合可能
・Windowsのエクスプローラーで普通に見える
・GUIユーザー向け
2. 環境
・Proxmox VE 9.1 上で構築
・RockyLinux v8.10(サーバ側 192.168.0.91/24 )
・RockyLinux v8.10(クライアント側 192.168.0.90/24 )
別の記事でNTP、syslogサーバについても記述していますので今回使用しない VM も記載されています。
3. サーバ側の構築
★全体の流れ
① サーバにnfs-utilsをインストール
② 共有ディレクトリを作成
③ /etc/exports に公開設定を書く
④ export設定反映
⑤ nfs-server起動&自動起動設定
⑥ ファイアウォール開放(nfs)
3-1. nfs-utilsをインストール
まずは、既にインストールされているか確認します。
# rpm -qa | grep nfs
sssd-nfs-idmap-2.9.4-5.el8_10.4.x86_64
libnfsidmap-2.3.3-64.el8_10.x86_64
nfs-utils-2.3.3-64.el8_10.x86_64
※ほかのディストリビューションなどを使用していて、NFSがインストールされていない場合は下記コマンドでインストールします。
# dnf install nfs-utils
RockyLinux8.10ではデフォルトでNFSがインストールされているようです。
では、起動しているか調べてみます。
# systemctl status nfs-server.service
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
Active: inactive (dead)
起動はされておらず、自動起動もDisabledのようです。
今回はNFSのインストールは不要となりましたので、このまま次の項目に進もうと思います。
3-2. 共有ディレクトリを作成
既存のディレクトリを使用するのであれば新規での作成は不要ですが、今回はわかりやすくするために下記のようなディレクトリを作成します。
/data/nfs
また、クライアント側から共有できたか確認のために適当なファイルを作成します。
# mkdir -p /data/nfs
# ls -ld /data/nfs
drwxr-xr-x 2 root root 6 Mar 4 20:21 /data/nfs
# echo server_de_sakusei_ > /data/nfs/hello.txt
# ls -l /data/nfs
total 4
-rw-r--r-- 1 root root 19 Mar 4 20:38 hello.txt
3-3. /etc/exports に公開設定を書く
NFSのキモといえる /etc/exports の設定になります。
まず、/etc/exports って何?って話ですが、
→どのディレクトリを、どこから、どんな権限で公開するか。を書くファイル。
設定ファイルの退避
まずは、デフォルトの設定ファイルの退避です。
# cp /etc/exports /etc/exports.org
# ls -l /etc/ | grep exports.org
-rw-r--r-- 1 root root 0 Mar 4 20:51 exports.org
設定の書き込み
退避ができたら次は設定の書き込みになります。
/etc/exports は通常何も書かれていませんので、1行目に追記いただいて問題ありません。
# vi /etc/exports
/data/nfs 192.168.0.0/24(rw,sync,no_root_squash)
■ この1行の意味
/data/nfs
→ 公開するディレクトリ
192.168.0.0/24
→ アクセスを許可するネットワーク
(rw,sync,no_root_squash)
→ オプション指定
rw
→ 読み書き可能(read/write)
sync
→ 書き込みを即ディスク反映(安全重視)
no_root_squash
→ クライアントのrootをそのままroot扱い
※検証では便利だが、セキュリティ上のリスクがあるため本番では慎重に
3-4. exportsの設定反映
設定の記述が完了したらいよいよ反映になります。
exportfs -ra
exportfs -v
/data/nfs 192.168.0.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,no_root_squash,no_all_squash)
NFSに詳しくない自分はここで少し戸惑いました。
設定値に入れていないはずの値も確認コマンドで出力されてしまった!
少し調べてみたところ、デフォルト値が自動的に補完されて表示されているだけのようです。
・wdelay
→ 書き込みを少し遅らせてまとめて処理する最適化。
・hide
→ サブディレクトリを別exportとして見せない(v3系の挙動制御)。
・no_subtree_check
→ サブディレクトリ整合性チェックをしない(性能優先)。
・sec=sys
→ UNIX標準のUID/GIDベース認証を使う。
・no_all_squash
→ 一般ユーザーは匿名化せず、そのままのUIDで扱う。
は、「書かなくても有効なデフォルト設定」なため安心しました。
3-5. nfs-serverの起動&自動起動設定
NFSのサービスを起動します。
# systemctl start nfs-server.service
# systemctl status nfs-server.service
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
Active: active (exited) since Wed 2026-03-04 21:41:13 EST; 8s ago
Process: 25606 ExecStart=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload gssproxy ;>
Process: 25592 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
Process: 25591 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Main PID: 25606 (code=exited, status=0/SUCCESS)
Mar 04 21:41:13 nfs systemd[1]: Starting NFS server and services...
Mar 04 21:41:13 nfs systemd[1]: Started NFS server and services.
lines 1-10/10 (END)
NFSが起動しました!
続いてOS起動時の自動起動設定を行います。
# systemctl enable nfs-server.service
# systemctl status nfs-server.service
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
Drop-In: /run/systemd/generator/nfs-server.service.d
mqorder-with-mounts.conf
Active: active (exited) since Wed 2026-03-04 21:41:13 EST; 4min 47s ago
Main PID: 25606 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 4566)
Memory: 0B
CGroup: /system.slice/nfs-server.service
Mar 04 21:41:13 nfs systemd[1]: Starting NFS server and services...
Mar 04 21:41:13 nfs systemd[1]: Started NFS server and services.
3-6. ファイアウォール開放(nfs)
サービスが起動したらファイアウォールに穴あけを行い、クライアントや他のサーバからアクセスできるようにします。
まずは、現在のファイアウォールの確認を行います。
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens18
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
NFS、の穴あけがまだなのがわかりましたので開けます。
# firewall-cmd --add-service=nfs --permanent
# firewall-cmd --reload
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens18
sources:
services: cockpit dhcpv6-client nfs ssh #ここにnfsが追加されました!
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
これにて、サーバ側の設定はいったん終了です!
4. クライアント側の構築
★全体の流れ
① クライアントにnfs-utilsをインストール
② マウントポイント(接続先ディレクトリ)作成
③ NFSサーバの公開確認(任意だけどよくやる)
④ NFSマウント&確認
⑤ 動作確認
⑥ /etc/fstab に設定
4-1. クライアントにnfs-utilsをインストール
サーバ側と同様、既にインストールされているか確認します。
# rpm -qa | grep nfs
sssd-nfs-idmap-2.9.4-5.el8_10.4.x86_64
libnfsidmap-2.3.3-64.el8_10.x86_64
nfs-utils-2.3.3-64.el8_10.x86_64
同じRockyLinuxのためインストールされていました。
※インストールされていない場合はサーバ側で解説しましたインストール方法で実行していただいて問題ありません。
NFSを利用する側(クライアント)では、サービスを起動する必要はありません。
では、なぜインストールしたのか? って話になると思います。私も思いました。
NFS機能はカーネルにあるけど、それを操作するツールが無いから nfs-utils が必要ってことのようです。
今まではとりあえず手順にあるからインストールして…って感じでしたが、一つ知識が増えました。
上記の話関連なのでここで話してしまいますが、サービスの起動の必要もないため /etc/exports への設定記述もクライアント側はありません。
理由はシンプルで、/etc/exports は
「このサーバがどのディレクトリを共有するか」 を書くファイルだからですね。
4-2. マウントポイント(接続先ディレクトリ)作成
マウントポイントを作成します。
任意の場所でもよいですが、特にこだわりやルールがなければ/mnt配下に作成するのがよいでしょう。
# mkdir -p /mnt/nfs
4-3. NFSサーバの公開確認(NFSのv3.xでは必要。v4.xでは不要です。)
注意
同じRockyLinux8を使用している場合は「3. NFSサーバの公開確認」作業は不要となります。
NFSのバージョンが v3.x の方のみ必要となります。ご確認ください。
NFSサーバの公開確認を行います。
サーバ側でNFSが正常に公開されているかクライアント側から確認する作業ですね。
これを無視してマウントしてしまってもファイルが共有されないので…
確認するにあたってv3.xでは追加でファイアウォールの穴あけが必要になりますので、サーバ側で下記コマンドを実行くださいませ。
# firewall-cmd --add-service=mountd --permanent
# firewall-cmd --add-service=rpc-bind --permanent
# firewall-cmd --reload
NFSのv3.xでは、RPC通信が行われます。
rpc-bind
RPCサービス(NFS・mountdなど)がどのポートで動いているかを管理するサービス。
クライアントはまずrpcbindに問い合わせて、目的サービスのポート番号を取得する。
mountd
NFSクライアントからの「共有ディレクトリをマウントしたい」という要求を処理するサービス。
/etc/exports の設定を参照し、アクセス許可を確認してマウント情報を返す。
↓クライアントからNFSサーバへ公開しているか確認する。
# showmount -e 192.168.0.91
Export list for 192.168.0.91:
/data/nfs 192.168.0.0/24
無事!showmountコマンドでディレクトリが共有されていることが確認できました!!
↓ここで少し行き詰ってました…w
v3.xかつ、ミスの内容はRPC通信の存在に気が付かず、ファイアウォールの穴あけ忘れになります。
私がミスって行き詰ったところ(クリックで開きます)
v3.xか、ファイアウォールの穴あけが不十分だった場合のミスになります。
# showmount -e 192.168.0.91
clnt_create: RPC: Unable to receive
あらっ…
エラーの意味は、「RPC通信でサーバから応答を受信できなかったよ~」です。
クライアントが showmount → RPC → NFSサーバ
と問い合わせたが、サーバから返答が返ってこなかった状態。
RPC通信とはなんぞや?? でした。
↓RPC通信についてQiitaで解説してくださってる方がいました。神です。
そもそも RPC ってなんだ
RPC通信(Remote Procedure Call)
→ リモートホストの関数やサービスをネットワーク越しに呼び出す仕組み。
注意
この設定は前作業で入力済みですので、
作業不要です!
少し調べてみると、やはりサーバ側RPC, mountd のファイアウォールの穴あけが不十分だったようで、
下記のコマンドをサーバ側で実行しましたら解決しました!
・firewall-cmd --add-service=rpc-bind --permanent
・firewall-cmd --add-service=mountd --permanent
・firewall-cmd --reload
① クライアント → rpc-bind(111)
「mountd のポート番号どこ?」
② クライアント → mountd(動的ポート)
「/data/nfs マウントしていい?」
③ mountd が /etc/exports を確認
「このIPは許可されてる?」
④ OKなら NFSサービス(nfsd) に接続してマウント成立
このような流れがあったからこそ、rpc-bindとmountdの穴あけが必要だったようです。
~~~ 後日分かったこと ~~~
nfsのバージョンによる問題でした。
nfsのバージョンには 3.x 4.x などがあり、3.xではrpc-bind, mountdの穴あけが必要だったようです。
バージョン4.xではrpc-bind, mountd穴あけの必要なく通信できる模様。
今回はバージョン4.2でした。TCP 2049だけで通信できるようです。
じゃあ、今回の環境は4.xだったのに、なぜ showmount が失敗したのか?
答えは showmountコマンド がRPC通信を行っていたためでした。
エラーの内容にも「RPC通信ができないよ~」とありました。
そこで勘違いしてrpc-bindを開けない!調べたらmountdも開けるらしい!!
なんて感じで連鎖的に過ちを積み重ねていました... orz
4-4. NFSマウント&確認
「2. マウントポイント(接続先ディレクトリ)作成」で作成したマウントポイント(ディレクトリ)をサーバ側のディレクトリにマウントします。
# mount -t nfs 192.168.0.91:/data/nfs /mnt/nfs
# df -h
Filesystem Size Used Avail Use% Mounted on
~(中略)~
192.168.0.91:/data/nfs 29G 6.6G 23G 23% /mnt/nfs
dfコマンドで認識されているのが確認できました!
恒久的にマウントする場合は /etc/fstab に記述が必要になります。
/etc/fstabへの記述方法は最後にご紹介いたします。
4-5. 動作確認
まずは、サーバ構築時に作成した「hello.txt」がクライアント側から見えるかどうか。
ls -l /mnt/nfs
-rw-r--r-- 1 root root 19 Mar 5 10:38 hello.txt
見えました!サーバ→クライアントに向けたファイルは確認できましたね!
次は、適当なファイルをクライアント側で作成してみて、サーバ側で確認できるか。
touch /mnt/nfs/test.txt
# ls -l /data/nfs
total 4
-rw-r--r-- 1 root root 19 Mar 4 20:38 hello.txt
-rw-r--r-- 1 root root 0 Mar 5 01:33 test.txt
無事、クライアント→サーバへのファイルも確認できました!!
4-6. /etc/fstab に設定
最後に、恒久的にマウントするために /etc/fstab への記述方法を紹介します。
こちらはよく紹介されている内容と被りますので読み飛ばしていただいても問題ありません。
vim /etc/fstab
~1番下の行に追記~
192.168.0.91:/data/nfs /mnt/nfs nfs defaults 0 0
mount -a
mount -a でエラーが出なければ問題ないので作業終了となります!
5.さいごに
なんだかんだバージョンの違いによる部分で時間がかかってしまいました。
各コマンドで使用される通信内容や、関連するサービスの影響などやはりわからないことが多かったと感じました。
それにNFSの構築だけなのに非常に長くなってしまいました。
時間をかけて身をもって理解したことがあったので、業務に活かしていこうと思います!
また、どこかの一部分だけでも、皆様のお役に立てたらうれしいです。
