[OCI]Computeインスタンス上に構築したNFSサーバによるNFS共有をAutonomous Databaseにアタッチしてみた

# はじめに
従来は、OCI File Storage ServiceによるNFS共有のみがAutonomous Databaseのディレクトリにアタッチ可能でしたが、OCI File Storage Service以外のNFS共有もアタッチできるようになったので、早速検証してみました。

# 1.検証環境
今回の検証でNFSサーバとなるComputeインスタンスは、MyVCN内のMyPublicSubnet上にデプロイされており、プライベートIPアドレスは192.168.1.100、FQDNはnfsserver.mypublicsubnet.myvcn.oraclevcn.comとなっています。
![スクリーンショット 2023-03-22 17.19.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/e9eb96b9-d598-2427-e8d6-80515a87a8d8.png)
今回の検証で使用するプライベート・エンドポイント構成のAutonomous Databaseも、NFSサーバと同様に、MyVCN内のMyPublicSubnet上にデプロイされており、プライベートIPアドレスは192.168.1.200となっています。
![スクリーンショット 2023-03-22 17.19.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/bcd950be-0b1f-668b-6010-35c99ef97a18.png)
また、MyPublicSubnetに割り当てられているセキュリティ・リストには以下のセキュリティ・ルールがあり、サブネット内でのTCP通信、UDP通信が許可されています。
![スクリーンショット 2023-03-22 17.18.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/a4d5a76c-b0a9-2c95-2441-557ce8618f84.png)

# 2. NFSサーバの構築
Computeインスタンス上にNFSサーバを構築して、NFS共有を行います。
Autonomous DatabaseにアタッチするNFS共有はNFSv3またはNFSv2である必要があるため、今回はNFSv3の設定を行います。

rootユーザにスイッチします。
```
[opc@nfsserver ~]$ sudo su -
[root@nfsserver ~]# 
```
NFS共有のためのディレクトリを作成します。
```
[root@nfsserver ~]# mkdir -p /mnt/forADB
[root@nfsserver ~]# 
```
必要に応じてディレクトリのパーミッションを変更します。
``` 
[root@nfsserver ~]# chmod 777 /mnt/forADB
[root@nfsserver ~]# 
```
確認のためのファイルを作成します。
```
[root@nfsserver ~]# touch /mnt/forADB/test.txt
[root@nfsserver ~]# 
```
作成したファイルを確認します。
```
[root@nfsserver ~]# ls -l /mnt/forADB/
total 0
-rw-r--r--. 1 root root 0 Mar 22 06:26 test.txt
[root@nfsserver ~]# 
```
/etc/exportsを編集して、/mnt/forADBをAutonomous DatabaseのプライベートIPアドレスに対してのみ読み書き可能でアクセスさせるための設定を追加します。
```
[root@nfsserver ~]# vi /etc/exports
```
なお、Autonomous DatabaseからNFSサーバにアクセスする際に予約済みポート（1024以下）以外も使用するため、insecureの設定が必要となります。
```text:/etc/exports
/mnt/forADB 192.168.1.200(rw,async,insecure,no_root_squash)
```
/etc/sysconfig/nfsを編集して、mountdとstatdが使用するポートの設定を有効にします。
```
[root@nfsserver ~]# vi /etc/sysconfig/nfs
```

```text:変更前
# Port rpc.mountd should listen on.
#MOUNTD_PORT=892
```
```text:変更後
# Port rpc.mountd should listen on.
MOUNTD_PORT=892
```

```text:変更前
# Port rpc.statd should listen on.
#STATD_PORT=662
```
```text:変更後
# Port rpc.statd should listen on.
STATD_PORT=662
```
/etc/sysctl.confを編集して、NLMが使用するポートの設定を追加します。
```
[root@nfsserver ~]# vi /etc/sysctl.conf
```

```text:/etc/sysctl.conf（変更前）
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

# Enable Panic on VMs on NMI trigger
kernel.unknown_nmi_panic = 1
```

```text:/etc/sysctl.conf（変更後）
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

# Enable Panic on VMs on NMI trigger
kernel.unknown_nmi_panic = 1

fs.nfs.nlm_tcpport = 32803
fs.nfs.nlm_udpport = 32769
```
設定したポートの空き状況を確認します。
```
[root@nfsserver ~]# lsof -i :892
[root@nfsserver ~]# lsof -i :662
[root@nfsserver ~]# lsof -i tcp:32803
[root@nfsserver ~]# lsof -i udp:32769
[root@nfsserver ~]# 
```
現在のファイアウォールの設定内容を確認します。
```
[root@nfsserver ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
	
[root@nfsserver ~]# 
```
ファイアウォールに、先ほど設定したポートとrpc.nfsdおよびrpcbindのポート（2049および111）を許可する設定を追加します。
```
[root@nfsserver ~]# firewall-cmd --zone=public \
>   --add-port=2049/tcp --add-port=2049/udp \
>   --add-port=111/tcp --add-port=111/udp \
>   --add-port=32803/tcp --add-port=32769/udp \
>   --add-port=892/tcp --add-port=892/udp \
>   --add-port=662/tcp --add-port=662/udp
success
[root@nfsserver ~]# 
```

```
[root@nfsserver ~]# firewall-cmd --permanent --zone=public \
>   --add-port=2049/tcp --add-port=2049/udp \
>   --add-port=111/tcp --add-port=111/udp \
>   --add-port=32803/tcp --add-port=32769/udp \
>   --add-port=892/tcp --add-port=892/udp \
>   --add-port=662/tcp --add-port=662/udp
success
[root@nfsserver ~]# 
```
ファイアウォールをリロードして、設定内容を反映します。
```
[root@nfsserver ~]# firewall-cmd --reload
success
[root@nfsserver ~]# 
```
ファイアウォールの設定内容を再度確認します。
```
[root@nfsserver ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources: 
  services: dhcpv6-client ssh
  ports: 2049/tcp 2049/udp 111/tcp 111/udp 32803/tcp 32769/udp 892/tcp 892/udp 662/tcp 662/udp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
	
[root@nfsserver ~]# 
```
設定が反映されていることが確認できました。

NFSサービスを起動します。
```
[root@nfsserver ~]# systemctl start nfs-server
[root@nfsserver ~]#
```
OS再起動時にNFSサービスが起動するよう設定します。
```
[root@nfsserver ~]# systemctl enable nfs-server
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@nfsserver ~]#
```
Computeインスタンスを再起動します。
```
[root@nfsserver ~]# shutdown -r now
```
showmount -eコマンドを使用して、エクスポートされたファイル・システムのリストを表示します。
```
[root@nfsserver ~]# showmount -e
Export list for nfsserver:
/mnt/forADB 192.168.1.200
[root@nfsserver ~]#
```
hostname -fコマンドを使用して、NFSサーバのFQDNを確認します。
```
[root@nfsserver ~]# hostname -f
nfsserver.mypublicsubnet.myvcn.oraclevcn.com
[root@nfsserver ~]#
```

# 3.Autonomous DatabaseへのNFS共有のアタッチ

SQL*PlusからAutonomous Databaseにadminユーザとして接続します。
```
[opc@nfsclient ~]$ sqlplus admin/************@(description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1521)(host=testadb.adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=jym1f5owgdmcult_testadb_medium.adb.oraclecloud.com))(security=(ssl_server_dn_match=no)))

SQL*Plus: Release 21.0.0.0.0 - Production on Wed Mar 22 08:04:09 2023
Version 21.9.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Wed Mar 22 2023 07:49:08 +00:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.19.0.1.0

SQL> 
```
NFS共有をアタッチするためのディレクトリ・オブジェクトMY_FSS_DIRを作成します。
```
SQL> CREATE DIRECTORY MY_FSS_DIR AS 'FSS';

Directory created.

SQL> 
```
ディレクトリ・オブジェクトMY_FSS_DIRにNFSサーバ上のNFS共有/mnt/forADBをアタッチします。
```
SQL> BEGIN
  2      DBMS_CLOUD_ADMIN.ATTACH_FILE_SYSTEM(
  3          file_system_name     => 'MYFSS',
  4          file_system_location => 'nfsserver.mypublicsubnet.myvcn.oraclevcn.com:/mnt/forADB',
  5          directory_name       => 'MY_FSS_DIR',
  6          description          => 'Mounting forADB'
  7      );
  8  END;
  9  /

PL/SQL procedure successfully completed.

SQL> 
```
DBMS_CLOUD.LIST_FILESファンクションを使用して、ディレクトリ内のファイルを確認します。
```
SQL> SELECT object_name FROM DBMS_CLOUD.LIST_FILES('MY_FSS_DIR');

OBJECT_NAME
--------------------------------------------------------------------------------
test.txt

SQL>
```
1.で作成したtest.txtがディレクトリから参照できることが確認できました。