はじめに
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
サーバーマネージャーを開きます
新しい共有を選択します
NFS 共有 - 簡易を選びます
カスタムパスを任意の物を指定します
共有パスを Default のままとします
認証方法の指定です。サーバー認証なし のみチェックを入れます。
アクセス許可の方法を指定します。
- ホスト : Database Cloud Service の Private IP を指定
- 言語のエンコード : EUC-JP
- 共有のアクセス許可 : 読み取り/書き込み
次へ
このまま Default で設定
確認して、作成を押します
閉じる
画面に設定した内容が表示されています
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
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
確認
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
確認
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 ファイルが作成されています
ファイルを開いてみます
Windows 側からセキュリティを確認
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://docs.microsoft.com/ja-jp/archive/blogs/askcorejp/windows-server-2012-nfs