#!/bin/bash # # vcached: VServer cache allocator # # Description: A script that preallocates vservers and stores them in # a cache. Preallocated vservers from the cache may be then used to # instantiate real vservers. Requires that /var/run/vcached.pid does # not exist on startup. Should run periodically as a cron job. # # Based on work by: # # Brent Chun - bnc@intel-research.net # Tristan Koo - tristan.koo@intel-research.net # William Wung - wungism@uclink.berkeley.edu # # Mark Huang # Copyright (c) 2004-2005 The Trustees of Princeton University # # $Id$ # PATH=/sbin:/usr/sbin:$PATH # number of images to keep cached slots=32 # PID file pidfile=/var/run/vcached.pid # log file logfile=/var/log/vcached.log # debug debug=0 usage() { echo "usage: vcached [OPTION...]" echo " -s [slots] number of images to keep cached" echo " -p [pidfile] PID file" echo " -l [logfile] log file" echo " -d debug" exit 1 } # parse options while getopts 's:p:l:dh' OPT ; do case "$OPT" in s) slots=$OPTARG ;; p) pidfile=$OPTARG ;; l) logfile=$OPTARG ;; d) debug=1 ;; h|*) usage ;; esac done # append output to log file exec 1>>$logfile exec 2>>$logfile # check if we are already running if [ -f $pidfile ] && kill -0 `cat $pidfile` >/dev/null 2>&1 ; then echo "vcached(`cat $pidfile`) already running" exit 1 fi echo $$ > $pidfile # clean up lock file before exiting trap "rm -f $pidfile" EXIT : ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars} test -e "$UTIL_VSERVER_VARS" || { echo "Can not find util-vserver installation; aborting..." exit 1 } . "$UTIL_VSERVER_VARS" # make sure barrier bit is set on /vservers to prevent chroot() escapes setattr --barrier $__DEFAULT_VSERVERDIR # take out the trash #rm -rf "$__DEFAULT_VSERVERDIR/.vtmp" mkdir -p "$__DEFAULT_VSERVERDIR/.vcache" mkdir -p "$__DEFAULT_VSERVERDIR/.vtmp" [ $debug -ne 0 ] && echo "$(date) Checking the cache" for i in $(seq 0 $(($slots - 1))) ; do if [ ! -d "$__DEFAULT_VSERVERDIR/.vcache/v$i" ] ; then echo "$(date) Caching v$i" # build image in .vtmp TMP=$(mktemp -d "$__DEFAULT_VSERVERDIR/.vtmp/v$i.XXXXXX") "$_VCLONE" "$__DEFAULT_VSERVERDIR/.vref/default/" "$TMP"/ RETVAL=$? # move it to .vcache when complete if [ $RETVAL -eq 0 ] ; then mv "$TMP" "$__DEFAULT_VSERVERDIR/.vcache/v$i" echo "$(date) v$i ready" else echo "$(date) Error $RETVAL building v$i" rm -rf "$TMP" fi fi done exit 0