iSCSI共有ストレージとBIND DNSサーバを構築する

iSCSI共有ストレージとBIND DNSサーバを構築する

この記事でやること

第3回では、Oracle RACに必要な2つのインフラ基盤を構築します。

作業対象
iSCSIイニシエータのインストール・接続設定ol8-rac19-21 / ol8-rac19-22
iSCSIターゲットの設定ol8-iscsi-23
BIND DNSサーバ構築ol8-iscsi-23
DNSクライアント設定(dns-search追加)ol8-rac19-21 / ol8-rac19-22

リブート後の注意: 第2回末尾のreboot後は /dev/cdrom のマウントが解除されています。dnf install を実行する前に各ノードで再マウントしてください。

mount /dev/cdrom /media

事前準備:スナップショットの取得

作業開始前に、3台全VMのスナップショットを取得しておきます。article-02完了時点(OS初期設定済み)は、万が一の際に戻りたいクリーンな状態です。

Proxmox管理画面で各VMを選択し、「スナップショット」→「スナップショットを取る」から取得します。

VMスナップショット名(例)
ol8-rac19-21after-os-setup
ol8-rac19-22after-os-setup
ol8-iscsi-23after-os-setup

スナップショット取得時はVMを停止する必要はありません。実行中のまま取得できます(メモリ状態も含めて保存したい場合は「RAMの状態を含む」にチェックを入れますが、通常はディスクのみで十分です)。


iSCSI設定

iSCSIネットワークの選定

本環境では3つのVLANがあります。iSCSIに使用するVLANは以下の理由でVLAN10(Public)を選択しています。

VLAN用途iSCSIに使うと
VLAN10(10.0.10.0/24)Oracle Public / データ通信適切(データ系ネットワーク)
VLAN20(172.16.20.0/24)RACインターコネクトNG(Cache Fusion専用)
VLAN30(192.168.30.0/24)管理(SSH)非推奨

本来は専用のストレージVLANを用意するのがベストプラクティスですが、本環境は3VLAN構成のためVLAN10を使用します。Management LAN(VLAN30)をiSCSIに使うと、ストレージI/Oが大量に流れた際にSSHの管理接続が影響を受けるリスクがあります。

iSCSIイニシエータのインストール(ノード1・2)

iSCSIイニシエータとは、iSCSIストレージ(ターゲット)にネットワーク経由で接続するクライアント側のコンポーネントです。RACノード2台にインストールします。

# ホストとユーザの確認
hostname && whoami

# インストール済みか確認(インストール済みの場合はスキップ可)
rpm -q iscsi-initiator-utils

# iSCSIイニシエータパッケージをインストール
dnf install -y iscsi-initiator-utils

# iscsidデーモンを起動(iSCSI接続の維持・再接続を管理するバックグラウンドプロセス)
systemctl start iscsid

# システム起動時にiscsidが自動起動するよう設定
systemctl enable iscsid

# 起動状態の確認(Active: active (running) になっていること)
systemctl status iscsid --no-pager

インストール後、このノードのiSCSIイニシエータ名(IQN)を確認します。IQNはiSCSIターゲット側でACL登録する際に必要になります。

cat /etc/iscsi/initiatorname.iscsi

実行例:

root@ol8-rac19-21:~# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1988-12.com.oracle:cbea25b36a28

root@ol8-rac19-22:~# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1988-12.com.oracle:c28044598d3c

確認したIQNは次の手順(ターゲット設定のACL登録)で使用するため、メモしておいてください。

ノードイニシエータIQN
ol8-rac19-21(確認した値を記入)
ol8-rac19-22(確認した値を記入)

iSCSIターゲットの設定(ストレージノード)

iSCSIターゲットとは、ディスクをネットワーク経由で提供するサーバ側のコンポーネントです。ストレージノード(ol8-iscsi-23)に設定します。

# ホストとユーザの確認
hostname && whoami

# iSCSIターゲット設定ツール targetcli をインストール
dnf install -y targetcli

# targetサービスを起動(targetcliで定義した設定を有効化する)
systemctl start target

# システム起動時にtargetが自動起動するよう設定(再起動後も共有ディスクが公開され続ける)
systemctl enable target

# 起動状態の確認(Active: active (exited) になっていること)
systemctl status target --no-pager

targetcliで共有ディスクを定義します。/dev/sdb(ASM DATA用)と /dev/sdc(ASM RECO用)をRACノードに公開します。

# バックストアの作成(iSCSIで公開するディスクを登録)
targetcli /backstores/block create name=lun0 dev=/dev/sdb
targetcli /backstores/block create name=lun1 dev=/dev/sdc

# ターゲットIQNの定義(このストレージノードのiSCSI識別名)
targetcli /iscsi create iqn.2026-04.lab.internal:ol8-iscsi-23

# LUNとバックストアの紐づけ
targetcli /iscsi/iqn.2026-04.lab.internal:ol8-iscsi-23/tpg1/luns create /backstores/block/lun0
targetcli /iscsi/iqn.2026-04.lab.internal:ol8-iscsi-23/tpg1/luns create /backstores/block/lun1

# ACL登録(接続を許可するイニシエータIQNを登録)
# ↓ 前の手順で確認したIQNに書き換えてから実行する
INIT_IQN_NODE1="iqn.1988-12.com.oracle:cbea25b36a28"   # ol8-rac19-21
INIT_IQN_NODE2="iqn.1988-12.com.oracle:c28044598d3c"   # ol8-rac19-22

targetcli /iscsi/iqn.2026-04.lab.internal:ol8-iscsi-23/tpg1/acls create ${INIT_IQN_NODE1}
targetcli /iscsi/iqn.2026-04.lab.internal:ol8-iscsi-23/tpg1/acls create ${INIT_IQN_NODE2}

# ACL登録確認
targetcli /iscsi/iqn.2026-04.lab.internal:ol8-iscsi-23/tpg1/acls ls

# 設定を保存(保存しないと再起動後に設定が消える)
targetcli saveconfig

設定全体を確認します。

targetcli ls /

iSCSIイニシエータの接続(ノード1・2)

ストレージノードのターゲット設定が完了したら、RACノードからiSCSI接続します。

# ホストとユーザの確認
hostname && whoami

# ターゲットを検出(ストレージノードのPublic IPを指定)
iscsiadm -m discovery -t st -p 10.0.10.23:3260

# ターゲットにログイン
iscsiadm -m node -T iqn.2026-04.lab.internal:ol8-iscsi-23 -p 10.0.10.23:3260 -l

# ディスクが認識されていることを確認(sdb・sdcが追加されていること)
lsblk

実行例(ノード1):

root@ol8-rac19-21:~# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    0   150G  0 disk
...
sdb           8:16   0   100G  0 disk
sdc           8:32   0   100G  0 disk

sdb(100 GB)と sdc(100 GB)が追加されていればiSCSI接続成功です。ノード1・2の両方で確認してください。


BIND DNSサーバ構築

なぜDNSが必要か

Oracle RACでは以下の理由からDNSが必須です。

  • SCAN(Single Client Access Name) は3つのIPアドレスをラウンドロビンで解決する必要があり、/etc/hosts では実現できません
  • GIインストーラー(gridSetup.sh)はインストール前にSCAN名のDNS解決チェックを実施します。DNSが正しく設定されていないとインストールが進みません

BINDはストレージノード(ol8-iscsi-23)に構築します。

BINDインストール

# ホストとユーザの確認
hostname && whoami

# bind・bind-utilsをインストール
dnf install -y bind bind-utils

# インストール確認
rpm -q bind bind-utils

named.confの作成

デフォルトの /etc/named.conf をバックアップして置き換えます。

設定のポイントは以下のとおりです。

設定項目内容
acl internal-networkクエリを受け付けるネットワーク範囲を定義。3つのVLAN(VLAN10/20/30)を対象とし、外部からのクエリは受け付けない
listen-on port 53 { any; }全NICでDNSクエリを受信(VLAN10・20・30いずれからも応答できる)
listen-on-v6 { none; }IPv6は使用しないため無効化
allow-querylocalhostinternal-network からのクエリのみ受け付ける
recursion yes自ゾーン以外のドメイン(例: google.com)への問い合わせも外部に転送して解決する
ゾーン定義正引き1件(internal)と逆引き3件(VLAN10/20/30)を定義。ゾーンファイルは次の手順で作成する
# ホストとユーザの確認
hostname && whoami

# バックアップ取得
work_date=$(date +%Y%m%d)
cp -p /etc/named.conf{,.${work_date}}

# named.confを作成
cat > /etc/named.conf << 'EOF'
# 内部ネットワークのACL定義(クエリを受け付けるネットワーク範囲)
acl internal-network {
        10.0.10.0/24;
        172.16.20.0/24;
        192.168.30.0/24;
};

options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { none; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        secroots-file   "/var/named/data/named.secroots";
        recursing-file  "/var/named/data/named.recursing";
        allow-query     { localhost; internal-network; };
        recursion yes;
        dnssec-enable yes;
        dnssec-validation yes;
        managed-keys-directory "/var/named/dynamic";
        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
        include "/etc/crypto-policies/back-ends/bind.config";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

# ゾーン定義
zone "internal" IN {
    type master;
    file "internal.zone";
    allow-update { none; };
};

zone "10.0.10.in-addr.arpa" IN {
    type master;
    file "10.0.10.db";
    allow-update { none; };
};

zone "20.16.172.in-addr.arpa" IN {
    type master;
    file "172.16.20.db";
    allow-update { none; };
};

zone "30.168.192.in-addr.arpa" IN {
    type master;
    file "192.168.30.db";
    allow-update { none; };
};
EOF

# 差分確認
diff /etc/named.conf{,.${work_date}}

# 構文チェック(何も出力されなければOK)
named-checkconf /etc/named.conf

ゾーンファイルの作成

正引き1ファイルと逆引き3ファイルを作成します。各ファイル作成後に構文チェックを実施します。

正引きゾーン(internal.zone)

ホスト名からIPアドレスを引くゾーンです。SCANの3エントリを同じホスト名で登録することでラウンドロビンを実現します。

cat > /var/named/internal.zone << 'EOF'
$TTL 86400
@       IN      SOA     ol8-iscsi-23.internal. root.internal. (
                            2025092901    ; Serial(更新時はインクリメントする)
                            3600          ; Refresh
                            1800          ; Retry
                            604800        ; Expire
                            86400 )       ; Minimum

       IN      NS      ol8-iscsi-23.internal.
       IN A    10.0.10.23

; パブリックネットワーク
ol8-rac19-21        IN A    10.0.10.21
ol8-rac19-22        IN A    10.0.10.22
ol8-iscsi-23        IN A    10.0.10.23
ol8-rac19-vip-24    IN A    10.0.10.24
ol8-rac19-vip-25    IN A    10.0.10.25
ol8-rac19-scan      IN A    10.0.10.26
                    IN A    10.0.10.27
                    IN A    10.0.10.28

; プライベートネットワーク(インターコネクト)
ol8-rac19-priv-21   IN A    172.16.20.21
ol8-rac19-priv-22   IN A    172.16.20.22
ol8-iscsi-priv-23   IN A    172.16.20.23

; 管理ネットワーク
ol8-rac19-mgmt-21   IN A    192.168.30.21
ol8-rac19-mgmt-22   IN A    192.168.30.22
ol8-iscsi-mgmt-23   IN A    192.168.30.23
EOF

# 構文チェック
named-checkzone internal /var/named/internal.zone
# → OK

パブリック逆引き(10.0.10.db)

IPアドレスからホスト名を引く逆引きゾーンです。

cat > /var/named/10.0.10.db << 'EOF'
$TTL 86400
@       IN      SOA     ol8-iscsi-23.internal. root.internal. (
                            2025092901  ; Serial
                            3600        ; Refresh
                            1800        ; Retry
                            604800      ; Expire
                            86400 )     ; Minimum

       IN      NS      ol8-iscsi-23.internal.

21      IN      PTR     ol8-rac19-21.internal.
22      IN      PTR     ol8-rac19-22.internal.
23      IN      PTR     ol8-iscsi-23.internal.
24      IN      PTR     ol8-rac19-vip-24.internal.
25      IN      PTR     ol8-rac19-vip-25.internal.
26      IN      PTR     ol8-rac19-scan.internal.
27      IN      PTR     ol8-rac19-scan.internal.
28      IN      PTR     ol8-rac19-scan.internal.
EOF

# 構文チェック
named-checkzone 10.0.10.in-addr.arpa /var/named/10.0.10.db
# → OK

プライベート逆引き(172.16.20.db)

cat > /var/named/172.16.20.db << 'EOF'
$TTL 86400
@       IN      SOA     ol8-iscsi-23.internal. root.internal. (
                            2025092901  ; Serial
                            3600        ; Refresh
                            1800        ; Retry
                            604800      ; Expire
                            86400 )     ; Minimum

       IN      NS      ol8-iscsi-23.internal.

21      IN      PTR     ol8-rac19-priv-21.internal.
22      IN      PTR     ol8-rac19-priv-22.internal.
23      IN      PTR     ol8-iscsi-priv-23.internal.
EOF

# 構文チェック
named-checkzone 20.16.172.in-addr.arpa /var/named/172.16.20.db
# → OK

管理ネットワーク逆引き(192.168.30.db)

cat > /var/named/192.168.30.db << 'EOF'
$TTL 86400
@       IN      SOA     ol8-iscsi-23.internal. root.internal. (
                            2025092901  ; Serial
                            3600        ; Refresh
                            1800        ; Retry
                            604800      ; Expire
                            86400 )     ; Minimum

       IN      NS      ol8-iscsi-23.internal.

21      IN      PTR     ol8-rac19-mgmt-21.internal.
22      IN      PTR     ol8-rac19-mgmt-22.internal.
23      IN      PTR     ol8-iscsi-mgmt-23.internal.
EOF

# 構文チェック
named-checkzone 30.168.192.in-addr.arpa /var/named/192.168.30.db
# → OK

BIND起動と動作確認

# ホストとユーザの確認
hostname && whoami

# BINDを起動・自動起動設定
systemctl start named
systemctl enable named

# 起動確認(Active: active (running) になっていること)
systemctl status named --no-pager

ストレージノード自身からDNSの動作を確認します。

# 正引きテスト(ホスト名 → IP)
dig ol8-rac19-21.internal @127.0.0.1
# 期待値:
# ol8-rac19-21.internal.  86400  IN  A  10.0.10.21

# 逆引きテスト(IP → ホスト名)
dig -x 10.0.10.21 @127.0.0.1
# 期待値:
# 21.10.0.10.in-addr.arpa.  86400  IN  PTR  ol8-rac19-21.internal.

# SCANラウンドロビン確認(3つのIPが全て返ること)
dig ol8-rac19-scan.internal @127.0.0.1
# 期待値:
# ol8-rac19-scan.internal.  86400  IN  A  10.0.10.26
# ol8-rac19-scan.internal.  86400  IN  A  10.0.10.27
# ol8-rac19-scan.internal.  86400  IN  A  10.0.10.28

ラウンドロビンの動作確認を行います。BINDはクエリのたびにIPの返却順序を循環させます。同じホスト名に対して繰り返しクエリを発行し、毎回先頭のIPが変わることを確認します。

for i in 1 2 3; do dig +short ol8-rac19-scan.internal @127.0.0.1; echo "---"; done

実行例(1回目は .26 から始まり、2回目は .27、3回目は .28 と先頭が循環する):

10.0.10.26
10.0.10.27
10.0.10.28
---
10.0.10.27
10.0.10.28
10.0.10.26
---
10.0.10.28
10.0.10.26
10.0.10.27
---

3つのIPが順番にローテーションしていれば、ラウンドロビンは正常に機能しています。

DNSクライアント設定(ノード1・2)

第2回でDNSサーバのIPアドレス(ipv4.dns)は設定済みです。BINDが起動したタイミングで、検索ドメイン(ipv4.dns-search)を追加します。

dns-search を設定することで、FQDNではなく短縮ホスト名(ol8-rac19-22 など)でも名前解決できるようになります。

# ホストとユーザの確認
hostname && whoami

# bind-utilsをインストール(dig・nslookupコマンドに必要)
dnf install -y bind-utils

# Public NIC(ens18)に検索ドメインを追加
nmcli connection modify ens18 ipv4.dns-search "internal"
nmcli connection up ens18

# 管理LAN NIC(ens20)に検索ドメインを追加
nmcli connection modify ens20 ipv4.dns-search "internal"
nmcli connection up ens20

# resolv.confを確認(nameserverとsearch internalが入っていること)
cat /etc/resolv.conf

RACノードからの名前解決テストを実施します。

# 正引き:ノード・VIP
dig +short ol8-rac19-21.internal   # → 10.0.10.21
dig +short ol8-rac19-22.internal   # → 10.0.10.22
dig +short ol8-iscsi-23.internal   # → 10.0.10.23
dig +short ol8-rac19-vip-24.internal  # → 10.0.10.24
dig +short ol8-rac19-vip-25.internal  # → 10.0.10.25

# 正引き:SCAN(3つのIPが返ること)
dig +short ol8-rac19-scan.internal

# 正引き:インターコネクト
dig +short ol8-rac19-priv-21.internal  # → 172.16.20.21
dig +short ol8-rac19-priv-22.internal  # → 172.16.20.22

# 逆引き
dig +short -x 10.0.10.21  # → ol8-rac19-21.internal.
dig +short -x 10.0.10.22  # → ol8-rac19-22.internal.

# SCANラウンドロビン確認
for i in 1 2 3; do dig +short ol8-rac19-scan.internal; echo "---"; done

GIインストール前の必須確認: GIインストーラー(gridSetup.sh)はインストール前にSCAN名のDNS解決チェックを実施します。第4回に進む前に、SCANの3IPが正しく返ることを必ず確認してください。


まとめ

この記事では以下を完了しました。

  • iSCSI共有ストレージの構築(ターゲット設定・イニシエータ接続)
  • BIND DNSサーバの構築(正引き・逆引き4ゾーン・SCANラウンドロビン)
  • RACノードへのDNSクライアント設定(dns-search追加・疎通確認)

次の記事では、GIインストール前準備(ユーザー・SSH・udev・HugePages設定)とGrid Infrastructureのインストールを行います。