- 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
Now you have more options
- deploy from custom image
- deploy clean Ubuntu using ubuntu-vm-builder
Attention!
Untested
apt-get install ubuntu-vm-builder
ubuntu-vm-builder kvm trusty --rootsize=10000 --domain cfg01 --dest cfg01
--hostname cfg01 --arch amd64 --mem 4096 --ip 172.19.5.30 --mask 255.255.255.0
--net 172.19.0.0 --gw 172.19.5.0 --dns 172.19.0.1 --libvirt qemu:///system
--addpkg openssh-server --addpkg acpid --addpkg vim-nox --components
"main,universe"
apt-get install virtinst
- Get image and prepare image for guest (you can use overlay image instead)
cd /var/lib/libvirt/images wget http://apt.cloudlab.cz/images/ubuntu-14-04-x64-1437659147.qcow2 cp ubuntu-14-04-x64-1437659147.qcow2 cfg01.qcow2
- Install guest
virt-install --name cfg01 \ --ram 4096 --vcpus=2 \ --accelerate --network bridge:br0,model=virtio \ --disk path=/var/lib/libvirt/images/cfg01.qcow2,bus=virtio,cache=none \ --boot hd --vnc --noreboot --autostart
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.
Attention!
Don't ever touch original image
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 https://raw.githubusercontent.com/larsks/virt-utils/master/create-config-drive | sed s,/bin/sh,/bin/bash,g > create-config-drive chmod +x create-config-drive
- Prepare userdata file, eg.
userdata.sh
#!/bin/bash sed -i '/iface\ eth0\ inet\ dhcp/d' /etc/network/interfaces cat << EOF >> /etc/network/interfaces iface eth0 inet static address 172.19.5.101 netmask 255.255.255.0 gateway 172.19.5.254 dns-nameservers 172.19.0.1 EOF ifdown eth0; ifup eth0 echo "id: test1.int.cloudlab.cz" >> /etc/salt/minion.d/minion.conf echo "master: 172.19.5.30" >> /etc/salt/minion.d/minion.conf service salt-minion restart salt-call state.highstate
- Generate configuration iso image
./create-config-drive -k ~/.ssh/id_rsa.pub -u userdata.sh -h test1 test1-config.iso
- Finally you can create domain
virt-install --name test1 \ --ram 4096 --vcpus=2 \ --accelerate --network bridge:br0,model=virtio \ --disk path=/var/lib/libvirt/images/test1.qcow2,bus=virtio,cache=none --disk path=test1-config.iso,device=cdrom \ --boot hd --vnc --noreboot --autostart \
- 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
Attention!
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.
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.
Live migration without shared storage
- create same disk in target kvm host in /var/lib/libvirt/ (scp)
virsh migrate --verbose --undefinesource --persistent --live --copy-storage-all <vm_name> qemu+ssh://<target_kvm>/system