Help us understand the problem. What is going on with this article?

[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

新しい共有を選択します

1582287765805.png

NFS 共有 - 簡易を選びます

1582287787258.png

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

1582286643593.png

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

1582287860769.png

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

1582300190444.png

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

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

1582287486462.png

次へ

1582287511282.png

このまま Default で設定

1582287650565.png

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

1582287914045.png

閉じる

1582287939604.png

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

1582287952329.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

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

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

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

ファイルを開いてみます

1582297260963.png

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

1582297390423.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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした