Building virtual machines with vmbuilder
After installing qemu-kvm
, libvirt-bin
, bridge-utils
and ubuntu-vm-builder
, set up a bridge that virtual machines can attach to:
auto lo iface lo inet loopback auto enp2s0 iface enp2s0 inet manual auto br0 iface br0 inet static address 192.168.0.8 netmask 255.255.255.0 gateway 192.168.0.1 nameserver 127.0.0.1 bridge_ports enp2s0 bridge_stp off bridge_fd 0 bridge_maxwait 0
Then /etc/init.d/networking restart
.
Install apt-cacher
and give it the following config
in /etc/apt-cacher/apt-cacher.conf
:
group = www-data user = www-data daemon_addr = 192.168.0.8 path_map = ubuntu archive.ubuntu.com/ubuntu allowed_hosts = 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 ubuntu_release_names = trusty
The vm build script, using the local cache:
#!/bin/sh if [ $# -lt 2 ]; then echo "usage: HOSTNAME IP" exit 1 else HOSTNAME=$1 IP=$2 fi firstboot=`mktemp` echo "#!/bin/bash" >>$firstboot echo "rm -f /etc/resolvconf/resolv.conf.d/{original,base,head,tail}" >>$firstboot echo "reboot" >>$firstboot chmod +x $firstboot qemu-img create -f qcow2 -o preallocation=falloc $HOME/vms/$HOSTNAME-rootdisk 4096M vmbuilder kvm ubuntu \ --suite trusty \ --verbose \ --libvirt qemu:///system \ --destdir $HOME/vms/$HOSTNAME/ \ --install-mirror http://192.168.0.8:3142/ubuntu \ --mirror http://192.168.0.8:3142/ubuntu \ --raw $HOME/vms/$HOSTNAME-rootdisk \ --rootsize 4096 \ --swapsize 0 \ --mem 128 \ --cpus 1 \ --hostname $HOSTNAME \ --bridge br0 \ --ip $IP\ --mask 255.255.255.0 \ --gw 192.168.0.1 \ --dns 192.168.0.8 \ --lang en_US.UTF-8 \ --timezone UTC \ --user ubuntu \ --name Ubuntu \ --pass ubuntu \ --ssh-user-key $HOME/.ssh/id_rsa.pub \ --addpkg linux-image-generic \ --addpkg openssh-server \ --addpkg sudo \ --firstboot $firstboot rm $firstboot rmdir $HOME/vms/$HOSTNAME/ virsh autostart $HOSTNAME virsh start $HOSTNAME
Edit: To inspect and edit the virtual machine disk image, use guestfish, part of the libguestfs project:
$ sudo apt-get install libguestfs-tools $ guestfish --rw --add testserver-rootdisk Welcome to guestfish, the guest filesystem shell for editing virtual machine filesystems and disk images. Type: 'help' for help on commands 'man' to read the manual 'quit' to quit the shell ><fs> run 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00 ><fs> list-filesystems /dev/sda1: ext4 ><fs> mount /dev/sda1 / ><fs> emacs /etc/resolv.conf ><fs> exit
Edit: Disk image pre-allocation can be done with QEMU-provided tools, which may or may not be a more kosher approach. Must investigate.
qemu-img create -f qcow2 -o preallocation=falloc $HOME/vms/$HOSTNAME-rootdisk 32768M
Edit: Fix nameserver enforcement in build script.
Categorised as: snippet