This post is also available in:
Series: Oracle RAC 12.2 – Complete Installation on VMware Workstation
📌 About this series: This guide covers Oracle RAC 12c, which is out of support. The goal is to document learning and revisit concepts – not to recommend this version for production. Read the full context in the series overview →
📋 This series — Oracle RAC 12.2 on VMware Workstation:
⚙️ Prerequisite: Post 1 completed – VMware configured and Openfiler with iSCSI LUNs ready.
Create the orclrac1 VM
Create the VM in VMware
File → New Virtual Machine → Custom (advanced) → Next
→ Hardware compatibility: select your installed VMware Workstation version → Next
→ I will install the operating system later → Next
→ Guest OS: Linux | Oracle Linux 64-bit → Next
→ Name: orclrac1
→ Location: /vms01/oracle/orclrac1/
→ Processors: 2 sockets × 2 cores → Next
→ Memory: 8192 MB → Next
→ Network: Custom → /dev/vmnet0 (public) → Next
→ I/O Controller: LSI Logic → Next
→ Disk: SCSI | 60 GB | Single file → Next
→ FinishAdjust Hardware
With the VM created and powered off, adjust the following in Settings:
| Item | Configuration |
|---|---|
| Memory | 8192 MB + check Reserve all guest memory |
| Processors | 2 × 2 cores + check Virtualize VT-x/AMD-V |
| Network Adapter | Custom → /dev/vmnet0 (public) |
| Network Adapter 2 (add) | Custom → /dev/vmnet1 (interconnect) |
| Network Adapter 3 (add) | Custom → /dev/vmnet2 (iSCSI) |
| Hard Disk 2 (add) | 100 GB – SCSI 0:1 – for /u01 |
To add NICs and disk: Add → Network Adapter / Add → Hard Disk.
Edit orclrac1.vmx
Before powering on the VM, add time sync control and UUID entries to the .vmx file. Check first to avoid duplicates:
grep "EnableUUID\|time.synchronize" /vms01/oracle/orclrac1/orclrac1.vmxIf not present, add:
cat >> /vms01/oracle/orclrac1/orclrac1.vmx << 'EOF'
time.synchronize.continue = "FALSE"
time.synchronize.restore = "FALSE"
time.synchronize.resume.disk = "FALSE"
time.synchronize.shrink = "FALSE"
time.synchronize.tools.startup = "FALSE"
disk.EnableUUID = "TRUE"
EOF⚠️ Disabling time sync is mandatory for RAC. VMware Tools syncing the clock independently can cause drift between nodes, which may cause Clusterware to evict a node from the cluster.
⚠️ Duplicate entries in the
.vmxfile prevent the VM from starting. Always check before adding.
Install Oracle Linux 7.6
Mount the ISO OracleLinux-R7-U6-Server-x86_64-dvd.iso and power on the VM. The installer displays an Installation Summary with the following sections to configure:
| Screen | Configuration |
|---|---|
| Date & Time | Select your region and city. Network Time: OFF |
| Keyboard | English (US) – already selected by default |
| Language Support | English (United States) – already selected by default |
| Installation Source | Local media – do not change |
| Software Selection | Minimal Install |
| Installation Destination | Select only sda (60 GB) – sdb must remain unchecked. Partitioning: Automatically configure |
| Kdump | Uncheck Enable kdump |
| Network & Host Name | Do not configure network – only set hostname: orclrac1.oracle.local → Apply |
| Security Policy | Apply security policy: OFF |
| Root Password | Strong password |
| User Creation | Do not create a user |
Click Begin Installation. Wait for completion and reboot.
Enable Temporary Network via nmtui
💡 Why do this now? The installation was completed without configuring the network to keep the process simple.
nmtuienables the interface temporarily via DHCP – just to get SSH access to the server. From this point on, all commands are run remotely without needing to type anything in the VM console.
In the orclrac1 console, run:
nmtuiNavigate to: Edit a connection → ens33 → check Automatically connect → OK
Then: Activate a connection → select ens33 → Activate → Back → Quit
Get the IP assigned by DHCP:
ip addr show ens33Note the IP and connect via SSH from the host:
ssh root@<dhcp-ip>Configure Oracle Linux on orclrac1
From this point all commands are run over SSH.
Fix Interface Names and Configure IPs
Step 1 – Apply GRUB fix:
sed -i 's/GRUB_CMDLINE_LINUX="/GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 /' \
/etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfgStep 2 – Remove old interface files and create new ones:
rm -f /etc/sysconfig/network-scripts/ifcfg-ens33 \
/etc/sysconfig/network-scripts/ifcfg-ens34 \
/etc/sysconfig/network-scripts/ifcfg-ens35
cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << 'EOF'
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.15.170
NETMASK=255.255.255.0
GATEWAY=192.168.15.1
DNS1=8.8.8.8
DEFROUTE=yes
IPV6INIT=no
EOF
cat > /etc/sysconfig/network-scripts/ifcfg-eth1 << 'EOF'
TYPE=Ethernet
BOOTPROTO=none
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=10.10.10.1
NETMASK=255.255.255.0
DEFROUTE=no
IPV6INIT=no
EOF
cat > /etc/sysconfig/network-scripts/ifcfg-eth2 << 'EOF'
TYPE=Ethernet
BOOTPROTO=none
NAME=eth2
DEVICE=eth2
ONBOOT=yes
IPADDR=192.168.20.1
NETMASK=255.255.255.0
DEFROUTE=no
IPV6INIT=no
EOFStep 3 – Reboot:
rebootAfter rebooting, connect via SSH using the fixed IP and validate:
ssh root@192.168.15.170
ip addr show eth0 # 192.168.15.170
ip addr show eth1 # 10.10.10.1
ip addr show eth2 # 192.168.20.1Mount the /u01 Disk
lsblkStart fdisk on /dev/sdb:
fdisk /dev/sdbWhen the prompt appears, enter the following sequence:
| Key | Action |
|---|---|
n | New partition |
p | Primary type |
1 | Partition number |
| Enter | Accept first sector (default) |
| Enter | Accept last sector (default – uses the entire disk) |
w | Write and exit |
mkfs.xfs /dev/sdb1
mkdir -p /u01
blkid /dev/sdb1 # note the UUID
echo "UUID=<uuid> /u01 xfs defaults 0 0" >> /etc/fstab
mount -a
df -h /u01Configure Hostname and /etc/hosts
hostnamectl set-hostname orclrac1.oracle.localcat >> /etc/hosts << 'EOF'
192.168.15.170 orclrac1 orclrac1.oracle.local
192.168.15.171 orclrac2 orclrac2.oracle.local
192.168.15.180 orclrac1-vip orclrac1-vip.oracle.local
192.168.15.181 orclrac2-vip orclrac2-vip.oracle.local
10.10.10.1 orclrac1-priv orclrac1-priv.oracle.local
10.10.10.2 orclrac2-priv orclrac2-priv.oracle.local
192.168.15.190 orclrac-scan orclrac-scan.oracle.local
192.168.15.191 orclrac-scan orclrac-scan.oracle.local
192.168.15.192 orclrac-scan orclrac-scan.oracle.local
192.168.20.10 openfiler openfiler.oracle.local
EOFInstall Prerequisite Packages
yum install -y oracle-database-server-12cR2-preinstall
yum install -y open-vm-tools iscsi-initiator-utils chronyKernel Parameters
grep "shmmax" /etc/sysctl.confIf not already configured by the preinstall package:
cat >> /etc/sysctl.conf << 'EOF'
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 4294967295
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
vm.nr_hugepages = 2048
EOF
sysctl -pShell Limits
cat >> /etc/security/limits.conf << 'EOF'
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft stack 10240
oracle hard stack 32768
oracle hard memlock 134217728
oracle soft memlock 134217728
EOFCreate ASM Groups and Configure the oracle User
The preinstall package already creates the oracle user with basic groups. Here we only create the ASM groups:
groupadd -g 54327 asmdba
groupadd -g 54328 asmoper
groupadd -g 54329 asmadmin
usermod -a -G asmadmin,asmoper,asmdba oracle
echo "oracle:Welcome1" | chpasswd
id oracleOracle Directory Structure
mkdir -p /u01/app/12.2.0/grid
mkdir -p /u01/app/oracle/product/12.2.0/dbhome_1
mkdir -p /u01/stage
chown -R oracle:oinstall /u01
chmod -R 775 /u01Environment Variables
cat >> /home/oracle/.bash_profile << 'EOF'
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/12.2.0/grid
export ORACLE_SID=+ASM1
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export NLS_DATE_FORMAT='DD/MM/YYYY HH24:MI:SS'
umask 022
alias grid_env='export ORACLE_HOME=/u01/app/12.2.0/grid; export ORACLE_SID=+ASM1; export PATH=$ORACLE_HOME/bin:$PATH; echo "Grid Home: $ORACLE_HOME"'
alias db_env='export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1; export ORACLE_SID=ORCL1; export PATH=$ORACLE_HOME/bin:$PATH; echo "DB Home: $ORACLE_HOME"'
EOFDisable Firewall and SELinux
systemctl disable firewalld
systemctl stop firewalld
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/configConfigure Chrony
systemctl enable chronyd
systemctl start chronyd
chronyc trackingReboot and Validate
rebootsestatus # permissive
df -h /u01 # ~100 GB
ip addr show eth0 # 192.168.15.170
hostname # orclrac1.oracle.local
id oracle # confirm ASM groups
chronyc tracking # synchronizedClone orclrac1 → orclrac2
⚠️ orclrac1 must be completely powered off before cloning.
Right-click on orclrac1 → Manage → Clone
→ Full clone
→ Name: orclrac2
→ Location: /vms01/oracle/orclrac2/
→ FinishRegenerate orclrac2 MAC Addresses
Settings → Network Adapter → Advanced → Generate
Settings → Network Adapter 2 → Advanced → Generate
Settings → Network Adapter 3 → Advanced → GenerateAdjust orclrac2 – Hostname, IPs, and SIDs
Power on orclrac2 and run as root:
hostnamectl set-hostname orclrac2.oracle.local
sed -i 's/192.168.15.170/192.168.15.171/' \
/etc/sysconfig/network-scripts/ifcfg-eth0
sed -i 's/10.10.10.1/10.10.10.2/' \
/etc/sysconfig/network-scripts/ifcfg-eth1
sed -i 's/192.168.20.1/192.168.20.2/' \
/etc/sysconfig/network-scripts/ifcfg-eth2
systemctl restart network
ip addr show eth0 # 192.168.15.171
ip addr show eth1 # 10.10.10.2
ip addr show eth2 # 192.168.20.2
hostname # orclrac2.oracle.localAdjust SIDs:
sed -i 's/ORACLE_SID=+ASM1/ORACLE_SID=+ASM2/' /home/oracle/.bash_profile
sed -i 's/ORACLE_SID=ORCL1/ORACLE_SID=ORCL2/' /home/oracle/.bash_profileConfigure iSCSI Initiator – orclrac1
systemctl enable iscsid && systemctl start iscsid
echo "InitiatorName=iqn.2024-01.local.oracle:orclrac1" \
> /etc/iscsi/initiatorname.iscsi
ping -c 3 192.168.20.10
iscsiadm -m discovery -t sendtargets -p 192.168.20.10Discovery may return two targets – the iSCSI network (
192.168.20.10) and the management network (192.168.15.175). Connect only through the iSCSI IP.
iscsiadm -m node \
-T iqn.2006-01.com.openfiler:rac-storage \
-p 192.168.20.10 --login
iscsiadm -m node \
-T iqn.2006-01.com.openfiler:rac-storage \
-p 192.168.20.10 --op update \
-n node.startup -v automatic
systemctl restart iscsid iscsiCheck how many disks appear:
ls -la /dev/disk/by-path/ | grep iscsiIf 6 disks appear – correct, proceed. If 12 appear, disconnect the management network target:
iscsiadm -m node \
-T iqn.2006-01.com.openfiler:rac-storage \
-p 192.168.15.175 --logout
iscsiadm -m node \
-T iqn.2006-01.com.openfiler:rac-storage \
-p 192.168.15.175 --op deleteCheck again. Expected output with 6 disks:
ip-192.168.20.10:3260-iscsi-...-lun-0 -> ../../sdc
ip-192.168.20.10:3260-iscsi-...-lun-1 -> ../../sdd
ip-192.168.20.10:3260-iscsi-...-lun-2 -> ../../sde
ip-192.168.20.10:3260-iscsi-...-lun-3 -> ../../sdf
ip-192.168.20.10:3260-iscsi-...-lun-4 -> ../../sdg
ip-192.168.20.10:3260-iscsi-...-lun-5 -> ../../sdhConfigure iSCSI Initiator – orclrac2
systemctl enable iscsid && systemctl start iscsid
echo "InitiatorName=iqn.2024-01.local.oracle:orclrac2" \
> /etc/iscsi/initiatorname.iscsi
iscsiadm -m discovery -t sendtargets -p 192.168.20.10
iscsiadm -m node \
-T iqn.2006-01.com.openfiler:rac-storage \
-p 192.168.20.10 --login
iscsiadm -m node \
-T iqn.2006-01.com.openfiler:rac-storage \
-p 192.168.20.10 --op update \
-n node.startup -v automatic
systemctl restart iscsid iscsiCheck how many disks appear:
ls -la /dev/disk/by-path/ | grep iscsiIf 12 disks appear instead of 6, follow the same management network logout procedure done on orclrac1.
Validate the Complete Environment
Network Connectivity
From orclrac1:
ping -c 3 192.168.15.171 # orclrac2 public
ping -c 3 10.10.10.2 # orclrac2 interconnect
ping -c 3 192.168.20.10 # openfilerFrom orclrac2:
ping -c 3 192.168.15.170 # orclrac1 public
ping -c 3 10.10.10.1 # orclrac1 interconnect
ping -c 3 192.168.20.10 # openfilerInterconnect Latency
Run on each node separately:
ping -c 50 10.10.10.2 | tail -2
ping -c 50 10.10.10.1 | tail -2Expected result – avg below 1ms is required for Cache Fusion to work correctly:
rtt min/avg/max/mdev = 0.121/0.198/0.312/0.045 msSSH Equivalency
Run as oracle on both nodes:
On orclrac1:
su - oracle
ssh-keygen -t rsa -N ''
ssh-copy-id oracle@orclrac1
ssh-copy-id oracle@orclrac2On orclrac2:
su - oracle
ssh-keygen -t rsa -N ''
ssh-copy-id oracle@orclrac1
ssh-copy-id oracle@orclrac2Validate on both nodes:
ssh orclrac1 date && ssh orclrac2 date
ssh orclrac1-priv date && ssh orclrac2-priv dateOn the first connection via
-privhostname, SSH asks to confirm the key – typeyes.
⚠️ Important: Validation must be done on both nodes and in both directions. The Grid OUI runs scripts remotely in both directions during installation – any failure immediately stops the installer.
Next Up
In Post 3 we’ll install Grid Infrastructure 12.2 with all 19 OUI screens documented and the most common errors you’ll encounter.

1 Comment
Pingback: Oracle RAC 12.2 — VMware and Openfiler iSCSI | ExecuteStep