|
|
#!/bin/bash
# -----------------------------------------------------------------------------
# Copyright (c) 2007..2010 - RZ Uni FR
# Copyright (c) 2007..2010 - OpenSLX GmbH
#
# This program is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
#
# If you have any feedback please consult http://openslx.org/feedback and
# send your suggestions, praise, or complaints to feedback@openslx.org
#
# General information about OpenSLX can be found at http://openslx.org/
# -----------------------------------------------------------------------------
# vmgrid
# - Script for autostarts defined in vmgrid::startvms
################################################################################
# include default directories
. /etc/opt/openslx/openslx.conf
################################################################################
### Manual Start
################################################################################
if [ -n "$1" ]; then
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
echo -e "Usage: vmgrid [[-g] [--forcemem <memorysize in MB>] \c"
echo -e "[/path/]filename[.xml]]"
exit 0
else
echo "Starting run-vmgrid.sh with options '$@'"
run-vmgrid.sh $@ 2>/dev/null
exit
fi
fi
################################################################################
### Define default dirs / get configs
################################################################################
PLUGINCONFROOT=${OPENSLX_DEFAULT_CONFDIR}/plugins
PLUGINCONFDIR=${PLUGINCONFROOT}/vmgrid
RWSHARE=/var/opt/openslx/plugins/vmgrid/share
# include general configuration from vmgrid
[ -f ${PLUGINCONFDIR}/vmgrid.conf ] && \
. ${PLUGINCONFDIR}/vmgrid.conf
# load general virtualization information
[ -f ${PLUGINCONFROOT}/virtualization/virtualization.conf ] && \
. ${PLUGINCONFROOT}/virtualization/virtualization.conf
# get the vmchooser_active var
[ -f ${PLUGINCONFROOT}/vmchooser/vmchooser.conf ] && \
. ${PLUGINCONFROOT}/vmchooser/vmchooser.conf
################################################################################
### Functions used throughout the script
################################################################################
# function to write to stdout and logfile
writelog () {
# write to stdout
echo -e "$1"
# log into file
echo -e "$1" >> ${OPENSLX_DEFAULT_LOGDIR}/run-vmgrid.${USER}.$$.log
# log into share dir, so that log is available in vm as well
echo -e "$1" >> ${vmgrid_rwmnt}/logs/run-vmgrid.${USER}.$$.log
}
################################################################################
### Configure VMs for autostart and set RAM
################################################################################
# start to log, create shrare log dir
mkdir -m 1777 -p ${vmgrid_rwmnt}/logs
mkdir -m 1777 -p /tmp/vmgrid
mkdir -p /tmp/vmgrid/${USER}
echo "Starting to log at $(date)" \
>${vmgrid_rwmnt}/logs/run-vmgrid.${USER}.$$.log
# remove blanks
vmgrid_memratio=$(echo ${vmgrid_memratio} | sed -e "s, *,,g")
vmgrid_startvms=$(echo ${vmgrid_startvms} | sed -e "s, *,,g")
# get hostmem, totalmem from stage 3
hostratio=$(echo ${vmgrid_memratio} | awk -F ',' '{print $6}')
hostmem=$(expr ${totalmem} \* ${hostratio} / 100 2>/dev/null)
if [ ${hostmem} -lt 256 2>/dev/null ]; then
hostmem=256
writelog "${hostmem} MB RAM reserved for host"
fi
# get other vm mem
if [ -n "${vmchooser_active}" ]; then
othervmratio=$(echo ${vmgrid_memratio} | awk -F ',' '{print $5}')
othervmmem=$(expr ${totalmem} \* ${othervmratio} / 100 2>/dev/null)
if [ ${othervmmem} -lt 512 2>/dev/null ]; then
othervmmem=512
writelog "${othervmmem} MB RAM reserved for other virtualization solutions"
fi
else
othervmratio=0
othervmmem=0
fi
# calculate freemem
freemem=$(expr ${totalmem} - ${hostmem} - ${othervmmem} 2>/dev/null)
if [ ${freemem} -lt 512 2>/dev/null ]; then
writelog "Not enough free RAM for this plugin, free: ${freemem} MB"
exit 1
fi
# ratio minus other vms and host
restratio=$(expr 100 - ${hostratio} - ${othervmratio})
# get clients mem ratio
vmsumratios=0
for i in {1..4}; do
vm[$i]=$(echo ${vmgrid_startvms} | awk -F ',' '{print $1}')
# remove ${vm[$i]} from list because of '{print $1}'
vmgrid_startvms=$(echo ${vmgrid_startvms} | sed -e "s,${vm[$i]}\,*,,")
vmratio[$i]=$(echo ${vmgrid_memratio} | awk -F ',' '{print $1}')
# remove ${vmratio[$i]} from list because of '{print $1}'
vmgrid_memratio=$(echo ${vmgrid_memratio} | sed -e "s/${vmratio[$i]},*//")
vmsumratios=$(expr ${vmsumratios} + ${vmratio[$i]} 2>/dev/null)
done
# ratio test: 100 - host - other vm + grid ratios
ratiotest=$(expr 100 - ${restratio} + ${vmsumratios} 2>/dev/null)
if [ ${ratiotest} -gt 100 ]; then
#writelog "you managed to get over 100% in ratio Einstein: ${ratiotest}%"
exit 1
fi
for i in {1..4}; do
# calculate vms mem: mem = $freemem * $vmratio/100 * 100/$restratio
# multiple of 4
vmmem[$i]=$(expr ${freemem} \* ${vmratio[$i]} / ${restratio} / 4 \* 4 \
2>/dev/null)
if [ -n "${vm[$i]}" ] && [ ${vmmem[$i]} -lt 512 2>/dev/null ]; then
writelog "Not enough free RAM for ${vm[$i]} (min. 512 MB), \c"
writelog "free: ${vmmem[$i]} MB"
unset vm[$i]
fi
done
################################################################################
### Start the VMs
################################################################################
# start vms
for i in {1..4}; do
if [ -n "${vm[$i]}" ]; then
alreadyrunning=$(ps aux | grep run-vmgrid.sh | grep -v grep | \
grep "${vm[$i]}" | wc -l)
if [ ${alreadyrunning} -gt 0 2>/dev/null ]; then
writelog "${vm[$i]} already running, skipping!"
else
writelog "Starting ${vm[$i]} via run-vmgrid.sh with ${vmmem[$i]} MB RAM"
run-vmgrid.sh --forcemem ${vmmem[$i]} ${vm[$i]} 2>/dev/null &
echo $! > /tmp/vmgrid/${USER}/vmgrid.pids
# wait 5 secs for the next vm to start
sleep 10
fi
fi
done
exit 0
|