--- a/kvmctl Fri Oct 24 06:06:18 2008 +0000
+++ b/kvmctl Fri Oct 24 15:00:59 2008 +0000
@@ -4,16 +4,37 @@
# $URL$
# Heiko Schlittermann
-action="${1?}"; shift
-vm="$1"; shift
+# Structure of virtual machine directories
+# $DIR/ (see below, hard coded into this script)
+#
+# $DIR/<vm1>/conv/cmdline # KVM options (ro)
+# # example:
+# # -hda rootfs.img
+# # Note: paths are relative to $DIR/<vm1>
+# id # KVM id (ro)
+# # Note: has to be unique among all VMs
+# $DIR/<vm1>/var/pid
+# frozen
+# .cmdline
+# $DIR/<vm1>/<image>
+#
+# $DIR/<vm2>/...
+# ... ...
+#
+# <vmN>/...
DIR=/kvm
+
+action="${1?}"; shift
+vm="$1"; shift
+
# no user service able parts below
unset ${!LC_*} LANG
unset CDPATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
-set +m # switch off job control
+
+#set +m # switch off job control
ME=$(basename $0)
KVM=$(command -v kvm)
@@ -27,56 +48,66 @@
### MAIN
# sanity
-test "$NC" || die "need nc (netcat)"
-test "$KVM" || die "need kvm"
+test "$NC" || die "need nc (netcat)"
+test "$KVM" || die "need kvm"
+test "$FUSER" || die "need fuser"
-dups=$(cat $DIR/*/kvm/id | sort -n | uniq -c \
+dups=$(cat $DIR/*/conf/id | sort -n | uniq -c \
| egrep -v '^[[:space:]]+1 ' | tr -s ' ' | cut -f2 -d:)
test "$dups" && die "duplicate ids (id: $dups)"
for vm in ${vm:-$(echo $DIR/*)}; do
vm=$(basename $vm)
- kvm=$DIR/$vm/kvm
+ conf=$DIR/$vm/conf
+ var=$DIR/$vm/var
+
+ # silent conversion
+ test -d $DIR/$vm/kvm && ! test -d $DIR/$vm/conf \
+ && mv $DIR/$vm/kvm $DIR/$vm/conf
- test -d $kvm || continue
- test -f $kvm/id || { warn "need id file (vm: $vm)" && continue; }
- test -f $kvm/cmdline || { warn "need cmdline file (vm: $vm)" && continue; }
+ test -d $vm || { warn "no such file or directory: $vm"; continue; }
+ test -d $conf || continue
+ test -f $conf/id || { warn "need id file (vm: $vm)" && continue; }
+ test -f $conf/cmdline || { warn "need cmdline file (vm: $vm)" && continue; }
+ test -d $var || mkdir $var || exit 2
- id=$(cat $kvm/id)
+ id=$(cat $conf/id)
monitor=$((4000 + id))
- pid=$(cat $kvm/pid 2>/dev/null)
+ pid=$(cat $var/pid 2>/dev/null)
case "$action" in
+
start)
echo "starting $vm"
- cmdline="$(cat $kvm/cmdline) \
- -pidfile kvm/pid \
+ cmdline="$(grep -v '^#' $conf/cmdline) \
+ -pidfile var/pid \
-name "$vm" \
-vnc :$id \
-usb -usbdevice tablet \
-monitor tcp:localhost:$monitor,server,nowait \
-daemonize \
$@"
- echo "$cmdline" > $kvm/.cmdline
- test -f $kvm/frozen && cmdline="$cmdline $(cat $kvm/frozen)"
+ echo "$cmdline" > $var/.cmdline
+ test -f $var/frozen && cmdline="$cmdline $(cat $var/frozen)"
- (
- cd $DIR/$vm && $KVM $cmdline \
- && echo "started, display :$id, monitor tcp:127.0.0.1:$monitor"
- )
+ ( cd $DIR/$vm && $KVM $cmdline )
+ pid=$(cat $var/pid)
+ echo "started, pid: $pid, display :$id, monitor tcp:127.0.0.1:$monitor"
test "$DISPLAY" && test "$VNCVIEWER" && test -t \
&& ( $VNCVIEWER :$id &>/dev/null </dev/null & )
;;
stop) echo "stopping (powerdown) $vm"
- {
- ( echo system_powerdown | $NC localhost $monitor ) & pid0=$!
- ( sleep 30; kill $pid0 &>/dev/null ) & pid1=$!
+ #{
+ { echo system_powerdown | $NC localhost $monitor; } & pid0=$!
+ #( sleep 30; kill $pid0 &>/dev/null ) & pid1=$!
+echo $pid0
wait $pid0
- kill $pid1 2>/dev/null
- kill -0 $pid 2>/dev/null && $0 kill $vm
- } &
+echo $?
+ #kill $pid1 2>/dev/null
+ #kill -0 $pid 2>/dev/null && $0 kill $vm
+ #} &
;;
quit) echo "quit $vm"
$FUSER -k $monitor/tcp
@@ -89,8 +120,9 @@
freeze) echo "freezing $vm"
fuser -k $monitor/tcp
echo -e "savevm HIBERNATE\nquit" | $NC localhost $monitor &
- echo "-loadvm HIBERNATE" >$kvm/frozen
+ echo "-loadvm HIBERNATE" >$var/frozen
;;
+ #status) echo "status $vm: "
qemu)
echo "DO *NOT* USE \"quit\", use ^C for exiting!"
$NC localhost $monitor
@@ -100,3 +132,5 @@
done
wait
+
+# vim:ts=4 sw=4 et: