0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

NFSサーバ構築(RockyLinux)

0
Last updated at Posted at 2026-03-05

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 )

https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_3125253_66e5ca3d-2ccb-4b46-b9cb-ef1346242bb2.avif

別の記事で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
/etc/fstab
~1番下の行に追記~
192.168.0.91:/data/nfs /mnt/nfs nfs defaults 0 0
コマンド
mount -a

mount -a でエラーが出なければ問題ないので作業終了となります!

5.さいごに

なんだかんだバージョンの違いによる部分で時間がかかってしまいました。
各コマンドで使用される通信内容や、関連するサービスの影響などやはりわからないことが多かったと感じました。
それにNFSの構築だけなのに非常に長くなってしまいました。
時間をかけて身をもって理解したことがあったので、業務に活かしていこうと思います!
また、どこかの一部分だけでも、皆様のお役に立てたらうれしいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?