#!/bin/bash # ----------------------------------------------------------------------------- # Copyright (c) 2010 - RZ Uni FR # Copyright (c) 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] [--mem ] \c" echo -e "[--nice ] [/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 ################################################################################ ### 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}/vmgrid.${USER}.$$.log # log into share dir, so that log is available in vm as well echo -e "$1" >> ${vmgrid_rwmnt}/logs/vmgrid.${USER}.$$.log } ################################################################################ ### Configure VMs for autostart and set RAM ################################################################################ # start to log, create share 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/vmgrid.${USER}.$$.log if [ -z "${hostratio}" ]; then writelog "There has been an error in the memory configuration in stage 3" writelog "Please check your memory ratio settings, exiting!" exit 1 fi if [ -z "${hostratio}" ]; then writelog "There has been an error in the memory configuration in stage 3" writelog "Please check your memory ratio settings, exiting!" exit 1 fi # remove blanks vmgrid_startvms=$(echo ${vmgrid_startvms} | sed -e "s, *,,g") vmgrid_memratio=$(echo ${vmgrid_memratio} | sed -e "s, *,,g") # hostmem, mainvirt from virtualization plugin # ratio minus other vms and host restratio=$(expr 100 - ${hostratio} - ${mainvirtratio}) # hostmem, totalmem, mainvirtmem from virtualization plugin # calculate freemem freemem=$(expr ${totalmem} - ${hostmem} - ${mainvirtmem} 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 # 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 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 Xen use different method if [ "${vmgrid_virt}" = "xen" ]; then alreadyrunning=$(xm list 2>/dev/null | grep -vE "Domain-0|Name.*ID" \ | grep "${vm[$i]}-0.$" | wc -l) fi 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 --mem ${vmmem[$i]} ${vm[$i]} 2>/dev/null & echo $! > /tmp/vmgrid/${USER}/vmgrid.pids # wait 10 secs for the next vm to start sleep 10 fi fi done exit 0