[Oracle Cloud] Windows Server を NFS サーバーにして、DBCS から NFS マウントしてみた

# はじめに

Oracle Cloud Infrastructure(以下OCI)には、Oracle DB のマネージドサービスがいくつかあります。今までオンプレミスで使ってきた Oracle DB と同じような操作感で扱うことのできる Database Cloud Service や、パフォーマンスチューニングやアップグレードなど様々な自動機能が備わっている Autonomous DB が提供されています。

Database Cloud Service では、OS は Oracle Linux が使われています。オンプレミスや他の IaaS 環境で稼働している既存システムを OCI へ移行するときに、OS による問題が発生する場合があります。
例えば、既存システムの構成が次のときに当てはまります。

- Windows Server を使用して、Oracle DB インスタンスを稼働
- 同一のサーバーで、アプリケーションを稼働



既存システムの構成そのまま、Database Cloud Service に置き換えることが出来ません。
これに対処する一つの答えは、Oracle DB は Oracle Linux で稼働する Database Cloud Service を利用して、アプリケーション側は Windows Server で動かします。ただ、既存システムでは、アプリケーション と Oracle DB が同一のマシンで動くことを前提とているため、ローカルファイルシステム経由で csv ファイルなどの連携を行っていることがあります。
これの問題に対応するために、Windows Server と Database Cloud Service の Oracle Linux 間でファイル共有を使用して解決する方法が考えられます。

ファイル共有の方法は、大きくわけて以下の2パターンがあります

- Windows に CIFS共有を設定し、Database Cloud Service から CIFS マウントを行う
- Windows に NFS サーバーをインストールし、Database Cloud Service から NFS マウントを行う



Database Cloud Service から CIFS マウントを行うためには、`cifs-utils` パッケージのインストールが必要です。しかし、Database Cloud Service は PaaS サービスなので、好きなパッケージをインストールするのは望ましい形ではありません。技術的には問題なく動くと想定できますが、何かの拍子に問題が発生する可能性が出てきます。
NFS マウントのパターンでは、追加のパッケージは不要なので、NFS マウントで共有するパターンが望ましいです。

前振りが長くなってしまいましたが、今回は以下の検証を行っていきます

- Windows Server 2016 に NFS サーバーを導入
- Database Cloud Service から NFS マウント
- 互いのサーバーからファイルを共有できることを確認



# 前提作業

- Windows Server 2016 を適当に構築
- Windows Server 2016 でファイアウォールを設定変更。NFS マウントが出来るようにポートを開放
- OCI Database Cloud Service で、19c を適当に構築



# Windows Server 2016 に NFSサーバー導入

適当にググって、Windows Server に NFS サーバーを導入します。Microsoft が公式に提供している機能を追加します。
https://www.server-world.info/query?os=Windows_Server_2016&p=nfs

デスクトップの `share1` を NFS 共有します。
https://www.server-world.info/query?os=Windows_Server_2016&p=nfs&f=2



サーバーマネージャーを開きます

![1582287710919.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/c9c98b39-8090-78ad-1b4b-73f5666cb439.png)



新しい共有を選択します

![1582287765805.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/dc35de18-7a40-312b-7ec3-908cbb30e932.png)



NFS 共有 - 簡易を選びます

![1582287787258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/4506263b-56c9-597a-da81-b256375cb9a4.png)



カスタムパスを任意の物を指定します

![1582286643593.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/ac15f3d7-5e7d-a4d8-3ed5-e97d8d03b478.png)



共有パスを Default のままとします

![1582287860769.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/f6fe2208-3fcf-dd86-3317-c772e54d9586.png)



認証方法の指定です。サーバー認証なし のみチェックを入れます。

![1582300190444.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/ec18a098-70be-b903-c7bc-21cc70205bf5.png)



アクセス許可の方法を指定します。

- ホスト : Database Cloud Service の Private IP を指定
- 言語のエンコード : EUC-JP
- 共有のアクセス許可 : 読み取り/書き込み

![1582287486462.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/06429540-617a-a5be-1567-86f42ab91609.png)



次へ

![1582287511282.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/82b4be41-53fe-c1ec-0dd9-ba8d1adc565d.png)



このまま Default で設定

![1582287650565.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/8eddf42b-c5e4-2052-0699-ce31a56c116d.png)



確認して、作成を押します

![1582287914045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/6a483fec-1dd9-9bb3-74e0-83e4f50d3934.png)



閉じる

![1582287939604.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/84ed60bb-f72d-78b0-c478-c805ae2b22b8.png)



画面に設定した内容が表示されています

![1582287952329.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/85f6a8f0-bc04-1f45-6d3a-2b175fe79d5a.png)



# Windows Server ユーザーマッピング

Linux 側のユーザー管理と、Windows 側のユーザー管理をマッピングする必要があります。Linux では、UID 101 の `oracle` ユーザーが、Windows 側でどのユーザーに紐づけるかを指定します。NFS サーバーの設定方法によってはマッピング作業は要らないですが、適切にマッピングすることでアクセス権をコントロールすることが出来るため、基本的にはマッピングするのが良いです。

次の Microsoft の記事にそって、設定を行っていきます

Linux の UID, GID を Windows のアカウントやグループに紐づけを行う
https://docs.microsoft.com/ja-jp/archive/blogs/askcorejp/windows-server-2012-nfs

Windows Server の `C:\Windows\System32\drivers\etc` 配下に2種類のファイルを作成します

- passwd
- group

![1582292392161.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/1f7d1955-a78e-bd06-ef8d-cc0833f25f45.png)



Linux 側の `/etc/passwd` と `/etc/gruop` から、一部を抜粋・変換して Windows 側に設定します。

passwd ファイル : Linux側から確認

```
root:x:0:0:root:/root:/bin/bash
oracle:x:101:1001::/home/oracle:/bin/bash
```



passwd ファイル : Windows 側に以下の内容で作成します。Linux側では `oracle` ユーザーが、Windows側では `opc` ユーザーに紐づけます。個々の部分は好きなユーザーに紐づけして大丈夫です。

```
Administrator:x:0:0:root:/root:/bin/bash
opc:x:101:1001::/home/oracle:/bin/bash
```



確認

![1582300789807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/3898d128-ba8d-51bc-d713-76a04bb5d39c.png)



groupファイル : Linuxから抜粋

```
root:x:0:
oinstall:x:1001:oracle
dbaoper:x:1002:grid,oracle
dba:x:1003:oracle
asmdba:x:1006:grid,oracle
```



groupファイル : Windows側に作成します。Linux 側での `root`, `ionstall`, `dbaper`, `dba`, `asmdba` グループを、`Administrators` に紐づけを行っています。これも任意のグループに紐づけが出来ます。

```
BUILTIN\Administrators:x:0:
BUILTIN\Administrators:x:1001:oracle
BUILTIN\Administrators:x:1002:grid,oracle
BUILTIN\Administrators:x:1003:oracle
BUILTIN\Administrators:x:1006:grid,oracle
```



確認

![1582300767166.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/b13c321a-93c4-5171-b274-cf8b97820a45.png)



# OCI Database Cloud Service から NFS マウント

SSH して root へスイッチします

```
> ssh opc@168.138.41.165
Last login: Wed Feb 19 13:58:36 2020 from kd210155078036.ec-userreverse.dion.ne.jp
[opc@jumpbox ~]$ ssh opc@10.100.1.6
Last login: Wed Feb 19 13:58:57 2020 from 10.100.0.2
[opc@db19 ~]$ 
[opc@db19 ~]$ sudo su - 
Last login: Fri Feb 21 12:29:45 UTC 2020
[root@db19 ~]$ 
```



Director を作成します

```
mkdir /home/oracle/share1
chown oracle:oinstall /home/oracle/share1
```



Windows Server 側の IP アドレスで showmount を行い、NFS のエクスポートポイントを参照します。

```
[root@db19 oracle]# showmount -e 10.100.0.3
Export list for 10.100.0.3:
/share1 10.100.1.6
[root@db19 oracle]#
```



NFS マウントを行うために、必要な サービスを開始します

```
systemctl start rpcbind
systemctl enable rpcbind
```



NFS v3 で、Windows Server をマウントします

```
mount -v -t nfs -o vers=3  10.100.0.3:/share1 /home/oracle/share1
```



実行例

```
[root@db19 ~]# mount -v -t nfs -o vers=3  10.100.0.3:/share1 /home/oracle/share1
mount.nfs: timeout set for Fri Feb 21 14:05:03 2020
mount.nfs: trying text-based options 'vers=3,addr=10.100.0.3'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 10.100.0.3 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 10.100.0.3 prog 100005 vers 3 prot UDP port 2049
[root@db19 ~]#
```



マウントされたことを確認します

```
[root@db19 ~]# df -hT
Filesystem                          Type      Size  Used Avail Use% Mounted on
devtmpfs                            devtmpfs  7.2G     0  7.2G   0% /dev
tmpfs                               tmpfs     7.3G  1.1G  6.2G  15% /dev/shm
tmpfs                               tmpfs     7.3G   25M  7.2G   1% /run
tmpfs                               tmpfs     7.3G     0  7.3G   0% /sys/fs/cgroup
/dev/mapper/VolGroupSys4-LogVolRoot ext4       35G   29G  4.2G  88% /
/dev/sda2                           ext4      1.4G  102M  1.2G   8% /boot
/dev/sda1                           vfat      486M  9.7M  476M   2% /boot/efi
tmpfs                               tmpfs     7.3G   16M  7.3G   1% /tmp
/dev/sdb                            ext4      197G   20G  168G  11% /u01
/dev/asm/commonstore-101            acfs      5.0G  386M  4.7G   8% /opt/oracle/dcs/commonstore
tmpfs                               tmpfs     1.5G     0  1.5G   0% /run/user/54322
10.100.0.3:/share1                  nfs       256G   31G  226G  12% /home/oracle/share1
```



マウントオプションを確認

```
[root@db19 ~]# mount | grep -i share1
10.100.0.3:/share1 on /home/oracle/share1 type nfs (rw,relatime,vers=3,rsize=32768,wsize=32768,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.100.0.3,mountvers=3,mountport=2049,mountproto=udp,local_lock=none,addr=10.100.0.3)
```



なお、root ユーザーだと Permission denied でアクセスすることが出来ません

```
[root@db19 ~]# ls -la /home/oracle/share1/
ls: cannot open directory /home/oracle/share1/: Permission denied
```



oracle ユーザーにスイッチ

```
[root@db19 ~]# sudo su - oracle
Last login: Fri Feb 21 14:49:52 UTC 2020
[oracle@db19 ~]$
```



dir を確認
グループが、`4294967294` と表示されていますが、ファイルの書き込みは問題なく可能です

```
[oracle@db19 ~]$ ls -la /home/oracle/share1/
total 8
drwx------ 2 oracle 4294967294 4096 Feb 21 14:00 .
drwx------ 5 oracle oinstall   4096 Feb 21 13:56 ..
```



移動します

```
cd /home/oracle/share1/
```



vim で適当にファイルを作成します

```
vim iamoracle.txt
```



内容

```
hello? i am oracle.
```



確認

```
[oracle@db19 share1]$ ls -la
total 9
drwx------ 2 oracle 4294967294 4096 Feb 21 14:58 .
drwx------ 5 oracle oinstall   4096 Feb 21 14:58 ..
-rw-r--r-- 1 oracle 4294967294   20 Feb 21 14:58 iamoracle.txt
[oracle@db19 share1]$
```



確認

```
[oracle@db19 share1]$ cat iamoracle.txt 
hello? i am oracle.
[oracle@db19 share1]$
```



Windows 側から確認すると、txt ファイルが作成されています

![1582297215067.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/5e49c782-ba2c-073a-5c94-be287d34ae82.png)



ファイルを開いてみます

![1582297260963.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/467c6b71-0fb1-3ff0-547c-9e91bf145ecf.png)



Windows 側からセキュリティを確認

![1582297390423.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/efce59ec-d771-3948-52c2-ac2bdce5eb20.png)


# fstab の設定

Database Cloud Service の仮想マシンを再起動したときに、自動的に Windows Server の NFS サーバー をマウントする設定を行います。
自動的にマウントする設定を行うことで、Database Cloud Service を起動する前に、Windows Server の NFS サーバーを起動しておかなくてはいけない順序の制限が発生してしまいます。
この順序の制限が問題ないことを認識したうえで、fstab の設定を行ないます。



OCI の Database Cloud Service に root でログインします

```
[opc@jumpbox ~]$ ssh opc@10.100.1.6
Last login: Sat Feb 22 03:13:49 2020 from 10.100.0.2
[opc@db19 ~]$ sudo su -
Last login: Sat Feb 22 03:21:46 UTC 2020
[root@db19 ~]# 
```



fstab を編集します

```
vim /etc/fstab
```



以下を末尾に追加します

```
10.100.0.3:/share1     /home/oracle/share1   nfs    defaults 0 0
```



確認します

```
[root@db19 ~]# cat /etc/fstab 

/dev/mapper/VolGroupSys4-LogVolRoot /                       ext4    defaults,_netdev        1 1
LABEL=bootfs             /boot                  ext4    defaults        1 2
LABEL=bootefi             /boot/efi             vfat    defaults        1 2
/dev/mapper/VolGroupSys4-LogVolSwap swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
UUID="37d97574-ee4f-482c-84fc-93d71a2fbace" /u01 ext4  defaults 0 0

10.100.0.3:/share1     /home/oracle/share1   nfs    defaults 0 0
[root@db19 ~]#
```



umount した後に、mount コマンドを実行して、fstab が有効に指定されているか確認します

```
[root@db19 ~]# umount /home/oracle/share1/
[root@db19 ~]# mount /home/oracle/share1/
```



確認します

```
[root@db19 ~]# mount | grep -i share1
10.100.0.3:/share1 on /home/oracle/share1 type nfs (rw,relatime,vers=3,rsize=32768,wsize=32768,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.100.0.3,mountvers=3,mountport=2049,mountproto=udp,local_lock=none,addr=10.100.0.3)
[root@db19 ~]#
```



仮想マシンを再起動して、再起動後でもマウントされていることを確認します

```
shutdown -r now
```




# 文字コードの話

今回の記事に限った話ではないですが、Linux と Windows でファイルを共有する際には文字コードと改行コードに注意が必要です。
Linux 側でファイルを作成すると、よく使われる OS の Default では、文字コードが UTF-8 になり、改行コード LF となることが多いです。
Windows 側で ファイルを読み取るときには、何も気にしないと 文字コード SJIS で読み取りを行うことも多いため、文字化けしてしまいます。文字コードと改行コードを指定して内容を読み取る必要があります。



# 参考URL

https://www.server-world.info/query?os=Windows_Server_2016&p=nfs

http://pcknowhow.seesaa.net/article/198557987.html

ユーザーマッピングについて
https://docs.microsoft.com/ja-jp/archive/blogs/askcorejp/windows-server-2012-nfs