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 ;; |