How to Resolve MAC Address & UUID Conflicts When Cloning VMware VMs (CentOS/ESXi Best Practices)


2 views

Every VMware administrator has faced this scenario: You create a perfect golden image VM, clone it, and suddenly networking breaks. The core issue stems from VMware generating new MAC addresses during cloning while Linux maintains old network interface configurations.

When cloning VMs, VMware's vCenter/ESXi/Fusion:

1. Generates new UUID (bios.uuid) for the VM
2. Assigns new MAC addresses to vNICs
3. Preserves original VMX file configurations

Meanwhile, Linux systems (especially CentOS/RHEL) store hardware-specific network configurations in:

/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/udev/rules.d/70-persistent-net.rules

Before cloning, modify your master VM with these configurations:

# Remove HWADDR and UUID from ifcfg-eth0
sed -i '/^HWADDR=/d' /etc/sysconfig/network-scripts/ifcfg-eth0
sed -i '/^UUID=/d' /etc/sysconfig/network-scripts/ifcfg-eth0

# Clean up udev rules
rm -f /etc/udev/rules.d/70-persistent-net.rules

Create this script as /usr/local/sbin/vmware-netconfig:

#!/bin/bash
# Get current MAC from VMware tools
MAC=$(vmtoolsd --cmd 'info-get guestinfo.net.interfaces' | \
      grep -oE '([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}')

# Update ifcfg-eth0
sed -i "s/^DEVICE=.*/DEVICE=eth0/" /etc/sysconfig/network-scripts/ifcfg-eth0
echo "HWADDR=$MAC" >> /etc/sysconfig/network-scripts/ifcfg-eth0

# Regenerate udev rules
rm -f /etc/udev/rules.d/70-persistent-net.rules
udevadm trigger --action=add

systemctl restart network

Make it executable:

chmod +x /usr/local/sbin/vmware-netconfig

For vSphere environments:

1. Create a customization specification:
   - vCenter > Policies and Profiles > VM Customization Specifications
   - Enable "Generate New MAC Addresses"
   - Set Linux options to "Use Customization Script"

2. Add this to the "Post-Clone Script" section:
   #!/bin/sh
   grep -q '^INITRD_MODULES=' /etc/sysconfig/kernel || \
   echo 'INITRD_MODULES="vmxnet3"' >> /etc/sysconfig/kernel
   dracut -f

To handle VM UUID conflicts in automation scripts:

# Get current VM UUID
VMUUID=$(vmtoolsd --cmd 'info-get guestinfo.vm.uuid')

# Update applications that use UUID (like some database systems)
sed -i "s/old_uuid/$VMUUID/g" /etc/myapp/config.conf
1. Verify VMware Tools is running: systemctl status vmtoolsd
2. Check MAC assignment: vmtoolsd --cmd 'info-get guestinfo.net.interfaces'
3. Validate interface naming: ip -o link show
4. Review udev rules: ls -l /etc/udev/rules.d/
5. Test networking: ethtool -i eth0

When cloning Linux VMs in VMware environments (Fusion/ESXi/vSphere), we frequently encounter networking failures due to MAC address mismatches. The cloned VM receives a new MAC address from VMware, but the Linux network configuration retains the original MAC from the template VM.

# Typical error seen in /var/log/messages
device eth0 does not seem to be present, delaying initialization

Three critical elements contribute to this issue:

  • VMware Virtual Hardware: Generates new MACs/UUIDs during clone operations
  • Linux Network Scripts: /etc/sysconfig/network-scripts/ifcfg-eth0 contains stale MAC
  • udev Rules: Persistent network device naming gets disrupted

For modern Linux distributions (CentOS 7+), cloud-init provides the most elegant solution:

# /etc/cloud/cloud.cfg.d/99_network.cfg
network:
  version: 2
  ethernets:
    eth0:
      dhcp4: true
      match:
        macaddress: "00:0c:29:*"
      set-name: eth0

For legacy systems without cloud-init, implement this post-clone script:

#!/bin/bash
# /usr/local/bin/vmware-net-fix.sh

NEW_MAC=$(vmware-guestd --cmd 'info-get guestinfo.net.macaddr' | tr '[:upper:]' '[:lower:]')
INTERFACE=$(ip -o link show | awk -F': ' '/ether/ {print $2}' | head -1)

sed -i "/HWADDR/d" /etc/sysconfig/network-scripts/ifcfg-${INTERFACE}
echo "HWADDR=\"${NEW_MAC}\"" >> /etc/sysconfig/network-scripts/ifcfg-${INTERFACE}

rm -f /etc/udev/rules.d/70-persistent-net.rules
systemctl restart network

For enterprise environments using vCenter:

  1. Create a customization specification in vCenter
  2. Enable "Generate New MAC Addresses" in clone options
  3. Use the VMware Guest Operations API to trigger post-clone scripts

Modern Linux systems using systemd-networkd can implement consistent naming:

# /etc/systemd/network/10-eth0.link
[Match]
MACAddress=00:0c:29:*:*

[Link]
Name=eth0

For filesystem UUID conflicts (common with LVM):

# Generate new UUID for filesystems
tune2fs -U random /dev/sda1
vgs --noheadings -o vg_uuid | xargs -I {} vgchange -u {}

# For swap space
swapoff -a
mkswap -f /dev/sda2 -U $(uuidgen)
swapon -a