If you don't want to do any configuration inside the guest, then the only option is a DHCP server that hands out static IP addresses. If you use
bridge mode, that will probably be some external DHCP server. Consult its manual to find out how to serve static leases.
But at least in forward modes
route, you could use libvirt's built-in 'dnsmasq' (More recent versions of libvirtd support the dnsmasq's "dhcp-hostsfile" option). Here is how:
First, find out the MAC addresses of the VMs you want to assign static IP addresses:
virsh dumpxml $VM_NAME | grep 'mac address'
Then edit the network
virsh net-edit $NETWORK_NAME # Probably "default"
<dhcp> section, restrict the dynamic range and add host entries for your VMs
<range start='192.168.122.100' end='192.168.122.254'/>
<host mac='52:54:00:6c:3c:01' name='vm1' ip='192.168.122.11'/>
<host mac='52:54:00:6c:3c:02' name='vm2' ip='192.168.122.12'/>
<host mac='52:54:00:6c:3c:03' name='vm3' ip='192.168.122.12'/>
Then, reboot your VM (or restart its DHCP client, e.g.
ipdown eth0; ifup eth0)
Update: I see there are reports that the change might not get into effect after "virsh net-edit". In that case, try this after the edit:
virsh net-destroy $NETWORK_NAME
virsh net-start $NETWORK_NAME
... and restart the VM's DHCP client.
If that still doesn't work, you might have to
- stop the libvirtd service
- kill any dnsmasq processes that are still alive
- start the libvirtd service
Note: There is no way the KVM host could force a VM with unknown OS and unknown config to use a certain network configuration. But if know know that the VM uses a certain network config protocol - say DHCP - you can can use that. This is what this post assumes.
Some OS (e.g. some Linux distros) also allow to pass network config options into the guest e.g. via the kernel command line. But that is very specific to the OS, and i see no advantage over the DHCP method.