NFS Version 4のサーバとクライアントの構築手順

はじめに

CI環境を構築するにあたって、成果物を共有するための共有ストレージが必要になった。 いろいろ検討したが、ESXiのデータストアとして利用できるという点から、NFS Version 4を採用することにした。 ネット上の情報は古いものが多くて構築に苦労したので、NFSサーバとNFSクライアントの構築手順を残しておく。 試した環境はUbuntu 18.04。

NFSサーバ

NFSサーバをインストールする。

$ sudo apt install nfs-kernel-server

公開するディレクトリを準備する。 ここでは、以下に示すディレクト/public/shared/var/ci-artifactsを公開することにする。

/
|-- public
|   `-- shared
`-- var
    `-- ci-artifacts

NFS Version 4は個別にディレクトリを公開するのではなく、特定のディレクトリをルートとして公開する思想らしい。 そのため、公開したいディレクトリをあるひとつのディレクトリのもとに集約する必要がある。 ここではバインドマウントを利用して、以下のようにディレクト/exportのもとに集約する。

/
|-- export
|   |-- ci-artifacts ←●/var/ci-artifactsをバインドマウント
|   `-- shared       ←●/public/sharedをバインドマウント
|-- public
|   `-- shared
`-- var
    `-- ci-artifacts

推測だが、シンボリックリンクだと(chrootの場合のように)管轄外には辿れないので、バインドマウントでしっかりとファイルシステムに組み込む、ということなんだと思う。 バインドマウントするためには、/etc/fstabに以下のエントリを追記する。

/export/ci-artifacts  /var/ci-artifacts  none  bind  0  0
/export/shared        /public/shared     none  bind  0  0

公開するディレクトリのマウント先を作成する。

$ sudo mkdir /export/ci-artifacts
$ sudo mkdir /export/shared

マウントする。

$ sudo mount -a

マウントできているか確認する。

$ findmnt -l | grep "/export/"
/var/ci-artifacts               /dev/sda2[/export/ci-artifacts] ext4            rw,relatime,errors=remount-ro,data=ordered
/public/shared                  /dev/sda2[/export/shared]       ext4            rw,relatime,errors=remount-ro,data=ordered

/etc/exportsを編集して、公開するディレクトリの定義を行う。

/export               192.168.8.0/24(rw,sync,all_squash,no_subtree_check,fsid=0)
/export/ci-artifacts  192.168.8.0/24(rw,sync,all_squash,no_subtree_check,nohide)
/export/shared        192.168.8.0/24(rw,sync,no_root_squash,no_subtree_check,nohide)

ここではNFS Version 4のエントリだけを定義しているが、NFS Version 3などのエントリも混在させることができる。 fsid=0とあるのが、NFS Version 4のルートのエントリとなる。 色々調べてみた結果、複数のルート(fsid=1とか?)を公開することはできないように思うが、いまいち確証は得られなかった。 また、バインドマウントの単位ごとにエントリを作成する必要があり、ここでは/export/ci-artifacts/export/sharedのエントリを作成している。

/etc/exportsの編集が完了したら、以下のコマンドを実行してディレクトリを公開する。

$ sudo exportfs -r

あるいは、NFSサーバを再起動する事で公開してもよい。

$ sudo systemctl restart nfs-server

実際に公開できたか確認する。

$ sudo exportfs
/export         192.168.8.0/24
/export/ci-artifacts
        192.168.8.0/24
/export/shared  192.168.8.0/24

NFSクライアント

まずはNFSクライアントをインストールする。

$ sudo apt install nfs-common

マウントポイントを作成する。

$ sudo mkdir /ci-artifacts
$ sudo mkdir /shared

/etc/fstabを編集する。

192.168.8.1:/ci-artifacts /ci-artifacts nfs noauto,x-systemd.automount,rw  0  0
192.168.8.1:/shared       /shared       nfs noauto,x-systemd.automount,rw  0  0

マウントオプション的には、公開ディレクトリがどのバージョンのNFSなのかは、気にしなくていいようだ。 ただし、公開ディレクトリのパスのルートはfsid=0のパスが基準になる。 そのため、今回の場合は/exportを基準にするため、/export/ci-artifacts/ci-artifactsになる。

そして、マウントする。

$ sudo mount -a