#!/bin/sh # # Create a new VM for liw. set -eu die() { echo "$@" 1>&2 exit 1 } # Check parameters. if [ "$#" != 2 ] then die "Usage: $0 NAME BASE" fi # Command line parameters: name of VM and base image (no .img.xz suffix). name="$1" base="$2" # Config variables. . "$HOME/.config/ansibleness/vm.conf" # Does the base image exist? basepath="$imagedir/base-$base.img.xz" if [ ! -e "$basepath" ] then echo "$basepath does not exist" 1>&2 exit 1 fi # How large are the (uncompressed) images? size="4G" # Create new LV. sudo lvcreate --name "$name" --size "$size" "$vg" lvpath="/dev/$vg/$name" # Copy uncompressed image to LV. unxz < "$basepath" | pv --size "$size" | sudo ionice -c3 tee "$lvpath" > /dev/null # Create VM. virt-install --connect qemu:///system \ --quiet \ --name="$name" \ --memory=1024 \ --cpu=host-model-only \ --import \ --os-variant=debianwheezy \ --disk="path=$lvpath,cache=none" \ --network="$vmnetwork" \ --graphics=spice \ --noautoconsole # If we're using the virtual network "default", wait for the VM to get # a DHCP response and add it to /etc/hosts. We don't do it for other # types of network (e.g., bridge=br0), since we ... can't. if [ "$vmnetwork" = "network=default" ] then # Get the MAC address. mac="$(virsh -c qemu:///system dumpxml "$name" | sed -n "/ /dev/null # Done. echo "Virtual machine $name ($ip) has been created and started." else echo "Virtual machien $name has been created and started, and may be ready soon." fi