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 targetcli with iSCSI LUNs ready on vpslab.
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 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/vmnet0 (iSCSI — same vmnet0) |
| Hard Disk 2 (add) | 100 GB — SCSI 0:1 — for /u01 |
Edit orclrac1.vmx
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 and lead Clusterware to evict a node.
⚠️ Duplicate entries in
.vmxprevent the VM from starting. Always check before adding.
Install Oracle Linux 7.9
Mount the ISO and power on the VM. The installer shows an Installation Summary with these sections:
| Screen | Configuration |
|---|---|
| Date & Time | Select your region and city. Network Time: OFF |
| Keyboard | English (US) — already selected |
| Language Support | English (United States) — already selected |
| Installation Source | Local media — do not change |
| Software Selection | Minimal Install |
| Installation Destination | Select only sda (60 GB) — sdb unchecked. Partitioning: Automatically configure |
| Kdump | Uncheck Enable kdump |
| Network & Host Name | Do not configure network — 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.
nmtuienables the interface temporarily via DHCP — just to get SSH access. From this point all commands run remotely.
In the orclrac1 console:
nmtuiNavigate to: Edit a connection → ens33 → check Automatically connect → OK
Then: Activate a connection → ens33 → Activate → Back → Quit
ip addr show ens33Connect via SSH from the host:
ssh root@<dhcp-ip>Configure Oracle Linux on orclrac1
All commands from here 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.15.130
NETMASK=255.255.255.0
DEFROUTE=no
IPV6INIT=no
EOFStep 3 — Reboot:
rebootAfter rebooting, connect via SSH 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.15.130Mount the /u01 Disk
lsblkfdisk /dev/sdb| Key | Action |
|---|---|
n | New partition |
p | Primary type |
1 | Partition number |
| Enter | Accept first sector (default) |
| Enter | Accept last sector (default) |
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.15.3 vpslab vpslab.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 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
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 Swap
Oracle recommends at least 8 GB of swap for VMs with 8 GB of RAM. Run on both nodes to avoid OUI prerequisite warnings:
dd if=/dev/zero of=/swapfile bs=1M count=8192
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo "/swapfile swap swap defaults 0 0" >> /etc/fstab
free -hConfigure Chrony
Add external NTP servers before enabling the service. Both Grid and Database OUI validate synchronization with an external source — without this, NTP checks will fail during installation:
cat >> /etc/chrony.conf << 'EOF'
server 216.239.35.0 iburst
server 216.239.35.4 iburst
EOF
systemctl enable chronyd
systemctl restart chronyd
sleep 15
chronyc sourcesConfirm at least one source has * in the first column before proceeding:
^* 216.239.35.0 1 6 377 ...Reboot 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 sources # confirm *Clone 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.15.130/192.168.15.131/' \
/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.15.131
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.15.3
iscsiadm -m discovery -t sendtargets -p 192.168.15.3iscsiadm -m node \
-T iqn.2024-01.com.vpslab:rac-storage \
-p 192.168.15.3 --login
iscsiadm -m node \
-T iqn.2024-01.com.vpslab:rac-storage \
-p 192.168.15.3 --op update \
-n node.startup -v automatic
systemctl restart iscsid iscsiCheck how many disks appear:
ls -la /dev/disk/by-path/ | grep iscsiExpected output with 6 disks:
ip-192.168.15.3:3260-iscsi-iqn.2024-01.com.vpslab:rac-storage-lun-0 -> ../../sdc
ip-192.168.15.3:3260-iscsi-iqn.2024-01.com.vpslab:rac-storage-lun-1 -> ../../sdh
ip-192.168.15.3:3260-iscsi-iqn.2024-01.com.vpslab:rac-storage-lun-2 -> ../../sdg
ip-192.168.15.3:3260-iscsi-iqn.2024-01.com.vpslab:rac-storage-lun-3 -> ../../sdf
ip-192.168.15.3:3260-iscsi-iqn.2024-01.com.vpslab:rac-storage-lun-4 -> ../../sde
ip-192.168.15.3:3260-iscsi-iqn.2024-01.com.vpslab:rac-storage-lun-5 -> ../../sddConfigure 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.15.3
iscsiadm -m node \
-T iqn.2024-01.com.vpslab:rac-storage \
-p 192.168.15.3 --login
iscsiadm -m node \
-T iqn.2024-01.com.vpslab:rac-storage \
-p 192.168.15.3 --op update \
-n node.startup -v automatic
systemctl restart iscsid iscsi
ls -la /dev/disk/by-path/ | grep iscsiValidate 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.15.3 # vpslab iSCSIFrom orclrac2:
ping -c 3 192.168.15.170 # orclrac1 public
ping -c 3 10.10.10.1 # orclrac1 interconnect
ping -c 3 192.168.15.3 # vpslab iSCSIInterconnect Latency
ping -c 50 10.10.10.2 | tail -2
ping -c 50 10.10.10.1 | tail -2avg below 1ms is required for Cache Fusion to work correctly.
SSH Equivalency
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 date⚠️ Important: Validation must be done on both nodes and in both directions. The Grid OUI runs scripts remotely in both directions — 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.

5 Comments
Pingback: Oracle RAC 12.2 on VMware Workstation — Post 3: Grid Infrastructure Installation | Execute Step
Pingback: Oracle RAC 12.2 on VMware Workstation — Post 5: Final Validation and Quick Reference | Execute Step
Pingback: Oracle RAC 12.2 on VMware Workstation — Post 1: VMware Setup and iSCSI Target with targetcli | Execute Step
Pingback: Oracle RAC 12.2 on VMware Workstation — Post 4: Oracle Database Installation and DBCA | Execute Step
Pingback: Oracle RAC 12.2 on VMware Workstation — Series Overview | Execute Step