【学習メモ】Oracle VM ManagerでNFSストレージがつながらない

### はじめに
Oracle VM Manager にNFSストレージを追加できず困りました。

### 環境
|Host|IP|OS|機能|
|:--:|:--:|:--:|:--:|
|ovm|192.168.0.9|Oracle Linux 7.9|Oracel VM Manager 3.4.6|
|ovs|192.168.0.10|Oracle Solaris 11.4 SPARC|Oracle VM Server 3.4.6|
|nfs|192.168.0.11|Oracle Linux 8.3|NFS Server(nfs-utils 2.3.3)|
### 出たエラー

SPARCサーバーにつなげないエラー。たまに起きます。

```
OVMAPI_4032E Attempt to send command: get_api_version to server: 192.168.0.11 failed because the connection was refused or timed out. OVMAPI_4004E Sync command failed on server: 192.168.0.11. Command: get_api_version, Server error: org.apache.xmlrpc.XmlRpcException: Failed to read server's response: 接続を拒否されました (Connection refused) [Tue Dec 29 08:30:28 JST 2020]
```
問題のエラー。
VM ManagerにNFSサーバーを登録し、VM ManagerがVM Serverと通信し、VM Serverホストのマシンが直接NFSサーバーへアクセスするように登録する部分のようです。

```
OVMAPI_B000E Storage plugin command [storage_plugin_listFileSystems] failed for storage server [0004fb00000900001e4a94cdbf1642f6] failed with [com.oracle.ovm.mgr.api.exception.FailedOperationException: OVMAPI_4010E Attempt to send command: storage_plugin_listFileSystems to server: solaris failed. 
```
```
OVMAPI_4004E Sync command failed on server: 192.168.0.10 Command: storage_plugin_listFileSystems, Server error: <class 'OSCPlugin.OperationFailedEx'>:'Unable to access file system at 192.168.0.11: showmount: 192.168.0.11: RPC: Miscellaneous tli error - An event requires attention\n' [Tue Dec 29 08:44:08 JST 2020]]
```
```
OVMAPI_4010E Attempt to send command: storage_plugin_listFileSystems to server: solaris failed. OVMAPI_4004E Sync command failed on server: 192.168.0.11. Command: storage_plugin_listFileSystems, Server error: org.apache.xmlrpc.XmlRpcException: <class 'OSCPlugin.OperationFailedEx'>:'Unable to access file system at 192.168.0.11: showmount: 192.168.0.11: RPC: Miscellaneous tli error - An event requires attention\n' [Tue Dec 29 08:44:08 JST 2020]
```

### 探したところ

NFS側のFirewalldの設定を確認しました。

```
nfs #  firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens192
  sources: 
  services: cockpit dhcpv6-client nfs ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
```
NFS用のポートは空いています。

VM Serverのマシンからマウントを試しました。

```
nfs # cat /etc/exports
/export/vmpool 192.168.0.0/24(rw,no_root_squash,no_acl)
nfs # systemctl status nfs-server | grep -i active
   Active: active (exited) since Mon 2020-12-28 19:32:24 JST; 13h ago
nfs # touch /export/vmpool/nfstest.txt
```
```
ovs # mkdir /mnt/test
ovs # mount nfs:/export/vmpool /mnt/test
ovs # df -h
(略)
nfs:/export/vmpool 2.0T 14G 1.9T 1% /mnt/test
ovs # ls /mnt/test
nfstest.txt
```
問題なくマウントできました。

エラーのなかに```showmount: 192.168.0.11: RPC: Miscellaneous tli error - An event requires attention```とあり、ovsのマシンでエラーが出ているようです。
ovsのログを見てみます。

```
ovs # less /var/log/ovs-agent.log
(略)
[2020-12-29 08:44:06 19696] ERROR (nfs_solaris:130) Unable to access file system at 192.168.0.11: showmount: 192.168.0.11: RPC: Miscellaneous tli error - An event requires attention                                                   
                                                                                                                     
[2020-12-29 08:44:06 19696] INFO (storageplugin:125) Exception: 'Unable to access file system at 192.168.0.11: showmount: 192.168.0.11: RPC: Miscellaneous tli error - An event requires attention\n'                                   
[2020-12-29 08:44:06 19696] ERROR (service:97) catch_error: 'Unable to access file system at 192.168.0.11: showmount: 192.168.0.11: RPC: Miscellaneous tli error - An event requires attention\n'                                       
Traceback (most recent call last):                                                                                   
  File "/usr/lib/python2.7/site-packages/agent/lib/service.py", line 95, in wrapper                                  
    return func(*args)                                                                                               
  File "/usr/lib/python2.7/site-packages/agent/api/storageplugin.py", line 316, in storage_plugin_listFileSystems    
    return storage_plugin(impl_name, *params)                                                                        
  File "/usr/lib/python2.7/site-packages/agent/api/storageplugin.py", line 120, in storage_plugin                    
    result = plugin_method(*params)                                                                                  
  File "/opt/storage-connect/plugins/oracle/generic/NFSPlugin.py", line 157, in listFileSystems                      
    exports = nfs.get_export(ss_record['access_host'])                                                               
  File "/opt/storage-connect/plugins/oracle/generic/nfs_solaris.py", line 131, in get_export                         
    raise OperationFailedEx(error)                                                                                   
OperationFailedEx: 'Unable to access file system at 192.168.0.11: showmount: 192.168.0.11: RPC: Miscellaneous tli error - An event requires attention\n'    
```
OVSのログに出ていました。OVS->NFSへの接続がうまく行っていないようです。
Storage Plug-inに「Oracle Gneric Network File System (1.1.0)」とあったので、通常のNFSとは違うのかもしれません。

nfs側のFirewalldでブロックしていないか確認します。

```
nfs # firewall-cmd --get-log-denied
off
nfs # firewall-cmd --set-log-denied=all
success
nfs # firewall-cmd --reload
success
nfs # firewall-cmd --get-log-denied
all
```
```
nfs # tail /var/log/messages
(略)
Dec 29 09:47:53 nfs kernel: FINAL_REJECT: IN=ens192 OUT= MAC=00:00:00:a6:dc:7f:00:00:00:e2:a5:82:08:00 SRC=192.168.0.10 DST=192.168.0.11 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=40165 DF PROTO=TCP SPT=54896 DPT=111 WINDOW=64240 RES=0x00 SYN URGP=0 
Dec 29 09:47:54 nfs kernel: FINAL_REJECT: IN=ens192 OUT= MAC=00:00:00:a6:dc:7f:00:00:00:e2:a5:82:08:00 SRC=192.168.0.10 DST=192.168.0.11 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=40166 DF PROTO=TCP SPT=54896 DPT=111 WINDOW=64240 RES=0x00 SYN URGP=0 
Dec 29 09:47:56 nfs kernel: FINAL_REJECT: IN=ens192 OUT= MAC=00:00:00:a6:dc:7f:00:00:00:e2:a5:82:08:00 SRC=192.168.0.10 DST=192.168.0.11 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=40167 DF PROTO=TCP SPT=54896 DPT=111 WINDOW=64240 RES=0x00 SYN URGP=0 
Dec 29 09:48:01 nfs kernel: FINAL_REJECT: IN=ens192 OUT= MAC=00:00:00:a6:dc:7f:00:00:00:e2:a5:82:08:00 SRC=192.168.0.10 DST=192.168.0.11 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=40168 DF PROTO=TCP SPT=54896 DPT=111 WINDOW=64240 RES=0x00 SYN URGP=0 
Dec 29 09:48:06 nfs kernel: FINAL_REJECT: IN=ens192 OUT= MAC=ff:ff:ff:ff:ff:ff:00:00:00:92:89:e7:08:00 SRC=192.168.0.10 DST=192.168.0.11 LEN=229 TOS=0x00 PREC=0x00 TTL=128 ID=56164 PROTO=UDP SPT=138 DPT=138 LEN=209
```
ovsのnfsの111番ポート、138番ポートに着信しています。
Wikipediaによると、111番ポートはTCP/UDPでSun RPCとあります。RPCが失敗しているのでここを開ければよさそうです。
138番はNetBIOSのポートのようです。
111番を開けてみます。

```
nfs # firewall-cmd --add-port=111/tcp --zone=public --permanent
success
nfs # firewall-cmd --reload
success
```
```
nfs # tail /var/log/messages
(略)
Dec 29 10:11:26 nfs kernel: FINAL_REJECT: IN=ens192 OUT= MAC=00:00:00:a6:dc:7f:00:00:00:e2:a5:82:08:00 SRC=192.168.0.10 DST=192.168.0.11 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=40187 DF PROTO=TCP SPT=37362 DPT=20048 WINDOW=64240 RES=0x00 CWR ECE SYN URGP=0 
Dec 29 10:11:27 nfs kernel: FINAL_REJECT: IN=ens192 OUT= MAC=00:00:00:a6:dc:7f:00:00:00:e2:a5:82:08:00 SRC=192.168.0.10 DST=192.168.0.11 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=40188 DF PROTO=TCP SPT=37362 DPT=20048 WINDOW=64240 RES=0x00 SYN URGP=0 
Dec 29 10:11:27 nfs kernel: FINAL_REJECT: IN=ens192 OUT= MAC=00:00:00:a6:dc:7f:00:00:00:e2:a5:82:08:00 SRC=192.168.0.10 DST=192.168.0.11 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=40189 DF PROTO=TCP SPT=37362 DPT=20048 WINDOW=64240 RES=0x00 SYN URGP=0 
Dec 29 10:11:29 nfs kernel: FINAL_REJECT: IN=ens192 OUT= MAC=00:00:00:a6:dc:7f:00:00:00:e2:a5:82:08:00 SRC=192.168.0.10 DST=192.168.0.11 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=40190 DF PROTO=TCP SPT=37362 DPT=20048 WINDOW=64240 RES=0x00 SYN URGP=0 
Dec 29 10:11:31 nfs kernel: FINAL_REJECT: IN=ens192 OUT= MAC=00:00:00:a6:dc:7f:00:00:00:e2:a5:82:08:00 SRC=192.168.0.10 DST=192.168.0.11 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=40191 DF PROTO=TCP SPT=37362 DPT=20048 WINDOW=64240 RES=0x00 SYN URGP=0 
Dec 29 10:11:36 nfs kernel: FINAL_REJECT: IN=ens192 OUT= MAC=00:00:00:a6:dc:7f:00:00:00:e2:a5:82:08:00 SRC=192.168.0.10 DST=192.168.0.11 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=40192 DF PROTO=TCP SPT=37362 DPT=20048 WINDOW=64240 RES=0x00 SYN URGP=0 
```
まだ出ています。
20048はNFS mount protocolのようです。
同じように開けます。

```
nfs # firewall-cmd --add-port=20048/tcp --zone=public --permanent
success
nfs # firewall-cmd --add-port=20048/udp --zone=public --permanent
success
nfs # firewall-cmd --reload
success
```

つながるようになりました。

```
ovs # /sbin/showmount -e 192.168.0.11
export list for 192.168.0.11:
/export/vmpool 192.168.0.0/24
```
エラーの出ていたshowmountコマンドもすぐに応答がありました。

### 解決方法

NFSサーバー側で111(tcp)、20048(tcp/udp)のポートを開ける。
Oracle Gneric Network File Systemと言われて気後れしてしまいましたが、単純なポート開放の問題でした。