概要
今回は、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)を使用してみました。
参考文献
Comments