Oracle Cloud: File Storage Service のファイルシステムを Windows, Linux  と Autonomous Database へ NFSマウントしてみてみた



Oracle Cloud Infrastructure File Storage Service (FSS) では、永続的でスケーラブルな分散型のエンタープライズ規模のネットワーク・ファイル・システムを提供します。
仮想クラウド・ネットワーク(VCN)のベア・メタル、仮想マシン, コンテナ・インスタンス からファイル・ストレージ・サービスのファイル・システムに接続できます。
また、VCNピアリング、FastConnect およびインターネット・プロトコル・セキュリティ(IPSec)の仮想プライベート・ネットワーク(VPN)を使用して、VCNの外部からファイル・システムにアクセスすることもできます。

ということで、今回は、Windows Server 2022, Oracle Linux, Autonomous Database(ADB) からファイル・ストレージ・サービスのファイル・システムに接続してみてみます。

# ■ 構成
![構成図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/3c9820b7-5fa2-8380-07b9-46c394327121.jpeg)



# ■ VCNのセキュリティリストの設定
FSSを配置するSubnetもしくは、FSSにアタッチするNetwork Security Groups(NSG)へ NFS通信に必要な 次の TCP と UDP のステートフル・イングレスとステートフル・エグレスの通信を許可します。

     TCPポート: 111, 2048, 2049, 2050
     UDPポート: 111, 2048



# ■ File Storage Serviceの作成
File Storage Service (FSS) を次の値で作成し、これら値を使用して各システムでマウントします。

|項目  |値  |
|---|---|
|IPアドレス |10.0.0.170 |
|ホスト名 |fss01 |
|FQDN | fss01.publicsubnet01.vcn10000.oraclevcn.com|
|エクスポート・パス |/FileSystem |

**1) FSS作成**
![00_FSS01.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/1a2d0a14-334d-e0e0-5ee8-bd0cc8ffaa7c.jpeg)


**2) FSS作成完了**
![00_FSS01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/d12ca8ae-abd3-0913-0223-d8d3afd2c9c0.jpeg)


# ■ Windowsインスタンスからのファイル・システムのマウントする
Windows Server 2012 R2以降のバージョンのユーザーは、マウント・ターゲットのIPアドレスとファイル・システムのエクスポート・パスを使用して、使用可能な任意のドライブ文字にファイル・システムをマウントできます。

## ⚫︎ NFSクライアント設定
ファイル・システムのマウント元のインスタンス上にWindows NFSクライアントをインストールする必要があります。


### 1) 管理者として Windows PowerShellを起動
![01-Windows-Powershell起動01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/d5f0e62b-cf2c-946d-b7f2-a190fafff17b.jpeg)


```
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

Install the latest PowerShell for new features and improvements! https://aka.ms/PSWindows   

PS C:\Windows\system32> Start-Process powershell -Verb runAs
```

### 2)  NFS-Client インストール
Windows PowerShellで、次のように入力

```
PS C:\Windows\system32> Install-WindowsFeature -Name NFS-Client      

Success Restart Needed Exit Code      Feature Result
------- -------------- ---------      --------------
True    No             NoChangeNeeded {}
```

### 3) NFSクライアントを設定
管理者用PowerShellで、次のように入力してNFSクライアントを取得

```
PS C:\Windows\system32> Set-ItemProperty HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default -Name AnonymousUid -Value 0
PS C:\Windows\system32> Set-ItemProperty HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default -Name AnonymousGid -Value 0
PS C:\Windows\system32> Stop-Service -Name NfsClnt
PS C:\Windows\system32> Restart-Service -Name NfsRdr
PS C:\Windows\system32> Start-Service -Name NfsClnt
```

![01-Windows-Powershell起動02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/8bd4ced6-776c-67c7-4978-3c5384fdf62e.jpeg)






## ⚫︎ ファイル・システムのマウント
### 1) Windowsコマンドライン(CMD)起動
標準のWindowsコマンドライン(CMD)ウィンドウで、次を入力してファイル・システムをマウントします。
![02-Windows-CMD起動01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/e825a1a2-2ccd-a4aa-f075-f23ceb1844c1.jpeg)

### 2) ファイル・システムのマウント
```
mount -o sec=sys 10.x.x.x:/FileSystem X:
```
・ 10.x.x.x: を、マウント・ターゲットに割り当てられたローカル・サブネットIPアドレスに置き換えます。
・ FileSystem を、ファイル・システムをマウント・ターゲットに関連付ける際に指定したエクスポート・パスに置き換えます。
・ Xを、ファイル・システムのマップ先として使用可能なドライブのドライブ文字に置き換えます。

:::note
エクスポートでKerberos認証を使用する場合は、IPアドレスのかわりにマウント・ターゲットの完全修飾ドメイン名(FQDN)を使用します。
:::



![02-Windows-CMD起動02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/fa79578c-9bdc-26b1-9e53-3fe4ba633572.jpeg)



### 3) マウント確認
エクスプローラーを開き Xドライブにファイルシステムがマウントされていることを確認
![03_WIndows-マウント確認.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/a63840ef-329a-2c28-b731-da1f30182555.jpeg)



## ⚫︎ ファイル書き込みテスト

1) FSSをマウントしたXドライブに移動
X: コマンドで Xドライブに移動

```
C:\Users\opc>X:
```

2) windows.txt 作成
echoコマンドでファイル作成う

```
X:\>echo > windows.txt
```

2) windows.txt 作成確認
dirコマンドでファイル確認


```
X:\>dir
 Volume in drive X has no label.
 Volume Serial Number is 071D-8F2E

 Directory of X:\

08/01/2023  02:47 PM    <DIR>          .
08/01/2023  02:47 PM    <DIR>          ..
08/01/2023  02:48 PM    <DIR>          .snapshot
08/01/2023  02:47 PM                13 windows.txt
               1 File(s)             15 bytes
               3 Dir(s)  9,223,372,036,854,763,520 bytes free
```


![04_ファイル作成テスト01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/7db7c4eb-4fbf-da84-8ac5-b0ab8c6092c8.jpeg)


# ■ Linux, Red HatまたはCentOSからファイル・システムをマウントする

## ⚫︎ nfs-utils インストール
### 1) nfs-utils インストール
```
[opc@oracle-linux ~]$ sudo yum install nfs-utils
Loaded plugins: langpacks, ulninfo
・・・
Dependencies Resolved
	
	===========================================================================================================================================================================================
	 Package                                   Arch                                   Version                                                 Repository                                  Size
	===========================================================================================================================================================================================
	Updating:
	 nfs-utils                                 x86_64                                 1:1.3.0-0.68.0.1.el7.2                                  ol7_latest                                 413 k
	
	Transaction Summary
	===========================================================================================================================================================================================
	Upgrade  1 Package
	
	Total download size: 413 k
	Is this ok [y/d/N]: y
	Downloading packages:
	Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
	nfs-utils-1.3.0-0.68.0.1.el7.2.x86_64.rpm                                                                                                                           | 413 kB  00:00:00
	Running transaction check
	Running transaction test
	Transaction test succeeded
	Running transaction
	  Updating   : 1:nfs-utils-1.3.0-0.68.0.1.el7.2.x86_64                                                                                                                                 1/2
	  Cleanup    : 1:nfs-utils-1.3.0-0.65.0.1.el7.x86_64                                                                                                                                   2/2
	  Verifying  : 1:nfs-utils-1.3.0-0.68.0.1.el7.2.x86_64                                                                                                                                 1/2
	  Verifying  : 1:nfs-utils-1.3.0-0.65.0.1.el7.x86_64                                                                                                                                   2/2
	
	Updated:
	  nfs-utils.x86_64 1:1.3.0-0.68.0.1.el7.2
	
	Complete!
```

### 2) nfs-utils インストール確認
```
[opc@oracle-linux ~]$ sudo rpm -qa | grep nfs-utils
　nfs-utils-1.3.0-0.65.0.1.el7.x86_64
```

# ⚫︎ マウント
:::note warn
次のマウント・オプションの組合せは File Storage Service でサポートされていません:
　・soft ファイル・システムが読取り/書込みマウント・オプション(-o rw)でマウントされている場合。この組合せによって、データが破損する可能性があります。

次のマウント・オプションは、File Storage Service で使用することはお薦めしません:
　・soft オプションは、ファイル・システムが読取り専用マウント・オプション(-o ro)でマウントされており、timeoが300秒未満で指定されている場合。この組合せによって、I/Oのエラー・レスポンスが多数発生する可能性があります。
　・rsize または wsize オプションは、パフォーマンスの問題が発生します。
:::

### 1) マウント・ポイント作成
```
[opc@oracle-linux ~]$ sudo mkdir -p /mnt/FileSystem
```

### 2) マウント
ターゲットの80Gbps読取りスループットを最大限に活用するには、Linuxカーネルバージョン5.3以降から使用できる nconnect=16 マウントオプションを使用します。nconnect を使用すると、より少ないクライアント マシンを使用して大規模にパフォーマンスを向上させ、総保有コスト (TCO) を削減できます。 Nconnect は、単一または複数のクライアントを使用して、1 つまたは複数の NIC で複数の TCP チャネルを使用することで、パフォーマンスを向上させます。

```
[opc@oracle-linux ~]$ sudo mount -o nconnect=16 10.0.0.170:/FileSystem /mnt/FileSystem
```

# ⚫︎ マウント確認
### 1) マウント確認
デフォルトで rsize, wsize が適切な値で設定されていることが確認できます。
```
[opc@oracle-linux ~]$ sudo mount | grep FileSystem
　10.0.0.170:/FileSystem on /fss type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,nconnect=16,timeo=600,retrans=2,sec=sys,mountaddr=10.0.1.107,mountvers=3,mountport=2048,mountproto=udp,local_lock=none,addr=10.0.1.107)
```
 
### 2) ファイル・システムを表示
```
[opc@oracle-linux ~]$ df -T | grep nfs
	10.0.0.170:/FileSystem nfs      9007199254740992        0 9007199254740992   0% /mnt/FileSystem
```

### 3) NFS マウント・プロセス確認
nconnect=16 マウントオプションでプロセスが16個起動していることを確認
```
[opc@oracle-linux ~]$ netstat -an |grep 2049
    tcp        0      0 10.0.1.3:928          10.0.0.170:2049         ESTABLISHED
    tcp        0      0 10.0.1.3:915          10.0.0.170:2049         ESTABLISHED
    tcp        0      0 10.0.1.3:762          10.0.0.170:2049         ESTABLISHED
    tcp        0      0 10.0.1.3:974          10.0.0.170:2049         TIME_WAIT
    tcp        0      0 10.0.1.3:963          10.0.0.170:2049         ESTABLISHED
    tcp        0      0 10.0.1.3:926          10.0.0.170:2049         ESTABLISHED
    tcp        0      0 10.0.1.3:1007         10.0.0.170:2049         ESTABLISHED
    tcp        0      0 10.0.1.3:861          10.0.0.170:2049         ESTABLISHED
    tcp        0      0 10.0.1.3:745          10.0.0.170:2049         ESTABLISHED
    tcp        0      0 10.0.1.3:777          10.0.0.170:2049         ESTABLISHED
    tcp        0      0 10.0.1.3:958          10.0.0.170:2049         ESTABLISHED
    tcp        0      0 10.0.1.3:933          10.0.0.170:2049         ESTABLISHED
    tcp        0      0 10.0.1.3:673          10.0.0.170:2049         ESTABLISHED
```

### 4) 書き込みテスト
touchコマンドでテストファイルを作成してみてみます
```
[opc@oracle-linux ~]$ sudo touch /mnt/FileSystem/test.txt
```


### 5) 書き込み確認
```
[opc@oracle-linux ~]$ ls -l /mnt/FileSystem/
	-rw-r--r--. 1 root root 0 Aug  1 09:54 /mnt/FileSystem/test.txt
```

### 6) ファイル削除テスト
```
[opc@oracle-linux ~]$ sudo rm -r /mnt/FileSystem
```

### 7) ファイル削除確認
```
[opc@oracle-linux ~]$ ls -l /mnt/FileSystem/
ls: cannot access '/mnt/FileSystem/': No such file or directory
```

# ■ Autonomous Database からファイル・システムをマウントする

## ⚫︎ ファイルシステムをADBに接続


DBMS_CLOUD_ADMIN.ATTACH_FILE_SYSTEM プロシージャを使用して、 FileSystem という名前のファイル システムをADB のFSS_DIRディレクトリにアタッチ。
このプロシージャを呼び出す前にディレクトリ オブジェクトが存在している必要があるため、最初にディレクトリ オブジェクトを作成することに注意してください。

### 1) ディレクトリ オブジェクト作成
```
SQL> CREATE DIRECTORY FSS_DIR AS 'FSS';

	Directory created.
```

### 2) ディレクトリ オブジェクト作成確認
```
SQL> col OWNER format a10
SQL> col DIRECTORY_NAME format a30
SQL> col DIRECTORY_PATH format a120
SQL> select * from DBA_DIRECTORIES where DIRECTORY_NAME = 'FSS_DIR';

	OWNER	   DIRECTORY_NAME		  DIRECTORY_PATH													   ORIGIN_CON_ID
	---------- ------------------------------ ------------------------------------------------------------------------------------------------------------------------ -------------
	SYS	   FSS_DIR			  /u03/dbfs/01D16905700631618000A03DF/data/FSS										     194
```

### 3) FileSystem を FSS_DIRディレクトリにアタッチ
```
SQL> BEGIN
	DBMS_CLOUD_ADMIN.ATTACH_FILE_SYSTEM(
	file_system_name      => 'FileSystem',
	file_system_location  => 'fss01.publicsubnet01.vcn10000.oraclevcn.com:/FileSystem',
	directory_name        => 'FSS_DIR',
	description           => 'Mounting a NFS'
	);
END;
/


PL/SQL procedure successfully completed.
```

### 4) ファイル システムを確認

DBA_CLOUD_FILE_SYSTEMS をクエリして、接続されているファイル システムを確認できることを確認します。

```
SQL> col file_system_name format a10
SQL> col file_system_location format a80
SQL> col directory_path format a80
SQL> SELECT 
  	file_system_name, 
  	file_system_location,
  	directory_path
FROM dba_cloud_file_systems;


	FILE_SYSTE FILE_SYSTEM_LOCATION 							    DIRECTORY_PATH
	---------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
	FILESYSTEM fss01.publicsubnet01.vcn10000.oraclevcn.com:/FileSystem			    /u03/dbfs/01D16905700631618000A03DF/data/FSS/
```


## ⚫︎ ファイル作成テスト
UTL_FILE 経由でファイルを作成して書き込みます
adb_test.csvというファイルを作成し、そこに書き込みます。

### 1) adb_test.csvファイルを作成
```
SQL> DECLARE
  l_file         UTL_FILE.file_type;
  l_location     VARCHAR2(100) := 'FSS_DIR';
  l_filename     VARCHAR2(100) := 'adb_test.csv';
BEGIN
  -- Open file.
  l_file := UTL_FILE.fopen(l_location, l_filename, 'w');
   
  UTL_FILE.PUT(l_file, 'Catalog, Indirect, 12');
 
  -- Close the file.
  UTL_FILE.fclose(l_file);
END;
/

	PL/SQL procedure successfully completed.
```

### 2) adb_test.csvファイルを作成確認

DBMS_CLOUD.LIST_FILES を介してこの接続されたファイル システム内のファイルを一覧表示し、作成したばかりのファイルの内容を読み取ります。

```
SQL> SELECT object_name FROM DBMS_CLOUD.LIST_FILES('FSS_DIR');

	OBJECT_NAME
	--------------------------------------------------------------------------------
	adb_test.csv
```



# ■ 参考
・[File Storage: ファイル・システムのマウント](https://docs.oracle.com/ja-jp/iaas/Content/File/Tasks/mountingfilesystems.htm)
・[Linux、Red HatまたはCentOSからファイル・システムをマウントするには](https://docs.oracle.com/ja-jp/iaas/Content/File/Tasks/mountingunixstyleos.htm#)
・[Windowsインスタンスからのファイル・システムのマウント](https://docs.oracle.com/ja-jp/iaas/Content/File/Tasks/mountingwindowsos.htm)
・[How to Attach a File System to your Autonomous Database](https://blogs.oracle.com/datawarehousing/post/attach-file-system-autonomous-database)