Ubuntu 20.04にNFSサーバを構築し、NFSv4擬似ルート機能を使用してみる

概要

今回は、Ubuntuが入ったMacBook2016にNFSサーバを構築し、NFSv4の擬似ルート機能(fsid=0)を使用してみます。また、NFSクライアント側は、別PC(MacBook Air2020)上の仮想マシン(CentOS8)でやっていきます。

環境

  • NFSサーバ側 → Ubuntu 20.04.1 LTS
  • NFSクライアント側 → 仮想マシン(CentOS8)
  • VirtualBox 6.1.16

NFS

NFSとは?

NFSとは、ネットワーク越しにマウントする際に用いられるプロトコルであり、それを実装したソフトウェアです。なのでNFSを用いると、手元のマシン上に対象のデータが無くても、他のマシン上のディレクトリをマウントすることで、アクセスして編集や更新をすることができます。

NFSサーバ側1

ではまず、UbuntuにNFSサーバを構築します。Ubuntuの場合は、nfs-kernel-serverパッケージをインストールします(CentOSはnfs-utilsパッケージ)。

$ sudo apt install nfs-kernel-server

ファイアウォールを有効にしていたので、NFSで使う2049番ポートを開放します。無効にしている方はこの手順を無視して大丈夫です。変更したらreloadでしっかりと反映させます。

$ sudo ufw allow 2049
$ sudo ufw reload

NFSのサービスの自動起動&起動の設定をします。

$ sudo systemctl enable nfs-server --now

次は擬似ルート機能の検証用のため、階層の深いディレクトリを作っていきます。mkdirコマンドに-pを指定することで、test3までの間でまだ存在していないディレクトリも作ってくれます。

$ sudo mkdir -p /var/nfs/test1/test2/test3

NFSサーバでは、クライアントに対するアクセス制御を設定する/etc/exportsファイルがあるので、以下のように編集します。

$ sudo vi /etc/exports

/var/nfs/test1 192.168.0.0/24(rw,sync,fsid=0,all_squash)
                                                           
:wq!

/etc/exportsの書式は以下の通りです。

ディレクトリ ホスト名(オプション, オプション,……) ホスト名(オプション,…..)……..

ここでは、エクスポートする/var/nfs/test1ディレクトリに192.168.0.0/24内のホストがアクセスできるようにしています。また、使用したオプションの意味は以下の通りです。

オプション説明
rw読み書きを許可
syncファイル変更や更新をすぐに反映
fsid=0擬似ルート機能を使用
all_squash全てのアクセスを匿名アカウント権限で実行

次にtest3までの全てのディレクトリの所有ユーザとグループを、nobodyとnogroupに変更しています。

$ chown -R nobody.nogroup /var/nfs/

なぜこうするかというと、/etc/exportsファイルでall_squashオプションを使用したからです。このオプションを使用すると、NFSを通じてアクセスしてきたクライアントは全て匿名ユーザとして、nobody, nogroupを割り当てるように設定されています。以下の/etc/idmapd.confファイルをみると、よくわかると思います。

$ less /etc/idmapd.conf
-------(省略)---------
[Mapping]
Nobody-User = nobody
Nobody-Group = nogroup

なので、nobodyとnogroupに設定しないと、マウントしたディレクトリにファイルを新しく作れなかったりします。

最後に、exportfsコマンドを使って、/etc/exportsファイルに記述されたディレクトリをエクスポートします。

$ sudo exportfs -a
オプション説明
-a/etc/exportsファイルに記述された全てのディレクトリをエクスポート

NFSクライアント側1

ここからはクライアント側(CentOS8)の設定を行います。NFSはクライアント側でもパッケージをインストールしておかなければなりません。CentOS8はnft-utilsパッケージなので、インストールしていきます。

$ sudo dnf install nfs-utils

そしたら、マウントポイントとなるディレクトリを作成します。

$ sudo mkdir /mnt/nfs

ではmountコマンドで/mnt/nfsディレクトリにマウントしていきます。-tでNFSを指定していますが、省略可能です。

$ sudo mount -t nfs 192.168.0.8:/ /mnt/nfs

書式は以下の通りです。

mount [-t nfs] [-o オプション] NFSサーバ:ディレクトリ マウントポイント

/mnt/nfs以下がどうなっているのか確認します。

$ ll /mnt/nfs
drwxr-xr-x 3 nobody nobody 4096 11月 15 21:38 test2

このように、test2ディレクトリが表示されました。/etc/exportsでfsid=0をオプションを指定していると、クライアント側からはそのディレクトリがルートとして見えます。つまり、今回は/var/nfs/test1に対してfsid=0を付与しているので、ここが / ととして見えるわけです。

では、アンマウントして次の検証へと移ります。

$ sudo umount /mnt/nf

NFSサーバ側2

今度は、一段階深いtest2ディレクトリにfsid=0を付与してみます。

$ sudo vi /etc/exports
/var/nfs/test1/test2 192.168.0.0/24(rw,sync,fsid=0,no_subtree_check,all_squash,nohide)

:wq!

編集し終わったら、exportfsコマンドに-rオプションをつけて設定を反映させます。

$ sudo exportfs -r

NFSクライアント側2

では、先ほどと同じようにクライアント側でマウントしてみます。

$ sudo mount -t nfs 192.168.0.8:/ /mnt/nfs

どうなっているのか/mnt/nfs以下を見にいきます。

$ ll /mnt/nfs
drwxr-xr-x 2 nobody nobody 4096 11月 15 21:38 test3

すると、このようにtest2ディレクトリがルートとして見えるため、それ以下のtest3が表示されます。

NFSクライアント側3

ここからはおまけで、マウントしたクライアント側でファイルを作成するとどうなるのか検証します。

現在の状態は、/mnt/nfsディレクトリ以下にtest3があります。

$ cd /mnt/nfs
$ ll 
drwxr-xr-x 2 nobody nobody 4096 11月 15 21:38 test3

このディレクトリ上でファイルを作成し、確認します。

$ touch hello.html
$ ll 
-rw-rw-r-- 1 nobody nobody    0 11月 16 16:22 hello.html
drwxr-xr-x 2 nobody nobody 4096 11月 15 21:38 test3

するとこのようにnobodyユーザでファイルが作成されました。なぜnobodyとなるかは、先ほど説明したall_squashオプションで、NFSサーバにアクセスしたユーザがnobodyに割り当てられているからです。

NFSサーバ側3

最後にクライアント側で作成したファイルが、サーバ側ではどうなっているか確認します。

$ ll /var/nfs/test1/test2
-rw-rw-r-- 1 nobody nogroup    0 11月 16 16:22 hello.html
drwxr-xr-x 2 nobody nogroup 4096 11月 15 21:38 test3/

このように、nobody, nogroupで作成されており、無事更新されていることも確認することができました。

以上、Ubuntu上にNFSサーバを構築し、擬似ルート(fsid=0)を使用してみました。

参考文献

NFSv4擬似ルートの使い方 – Qiita

Linux教科書 LPIC レベル2 Version4.5対応

標準テキスト CentOS 7 構築・運用・管理パーフェクトガイド

Comments

Copied title and URL