NFSサーバの構築



#必要サービス

NFSを組むのに、以下の通り用途によって必要サービスが異なる。

|用途|portmap|nfsd|mountd|
|:---:|:---:|:---:|:---:|
|NFSクライアント|◎|||
|NFSサーバ|◎|◎|◎|

yum install nfs-utilsで一通りインストール可能。

#RPCの確認
クライアントがリモートにある記憶領域を使うための命令を送る必要がある。
その命令、システムコールをNW跨ぎで実行する技術をRPCという。
bashでたたかれたコマンドがリモートのサーバにて応答されるのはこのRPCのおかげということ。
昨今のWebAPIの利用時もサーバから別のサーバに対してコマンドをたたいてその応答を表示していたりする。そのときにもRPCは使われている。
/etc/rpcを見ると、NFSはRPC100003が使われるよう。


```bash:/etc/rpc
nfs             100003  nfsprog
```

RPCと接続ポートを対応させる必要がある。対応させるサービスをportmapと呼ぶ。
RPCはあくまでアプリケーション層のものでトランスポート層におけるTCP/UDPとの対応が必要って感じかな？
RPCとTCPの対応はrpcinfo - pで表示される。

```bash:rpcinfo
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
```

デフォルトだと100003に対するマッピングはなされていないよう。
ただし、nfsサービスを起動すると、以下のようにNFSに関連するRPCとその対応するポートが表示された。
NFSのサービスを使ってNFSサーバへアクセスするときにNFSサービスとRPCをマッピングさせる機能なので、NFSサービスがないといけないのかな。クライアントからサーバにアクセスするときに必要な機能なので、そりゃクライアント側でサービス起動していないとマッピングもしないか。


```bash:rpcinfo
 rpcinfo -p
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  46603  status
    100024    1   tcp  37560  status
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  45133  nlockmgr
    100021    3   udp  45133  nlockmgr
    100021    4   udp  45133  nlockmgr
    100021    1   tcp  34228  nlockmgr
    100021    3   tcp  34228  nlockmgr
    100021    4   tcp  34228  nlockmgr
```

rpcinfoでNFSのRPCと特定のポートが紐づいてればＯＫ．
#Portmapの役割

サービスが起動されたことを受けて、どうやってTCPポートをアサインしてるのか。
Portmapがになっている。
Portmapにおいて事前にアサインするポート範囲を定義しておき、その中から空いてるポート番号をアサインする。
アサインとその管理をPortmapサービスが行う。
つまり、PortmapはRPCサーバにおいて、サービス起動時にサービスから登録リクエストを受け取って、空きポート番号をアサインする。
RPCクライアントにおいてRPC接続リクエストを受け取ったportmapクライアントはPortmapサーバに接続ポート番号をヒアリング。そのヒアリング情報をもとRPC接続通信と接続TCPポートを紐づける。
このあたりの役割をPortampが果たしてる。
つまり下図の感じかな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606424/e4d451ed-e1ba-f5f7-3253-4e30b3da864e.png)

RPCの動作については、[こちら](https://social.technet.microsoft.com/Forums/windowsserver/ja-JP/9ddb9352-c0de-4fd1-ba20-1e72bbc25508/rpc?forum=Wcsupportja)を参考にした。
サービスは特に接続ポートを意識せずに通信が行えるのはこのportmapによるもののようだ。


#サーバ設定１＜TCP Wrapper>
話が大きくそれたが、PortmapはTCP Wrapperを利用し、接続制御できる。
etc/hosts.allow,/etc/hosts.denyを駆使して制御するが、今回は割愛。

#サーバ設定２＜exportfs＞
ディレクトリ公開のために/etc/exportsをいじる。

```bash:/etc/exports
/pub 192.168.0.0/255.255.0.0(rw)

```

上記によりサーバ上/pubディレクトリを192.168.0.0/24の送信元からのアクセスを許可し、そのアクセス時にはrwの権限を付与する意味となる。
TCP Wrapperではportampにおける接続制御でNFSとしての接続制御が/etc/exportfsという整理かな。

#クライアント設定
設定といってももうサーバの設定は完了してるので、実際にマウントするだけ。

```bash
mount -t nfs <サーバIP or hostname>:/pub /mnt -v
```

公開してる/pubを/mntディレクトリにマウントする。
-vはログが出力されるオプション

注意：サーバ側でfirewalldにてNFS通信をDENYしてる可能性がある。
実際そこにひっかかったので、systemctl stop firewalldなどで回避する。

#確認方法

クライアント側でdf -Tにてマウント状況を確認.
以下のようにFilesystemが見えてれば成功。

```bash:
Filesystem         Type     1K-blocks    Used Available Use% Mounted on
<サーバIP>:/pub    nfs4      17811456 1463296  16348160   9% /mnt
```

意外とすんなりいけるはず。