#!/bin/sh # depends on following packages: # apt-get install virtinst libvirt-bin dosfstools mtools kvm kvm-qemu # apt-get install -t wheezy util-linux # defaults, configurable in config VG='vg01' ETC='/etc/cloudinit' CONFIG="$ETC/cloudinit.cfg" VARDIR='/var/lib/libvirt/cloudinit' SCRIPTDIR='/usr/local/bin/leap_cloudadmin' KVM_URI='qemu:///system' SEED='cloudinit_seed.img' # overwrite defaults [ -e $CONFIG ] && . $CONFIG # unconfigurable variables # swapsize is swapsize of the base image SWAPSIZE=4 MIN_DISKSIZE=10 size=$MIN_DISKSIZE fail() { [ $# -eq 0 ] || echo "$@"; exit 1; } bad_usage() { usage 1>&2; [ $# -eq 0 ] || fail "$@"; exit 1; } usage() { cat <.cfg as meta- und user-data file options: -h show usage -s size disk size in GB, including $SWAPSIZE GB swap. Defaults to minimal value of $MIN_DISKSIZE GB. EOF } short_opts="hs:" getopt_out=$(getopt --name "${0##*/}" \ --options "${short_opts}" -- "$@") && eval set -- "${getopt_out}" || fail "Error !" while [ $# -ne 0 ]; do cur=${1}; next=${2}; case "$cur" in -h) Usage ; exit 0;; -s) size=$next; shift;; --) shift; break;; esac shift; done [ $# -lt 1 ] && bad_usage "must provide guest name" [ $# -gt 1 ] && bad_usage "too many arguments" [ $size -lt $MIN_DISKSIZE ] && bad_usage "Minimal disk size is 10 GB !" # requirements echo "mtools_skip_check=1">~/.mtoolsrc [ -e $VARDIR ] || ( mkdir $VARDIR ; chown libvirt-qemu $VARDIR ) vmname=$1 cfg="$ETC/$vmname.cfg" [ -e /dev/$VG/$vmname ] && fail "/dev/$VG/$vmname exists - please delete it or choose another guest name" [ -e $cfg ] || fail "please provide config file in $cfg" echo echo "Creating guest VM $vmname with size: $size GB, using $cfg for cloud-init" echo "OK ? to abort, to resume." read enter # is a VM with the same name defined ? virsh dominfo $vmname > /dev/null 2>&1 if [ $? -eq 0 ]; then fail "Domain $vmname is defined in libvirt. Please undefine first."; fi lvcreate -L ${size}g -n $vmname $VG virt-clone --connect $KVM_URI -o leap-baseimage-wheezy -n $vmname -f /dev/$VG/$vmname --force # resize second (root) partition echo ",+," | sfdisk -q -N2 /dev/$VG/$vmname > /dev/null 2>&1 # create cloudinit seed disk csplit -q --prefix "$VARDIR/$vmname" $cfg '/#cloud-config/' metadata="$VARDIR/${vmname}00" userdata="$VARDIR/${vmname}01" $SCRIPTDIR/libvirt-make-seed-disk $VARDIR/$vmname-$SEED $userdata $metadata $SCRIPTDIR/libvirt-write-disk-attach-xml $VARDIR/$vmname-$SEED > $VARDIR/$vmname-disk-attach.xml echo echo "Attached cloudinit-seeddisk is at $VARDIR/$vmname-$SEED" echo echo "Finished creating guest $vmname. Enjoy." echo echo "Press to start the new guest." read bogus echo echo 'Starting new guest, attaching to console. Exit with Ctrl+]' echo virsh start $vmname sleep 2 virsh attach-device $vmname $VARDIR/$vmname-disk-attach.xml virsh console $vmname #do we really need to detach the cloud-init disk ? #virsh detach-device $vmname $VARDIR/$vmname-disk-attach.xml