VM setup using Libvirt and KVM

Using Ubuntu 16.04. Follow server setup first to configure the server.

Install libvirt and KVM:

sudo apt install libvirt-bin qemu-kvm virtinst libosinfo-bin

Create a gold master guest image:

osinfo-query os

sudo virt-install --connect qemu:///system     --virt-type kvm --name SSE-Gold \
	--os-variant=debian8 --ram 512 --vcpus 1 --disk path=SSE-Gold.img,size=20 \
	--cdrom iso/debian-8.4.0-i386-DVD-1.iso --network=bridge=br0 \
	--graphics type=vnc,port=5901,listen=,password=foo

Connect to the server using a VNC client to complete the installation. E.g.

During installation, say Yes to using a network mirror, and set the HTTP proxy to For Software Selection, enable only SSH Server and standard system utilities, disable the desktop.

Follow guest setup to configure the gold master guest, but leave the network configuration alone (configured by DHCP, the default).

Shut down the master and make a copy:

sudo virsh shutdown SSE-Gold
sudo mkdir -p /data/vm
sudo cp SSE-Gold.img /data/vm/SSE-Gold-Master.img

Clone some VMs, with specific MAC addresses:

for pc in {1..32}; do
	macaddr=`echo $domainname | md5sum | sed -e 's/^\(..\)\(..\)\(..\)\(..\).*/52:54:\1:\2:\3:\4/'`
	sudo qemu-img create -f qcow2 -o backing_file=/data/vm/SSE-Gold-Master.img $image
	sudo virt-install --connect qemu:///system     --virt-type kvm --name $hostname \
		--os-variant=debian8 --ram 512 --vcpus 1 --disk path=$image,format=qcow2 \
		--network=bridge=br0,mac=$macaddr --import --noautoconsole \
		--serial tcp,host=:$[2200+$pc],mode=bind,protocol=telnet --noautoconsole
	sudo virsh autostart $hostname

Once they have all booted, fix their hostnames:

for pc in {1..32}; do
	ssh -to StrictHostKeyChecking=no root@196.200.219.$[200+$pc] \
	"echo pc$pc.sse.ws.afnog.org | sudo tee /etc/hostname; 
	"'sudo hostname `cat /etc/hostname`'