#!/bin/sh basedir="`dirname "$0"`/.." #VM_NAME="xp.intra.ogris.net" if [ -z "$VM_NAME" ]; then script="`basename "$0"`" script=${script%%.sh} VM_NAME=${script##[0-9]} port=${script%%$VM_NAME} fi VM_VNC=${VM_VNC:-$port} VM_MEM=${VM_MEM:-2048} VM_CPU=${VM_CPU:-"host"} VM_MACHINE=${VM_MACHINE:-"pc"} VM_CPUS=${VM_CPUS:-2} VM_CDROMS=${VM_CDROMS:-1} VM_EXTRA=${VM_EXTRA:-""} VM_FILE_NAME0=${VM_FILE_NAME0:-$VM_NAME} #VM_FILE_TYPE0="virtio" #VM_FILE_CACHE0="none" #... #VM_FILE_NAME7=... #VM_FILE_TYPE7=... #VM_FILE_CACHE7=... #VM_NET_MAC0=${VM_NET_MAC0:-"52:54:00:00:0$VM_MAC:00"} #VM_NET_TAP0=${VM_NET_TAP0:-"0$VM_VNC"} VM_NET_TYPE0=${VM_NET_TYPE0:-"virtio"} #... #VM_NET_MAC0=${VM_NET_MAC0:-"52:54:00:00:0$VM_MAC:03"} #VM_NET_TAP3=... #VM_NET_TYPE3=... VM_PORT=${VM_PORT:-$((VM_VNC+6666))} VM_MAC=${VM_MAC:-$VM_VNC} VM_PID=${VM_PID:-"$basedir/tmp/kvm-$VM_NAME.pid"} # for remote shutdown via net rpc: #VM_SHUT_DOMAIN="XP" #VM_SHUT_USER="administrator" #VM_SHUT_PASS="secret" #VM_SHUT_HOST="192.168.1.13" [ -z "$VM_NAME" ] && { echo "no VM_NAME" >&2; exit 1; } [ -z "$VM_VNC" ] && { echo "no VM_VNC" >&2; exit 1; } function vm_start() { echo "Starting $VM_NAME" nics="" for i in {0..3}; do eval nicmac=\$VM_NET_MAC$i eval nictap=\$VM_NET_TAP$i eval nictype=\$VM_NET_TYPE$i [ -z "$nicmac" -a -z "$nictap" -a -z "$nictype" ] && continue nicmac=${nicmac:-"52:54:00:00:0$VM_MAC:0$((i+1))"} nictap=${nictap:-"$i$VM_VNC"} nictype=${nictype:-"virtio"} [ "$nictype" != "none" ] && nics="$nics \ -net nic,vlan=$i,model=$nictype,macaddr=$nicmac \ -net tap,vlan=$i,ifname=tap$nictap,script=no,downscript=no" done files="" for i in {0..7}; do eval filename=\$VM_FILE_NAME$i eval filetype=\$VM_FILE_TYPE$i eval filecache=\$VM_FILE_CACHE$i filetype=${filetype:-"virtio"} filecache=${filecache:-"none"} [ -n "$filename" -a "$filename" != "none" ] && files="$files \ -drive format=raw,cache=$filecache,file=$basedir/disks/$filename.raw,if=$filetype" done have_cdrom=-1 for i in "$@"; do [ "$i" = "-cdrom" ] && have_cdrom=0 done cdroms="" for i in {0..3}; do [ $i -lt $VM_CDROMS -a $have_cdrom -ne $i ] && cdroms="$cdroms \ -drive readonly=on,media=cdrom,if=ide,bus=1,unit=$i" done qemu-system-x86_64 --enable-kvm -k de -localtime -daemonize -m "$VM_MEM" \ -name "$VM_NAME" -cpu "$VM_CPU" -machine "$VM_MACHINE" -smp "$VM_CPUS" \ $files \ $nics \ $cdroms \ -soundhw ac97 \ -balloon virtio \ -vnc :"$VM_VNC" -monitor tcp::"$VM_PORT",server,nowait \ -pidfile "$VM_PID" \ $VM_EXTRA \ "$@" sleep 3 echo >/dev/tcp/localhost/$VM_PORT } function vm_stop() { echo "Stopping $VM_NAME" [ -n "$VM_SHUT_HOST" ] && net rpc shutdown -f \ -U "$VM_SHUT_DOMAIN"'\'"$VM_SHUT_USER"'%'"$VM_SHUT_PASS" -t 2 \ -I "$VM_SHUT_HOST" echo system_powerdown | nc localhost $VM_PORT & echo -n "waiting 150 seconds for $VM_NAME to shutdown" for i in {0..180}; do sleep 1 echo -n "." p=`cat "$VM_PID" 2>/dev/null` || { echo "ok"; return; } kill -0 "$p" 2>/dev/null || { echo "ok"; rm -f "$VM_PID"; return; } done echo quit | nc localhost $VM_PORT & echo -n "waiting 30 seconds for $VM_NAME to quit" for i in {0..30}; do sleep 1 echo -n "." p=`cat "$VM_PID" 2>/dev/null` || { echo "ok"; return; } kill -0 "$p" 2>/dev/null || { echo "ok"; rm -f "$VM_PID"; return; } done echo "did neither shutdown nor quit, killing" p=`cat "$VM_PID"` || return rm -f "$VM_PID" kill "$p" } case "$1" in start) shift vm_start "$@" ;; stop) vm_stop ;; *) echo "usage: $0 [ option ... ]" >&2 exit 1 ;; esac