#!/bin/sh set -e # Author: Daniel Kahn Gillmor # Date: 2011-01-26 # License: GPL v3+ ## expect to pull these values from the environment: # VMNAME=snapper # OWNER=jrollins # TAP=tap0 # RAM=512 # MAC=52:54:00:12:34:56 # HDA=/path/to/disk0 # optional # HDB=/path/to/disk1 # optional # HDC=/path/to/disk2 # optional # HDD=/path/to/disk3 # optional if [ -z "$VMNAME" ] ; then exit 1 fi ################### OWNERGROUP=$(groups "$OWNER" | cut -f1 -d\ ) OWNERHOME=$(getent passwd "$OWNER" | cut -f6 -d: ) up() { # bring up the network tap: modprobe -v tun tunctl -u "$OWNER" -t "$TAP" ip link set "$TAP" up brctl addif br0 "$TAP" chpst -u "$OWNER:$OWNERGROUP" mkdir -p "$OWNERHOME/vms/$VMNAME" CDISO="$OWNERHOME/vms/$VMNAME/cd.iso" NETBOOT="$OWNERHOME/vms/$VMNAME/netboot" KVMARGS= BOOTCHOICE=c if [ -e "$NETBOOT" ] ; then BOOTCHOICE=n elif [ -e "$CDISO" ] && [ -e $(readlink -f "$CDISO") ] ; then KVMARGS="-cdrom $CDISO" BOOTCHOICE=d fi # set up the disks, if needed: [ -z "$HDA" ] || KVMARGS="$KVMARGS -hda $HDA" [ -z "$HDB" ] || KVMARGS="$KVMARGS -hdb $HDB" [ -z "$HDC" ] || KVMARGS="$KVMARGS -hdc $HDC" [ -z "$HDD" ] || KVMARGS="$KVMARGS -hdd $HDD" LOGNAME="$OWNERHOME/vms/$VMNAME/console" ln -sfT "$LOGNAME" ./servicelog if [ -e "$LOGNAME" ] ; then chpst -u "$OWNER" mv "$LOGNAME" "$LOGNAME".$(date +%F_%T%z|tr : .) fi exec chpst -u "$OWNER:$OWNERGROUP:kvm" \ /usr/bin/screen -D -m -L -c /etc/screenrc.kvm-manager -S "$VMNAME" -t "$VMNAME" -s /bin/false \ /usr/bin/kvm $KVMARGS \ -M "${MACHINE:-pc}" \ -enable-kvm \ -nodefaults \ -nographic \ -name "$VMNAME" \ -m "$RAM" \ -boot "$BOOTCHOICE" \ -chardev "socket,id=monitor,path=$OWNERHOME/vms/$VMNAME/monitor,server,nowait" -mon chardev=monitor,mode=readline \ -rtc base=utc \ -usb \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4 \ -chardev stdio,id=serial0 -device isa-serial,chardev=serial0 \ -smp "${SMP:-1},maxcpus=${MAXCPUS:-8}" \ -net nic,"macaddr=$MAC" \ -net "tap,ifname=$TAP,script=no,downscript=no" \ -no-reboot } down() { brctl delif br0 "$TAP" ip link set "$TAP" down tunctl -d "$TAP" # no need to lock up the block device as well, since the owner might # prefer to manipulate the disk directly. } log() { LOGDIR="$OWNERHOME/vms/$VMNAME/servicelog" chpst -u "$OWNER" mkdir -p "$LOGDIR" exec chpst -u "$OWNER" svlogd -tt "$LOGDIR" } case "$1" in up|down|log) "$1" ;; *) echo "Usage: $0 [up|down]" >&2 exit 1 ;; esac