Install required packages
apt-get install qemu-kvm libvirt-bin bridge-utils virtinst
Setup /etc/network/interfaces
iface eth0 inet manual

auto br0
iface br0 inet static
    bridge_interfaces eth0
    bridge_stp off
    bridge_maxwait 5
    .. address, netmask, etc.

Try to put br0 interface up or reboot

brctl addbr br0

Deploy instance

Now you have more options

  • deploy from custom image
  • deploy clean Ubuntu using ubuntu-vm-builder

Ubuntu VM builder



apt-get install ubuntu-vm-builder
ubuntu-vm-builder kvm trusty --rootsize=10000 --domain cfg01 --dest cfg01
--hostname cfg01 --arch amd64 --mem 4096 --ip --mask
--net --gw --dns --libvirt qemu:///system
--addpkg openssh-server --addpkg acpid --addpkg vim-nox --components

Boot from image

apt-get install virtinst
Get image and prepare image for guest (you can use overlay image instead)
cd /var/lib/libvirt/images
cp ubuntu-14-04-x64-1437659147.qcow2 cfg01.qcow2
Install guest
virt-install --name cfg01 \
    --ram 4096 --vcpus=2 \
    --accelerate --network bridge:br0 \
    --disk path=/var/lib/libvirt/images/cfg01.qcow2,bus=virtio,cache=none \
    --boot hd --vnc --noreboot --autostart

Using overlay image

To save disk space, you can use overlay image instead of copying original image for each instance.

qemu-img create -f qcow2 -b ubuntu-14-04-x64-1437659147.qcow2 cfg01.ovl

Then simply use *.ovl for --disk parameter of virt-install command.


Don’t ever touch original image

Cloud-init configuration

To use cloud-init with libvirt, you need to provide meta-data and user-data somehow. There are multiple data sources that cloud-init expects, the simplest way is probably to generate configuration iso and attach it to instance cdrom.

Install dependencies
apt-get install genisoimage
curl -q | sed s,/bin/sh,/bin/bash,g > create-config-drive
chmod +x create-config-drive
Prepare userdata file, eg.

sed -i '/iface\ eth0\ inet\ dhcp/d' /etc/network/interfaces
cat << EOF >> /etc/network/interfaces
iface eth0 inet static

ifdown eth0; ifup eth0

echo "id:" >> /etc/salt/minion.d/minion.conf
echo "master:" >> /etc/salt/minion.d/minion.conf
service salt-minion restart

salt-call state.highstate
Generate configuration iso image
./create-config-drive -k ~/.ssh/ -u -h test1 test1-config.iso
Finally you can create domain
virt-install --name test1 \
    --ram 4096 --vcpus=2 \
    --accelerate --network bridge:br0 \
    --disk path=/var/lib/libvirt/images/test1.qcow2,bus=virtio,cache=none
    --disk path=test1-config.iso,device=cdrom \
    --boot hd --vnc --noreboot --autostart \

Manage instance

List instances
virsh list --all
Stop instance gracefuly
virsh shutdown cfg01
Stop instance by force in case it’s hanged
virsh destroy cfg01
Delete instance
virsh undefine cfg01

Resize disk


Shut down instance first, this is important

You can resize both overlay image or normal image. But don’t ever resize image that is source for overlay images.

qemu-img resize cfg01.ovl +10G

On reboot, cloud-init should automatically grow root filesystem.

Extend memory

First you need to redefine max memory for guest:

virsh setmaxmem cfg01 16G --config

After that you need to destroy domain and start it again.

Finally you can set memory onlin with following command:

virsh setmem cfg01 16G --config --live

Parameter --config will update domain XML so changes will preserve boot.