#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin #constants START_PORT=10000 PORTS_PER_UML=1000 VOLUMEGROUP=vg1 BACKUPBLOCKSIZE=16M 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=/dev/mapper/$VOLUMEGROUP-$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" # Speicher Masterseitig auf Max 1 GB setzen. echo 262144 > /proc/sys/vm/max_map_count test -d $UMLHOME || mkdir $UMLHOME test -d $UMLHOME/tmp || mkdir $UMLHOME/tmp mount -t tmpfs -o mode=1777,size=$((`echo $MEM | tr M ' '`*2))M none $UMLHOME/tmp chown $UMLUSER $UMLHOME tunctl -u $UMLUSER -t $TAPDEV > /dev/null ifconfig $TAPDEV up brctl addif br0 $TAPDEV || echo creation of $TAPDEV failed chown $UMLUSER $PARTITION /usr/bin/screen -d -m -- su -c "HOME=$UMLHOME TMP=$UMLHOME/tmp $NICE $KERNEL $MEMORY $UMID $NETWORK $DISKS $CONSOLES" $UMLUSER #ip-forwarding einschalten echo 1 > /proc/sys/net/ipv4/ip_forward 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 <= 120 ; 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 umount $UMLHOME/tmp #rmdir $UMLHOME echo "." ;; restart) $0 $NICE $1 $2 $3 stop delay 100 $0 $NICE $1 $2 $3 start ;; backup) if [ -b /dev/$VOLUMEGROUP/$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 # Snapshotting is not working properly in 2.6 kernels #lvcreate -L $DISKSPACE -s -n $UMLUSER-backup /dev/$VOLUMEGROUP/$UMLUSER || echo backup of /dev/$VOLUMEGROUP/$UMLUSER failed (lvcreate -L $DISKSPACE -n $UMLUSER-backup $VOLUMEGROUP && dd if=/dev/$VOLUMEGROUP/$UMLUSERof=/dev/$VOLUMEGROUP/$UMLUSER-backup bs=$BACKUPBLOCKSIZE) || echo backup of /dev/$VOLUMEGROUP/$UMLUSER failed 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