#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin #constants START_PORT=10000 PORTS_PER_UML=1000 VOLUME=/dev/vg1 UML_HOME_BASE=/var/local KERNEL=/opt/uml/bin/linux if [ "$1" = "--nice" ]; then NICE="nice" shift else NICE="" fi UMLUSER=$1 IP_LAST_NR=$2 MEM=$3 DISKSPACE=$4 OP=$5 UMLIP=192.168.3.$IP_LAST_NR SSHPORT=$(($START_PORT + $IP_LAST_NR * $PORTS_PER_UML + 22)) TAPDEV=tap$IP_LAST_NR UMLHOME=$UML_HOME_BASE/$UMLUSER PARTITION=$VOLUME/$UMLUSER NAME=UML-$UMLUSER DESC="UML $UMLIP Instanz" MEMORY="mem=$MEM" UMID="umid=$UMLUSER" NETWORK="eth0=tuntap,$TAPDEV" DISKS="ubd0=$PARTITION" CONSOLES='con0=fd:0,fd:1 con=pts' set -e case "$OP" in start) echo -n "starting $DESC $NAME" test -d $UMLHOME || mkdir $UMLHOME chown $UMLUSER $UMLHOME tunctl -u $UMLUSER -t $TAPDEV > /dev/null ifconfig $TAPDEV up brctl addif br0 $TAPDEV chown $UMLUSER $PARTITION /usr/bin/screen -d -m -- su -c "HOME=$UMLHOME $NICE $KERNEL $MEMORY $UMID $NETWORK $DISKS $CONSOLES" $UMLUSER iptables -t nat -A POSTROUTING -o eth0 -s $UMLIP -j MASQUERADE iptables -t nat -A PREROUTING -p tcp --dport $SSHPORT -j DNAT --to-destination $UMLIP:22 echo "." ;; stop) echo -n "stopping $DESC $NAME " su -c "HOME=$UMLHOME /usr/bin/uml_mconsole $UMLUSER cad" $UMLUSER # wait doesn't wait for foreign childs #that's why the following doesn't work: #wait `cat $UMLHOME/.uml/$UMLUSER/pid` #instead we loop 10 times to check whether the process terminated TESTCMD="ps `cat $UMLHOME/.uml/$UMLUSER/pid`" for ((i=1; i <= 20 ; i++)) do $TESTCMD > /dev/null && sleep 1 done if $TESTCMD > /dev/null ; then echo UML instance did not terminate. To kill it type echo su -c \"HOME=$UMLHOME /usr/bin/uml_mconsole $UMLUSER halt\" $UMLUSER exit 1 fi iptables -t nat -D POSTROUTING -o eth0 -s $UMLIP -j MASQUERADE iptables -t nat -D PREROUTING -p tcp --dport $SSHPORT -j DNAT --to-destination $UMLIP:22 brctl delif br0 $TAPDEV ifconfig $TAPDEV down tunctl -d $TAPDEV > /dev/null #rmdir $UMLHOME echo "." ;; restart) $0 $NICE $1 $2 $3 stop delay 100 $0 $NICE $1 $2 $3 start ;; backup) if [ -b $VOLUME/$UMLUSER-backup ]; then echo "backup-partition already exists. Please rename/delete it first" >&2 exit 1 fi su -c "HOME=$UMLHOME /usr/bin/uml_mconsole $UMLUSER stop" $UMLUSER su -c "HOME=$UMLHOME /usr/bin/uml_mconsole $UMLUSER sysrq s" $UMLUSER lvcreate -L $DISKSPACE -s -n $UMLUSER-backup $VOLUME/$UMLUSER su -c "HOME=$UMLHOME /usr/bin/uml_mconsole $UMLUSER go" $UMLUSER ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|restart|backup}" >&2 exit 1 ;; esac exit 0