kvmctl
changeset 2 30ac294f8ced
parent 1 e7bd8393f87b
child 3 d8aba2189a27
equal deleted inserted replaced
1:e7bd8393f87b 2:30ac294f8ced
     2 # status: in development
     2 # status: in development
     3 # $Id$
     3 # $Id$
     4 # $URL$
     4 # $URL$
     5 # Heiko Schlittermann
     5 # Heiko Schlittermann
     6 
     6 
     7 action="${1?}"; shift
     7 # Structure of virtual machine directories
     8 vm="$1";	shift
     8 # $DIR/     (see below, hard coded into this script)
       
     9 #
       
    10 # $DIR/<vm1>/conv/cmdline      # KVM options (ro)
       
    11 #                             # example: 
       
    12 #                             # -hda rootfs.img 
       
    13 #                             # Note: paths are relative to $DIR/<vm1>
       
    14 #                id           # KVM id (ro)
       
    15 #                             # Note: has to be unique among all VMs
       
    16 # $DIR/<vm1>/var/pid          
       
    17 #                frozen      
       
    18 #                .cmdline   
       
    19 # $DIR/<vm1>/<image>
       
    20 #
       
    21 # $DIR/<vm2>/...
       
    22 #      ...   ...
       
    23 #
       
    24 #      <vmN>/...
     9 
    25 
    10 DIR=/kvm
    26 DIR=/kvm
       
    27 
       
    28 action="${1?}"; shift
       
    29 vm="$1";	    shift
       
    30 
    11 # no user service able parts below
    31 # no user service able parts below
    12 
    32 
    13 unset ${!LC_*} LANG
    33 unset ${!LC_*} LANG
    14 unset CDPATH
    34 unset CDPATH
    15 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    35 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    16 set +m		    # switch off job control
    36 
       
    37 #set +m		    # switch off job control
    17 
    38 
    18 ME=$(basename $0)
    39 ME=$(basename $0)
    19 KVM=$(command -v kvm)
    40 KVM=$(command -v kvm)
    20 NC=$(command -v nc)
    41 NC=$(command -v nc)
    21 FUSER=$(command -v fuser)
    42 FUSER=$(command -v fuser)
    25 warn() { echo $ME: "$@" >&2; }
    46 warn() { echo $ME: "$@" >&2; }
    26 
    47 
    27 ### MAIN
    48 ### MAIN
    28 
    49 
    29 # sanity
    50 # sanity
    30 test "$NC"  || die "need nc (netcat)"
    51 test "$NC"  	|| die "need nc (netcat)"
    31 test "$KVM" || die "need kvm"
    52 test "$KVM" 	|| die "need kvm"
       
    53 test "$FUSER" 	|| die "need fuser"
    32 
    54 
    33 dups=$(cat $DIR/*/kvm/id | sort -n | uniq -c \
    55 dups=$(cat $DIR/*/conf/id | sort -n | uniq -c \
    34     | egrep -v '^[[:space:]]+1 ' | tr -s ' ' | cut -f2 -d:)
    56     | egrep -v '^[[:space:]]+1 ' | tr -s ' ' | cut -f2 -d:)
    35 test "$dups" && die "duplicate ids (id: $dups)"
    57 test "$dups" && die "duplicate ids (id: $dups)"
    36 
    58 
    37 for vm in ${vm:-$(echo $DIR/*)}; do
    59 for vm in ${vm:-$(echo $DIR/*)}; do
    38     vm=$(basename $vm)
    60     vm=$(basename $vm)
    39     kvm=$DIR/$vm/kvm
    61     conf=$DIR/$vm/conf
       
    62     var=$DIR/$vm/var
    40 
    63 
    41     test -d $kvm	 || continue
    64     # silent conversion
    42     test -f $kvm/id	 || { warn "need id file (vm: $vm)" && continue; } 
    65     test -d $DIR/$vm/kvm && ! test -d $DIR/$vm/conf \
    43     test -f $kvm/cmdline || { warn "need cmdline file (vm: $vm)" && continue; }
    66         && mv $DIR/$vm/kvm $DIR/$vm/conf
    44 
    67 
    45     id=$(cat $kvm/id)
    68     test -d $vm             || { warn "no such file or directory: $vm"; continue; }
       
    69     test -d $conf	        || continue
       
    70     test -f $conf/id	    || { warn "need id file (vm: $vm)" && continue; } 
       
    71     test -f $conf/cmdline   || { warn "need cmdline file (vm: $vm)" && continue; }
       
    72     test -d $var            || mkdir $var || exit 2
       
    73 
       
    74     id=$(cat $conf/id)
    46     monitor=$((4000 + id))
    75     monitor=$((4000 + id))
    47     pid=$(cat $kvm/pid 2>/dev/null)
    76     pid=$(cat $var/pid 2>/dev/null)
    48 
    77 
    49     case "$action" in
    78     case "$action" in
       
    79 
    50     start)
    80     start)
    51 	    echo "starting $vm"
    81 	    echo "starting $vm"
    52 	    cmdline="$(cat $kvm/cmdline) \
    82 	    cmdline="$(grep -v '^#' $conf/cmdline) \
    53 		-pidfile kvm/pid \
    83 		-pidfile var/pid \
    54 		-name "$vm" \
    84 		-name "$vm" \
    55 		-vnc :$id \
    85 		-vnc :$id \
    56 		-usb -usbdevice tablet \
    86 		-usb -usbdevice tablet \
    57 		-monitor tcp:localhost:$monitor,server,nowait \
    87 		-monitor tcp:localhost:$monitor,server,nowait \
    58 		-daemonize \
    88 		-daemonize \
    59 		$@"
    89 		$@"
    60 	    echo "$cmdline" > $kvm/.cmdline
    90 	    echo "$cmdline" > $var/.cmdline
    61 	    test -f $kvm/frozen && cmdline="$cmdline $(cat $kvm/frozen)"
    91 	    test -f $var/frozen && cmdline="$cmdline $(cat $var/frozen)"
    62 
    92 
    63 	    ( 
    93 		( cd $DIR/$vm && $KVM $cmdline )
    64 		cd $DIR/$vm && $KVM $cmdline \
    94         pid=$(cat $var/pid)
    65 		&& echo "started, display :$id, monitor tcp:127.0.0.1:$monitor" 
    95 		echo "started, pid: $pid, display :$id, monitor tcp:127.0.0.1:$monitor" 
    66 	    )
       
    67 
    96 
    68 	    test "$DISPLAY" && test "$VNCVIEWER" && test -t \
    97 	    test "$DISPLAY" && test "$VNCVIEWER" && test -t \
    69 		&& ( $VNCVIEWER :$id &>/dev/null </dev/null & )
    98 		&& ( $VNCVIEWER :$id &>/dev/null </dev/null & )
    70 
    99 
    71 	    ;;
   100 	    ;;
    72     stop)   echo "stopping (powerdown) $vm"
   101     stop)   echo "stopping (powerdown) $vm"
    73 	    {
   102 	    #{
    74 		( echo system_powerdown | $NC localhost $monitor ) & pid0=$!
   103 		{ echo system_powerdown | $NC localhost $monitor; } & pid0=$!
    75 		( sleep 30; kill $pid0 &>/dev/null ) & pid1=$!
   104 		#( sleep 30; kill $pid0 &>/dev/null ) & pid1=$!
       
   105 echo $pid0
    76 		wait $pid0
   106 		wait $pid0
    77 		kill $pid1 2>/dev/null
   107 echo $?
    78 		kill -0 $pid 2>/dev/null && $0 kill $vm
   108 		#kill $pid1 2>/dev/null
    79 	    } &
   109 		#kill -0 $pid 2>/dev/null && $0 kill $vm
       
   110 	    #} &
    80 	    ;;
   111 	    ;;
    81     quit)   echo "quit $vm"
   112     quit)   echo "quit $vm"
    82 	    $FUSER -k $monitor/tcp
   113 	    $FUSER -k $monitor/tcp
    83 	    echo quit | $NC 127.0.0.1 $monitor &
   114 	    echo quit | $NC 127.0.0.1 $monitor &
    84 	    ;;
   115 	    ;;
    87 	    kill $pid &
   118 	    kill $pid &
    88 	    ;;
   119 	    ;;
    89     freeze) echo "freezing $vm"
   120     freeze) echo "freezing $vm"
    90 	    fuser -k $monitor/tcp
   121 	    fuser -k $monitor/tcp
    91 	    echo -e "savevm HIBERNATE\nquit" | $NC localhost $monitor &
   122 	    echo -e "savevm HIBERNATE\nquit" | $NC localhost $monitor &
    92 	    echo "-loadvm HIBERNATE" >$kvm/frozen
   123 	    echo "-loadvm HIBERNATE" >$var/frozen
    93 	    ;;
   124 	    ;;
       
   125     #status) echo "status $vm: "
    94     qemu)
   126     qemu)
    95 	    echo "DO *NOT* USE \"quit\", use ^C for exiting!"
   127 	    echo "DO *NOT* USE \"quit\", use ^C for exiting!"
    96 	    $NC localhost $monitor
   128 	    $NC localhost $monitor
    97 	    ;;
   129 	    ;;
    98     esac
   130     esac
    99 
   131 
   100 done
   132 done
   101 
   133 
   102 wait
   134 wait
       
   135 
       
   136 # vim:ts=4 sw=4 et: