When working with KVM virtualization, you'll often need to generate random MAC addresses for guest VMs. This is particularly important for:
- Avoiding MAC address conflicts in bridged networking
- Creating unique network identities for cloned VMs
- Testing network configurations in isolated environments
The simplest method uses openssl
combined with sed
for formatting:
openssl rand -hex 6 | sed 's/$..$/\1:/g; s/.$//'
This generates a properly formatted 48-bit MAC address with colons as separators. The sed
command inserts colons between each pair of hex digits.
For KVM guests, you should use the following unicast ranges:
52:54:00:xx:xx:xx # QEMU/KVM standard
00:16:3e:xx:xx:xx # Xen range
Here's how to generate within the QEMU range:
printf '52:54:00:%02x:%02x:%02x\n' $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256))
If you don't have openssl installed, try these options:
Using date
and md5sum
:
date +%s | md5sum | head -c 6 | sed 's/$..$/\1:/g; s/.$//'
Using uuidgen
:
uuidgen | sed 's/-//g' | head -c 12 | sed 's/$..$/\1:/g; s/.$//'
To ensure your generated MAC is valid:
- First byte's least significant bit should be 0 (unicast)
- First byte's second least significant bit should be 0 (globally unique)
- Total length should be 17 characters (including colons)
Here's a verification command:
echo "52:54:00:ab:cd:ef" | grep -qE '^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$' && echo "Valid" || echo "Invalid"
When creating a new KVM guest, you can directly use these methods:
virt-install \
--name myvm \
--memory 2048 \
--disk size=10 \
--network mac=$(openssl rand -hex 6 | sed 's/$..$/\1:/g; s/.$//') \
--cdrom /path/to/iso
Or when modifying an existing VM's XML definition:
virsh edit myvm
# Then modify the <mac address='...'/> section
When provisioning KVM guest virtual machines, assigning unique MAC addresses is crucial for network communication. While libvirt can automatically generate MACs, sometimes you need manual control for scripting or specific network configurations.
This method uses standard Linux utilities to generate a properly formatted MAC:
od -An -N6 -tx1 /dev/urandom | sed -e 's/^ //' -e 's/ /:/g' -e 's/$.*$/\L\1/'
Explanation:
• od reads 6 bytes from /dev/urandom
• sed formats the output with colons and ensures lowercase letters
Result example: 52:54:00:12:34:56
Another approach using common text processing tools:
printf '%02x:' $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)) | awk '{sub(/:$/,""); print tolower($0)}'
For KVM guests, you should prefix the MAC with 52:54:00 (assigned to QEMU):
printf '52:54:00:%02x:%02x:%02x\n' $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256))
To apply the MAC address to a KVM guest:
virsh edit vm_name # Look for <mac address='...'/> and replace it with your generated MAC
Verify uniqueness with:
virsh dumpxml vm_name | grep 'mac address'
Directly generate a MAC for libvirt XML:
echo "<mac address='$(printf '52:54:00:%02x:%02x:%02x' $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)))'/>"