X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-xen-config.git/blobdiff_plain/fff5d4676e603f215db69aa580580e2e32717a8d..70660d7da71a10f52d18c31a08874c3e695710a3:/debian/invirt-xen-config.init diff --git a/debian/invirt-xen-config.init b/debian/invirt-xen-config.init index e45b253..430ae9e 100755 --- a/debian/invirt-xen-config.init +++ b/debian/invirt-xen-config.init @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash ### BEGIN INIT INFO # Provides: invirt-xen-config # Required-Start: $local_fs $remote_fs @@ -10,17 +10,58 @@ ### END INIT INFO PACKAGE=invirt-xen-config +NAME="$PACKAGE" +DESC="Invirt Xen host" PARENTPACKAGE=xend -GEN_FILES=/etc/xen/xend-config.sxp +SYSVMS=(s_master s_remote s_console) +GEN_FILES=(/etc/xen/xend-config.sxp.invirt "${SYSVMS[@]/#//etc/xen/sysvms/}") dpkg -s "$PACKAGE" >/dev/null 2>/dev/null || exit 0 . /lib/init/gen-files.sh . /lib/init/std-init.sh -do_start() { +start_sysvm() { + # Attempt to start a sysvm, but only if it's not running already + # somewhere on the cluster + + VM="$1" + DISK="/dev/xenvg/${VM}_hda" + + # Don't bother trying to start the VM if it's already running + if xm list "$1" >/dev/null 2>&1; then + return 1 + fi + + if lvchange -a n "$DISK" >/dev/null 2>&1 && lvchange -a ey "$DISK" >/dev/null 2>&1; then + # If we can disable and then re-enable the VMs disk, then the + # VM can't be running. If the lvchange -a ey succeeds, then we + # have an exclusive lock across the cluster on enabling the + # disk, which avoids the potential race condition of two hosts + # starting a VM at the same time + [ "$VERBOSE" != no ] && log_daemon_msg "Starting sysvm $VM" + xm create "sysvms/$VM" >/dev/null + [ "$VERBOSE" != no ] && log_end_msg $? + RET=0 + else + RET=1 + fi + + # Regardless of whether we could get the lock or not, the + # lvchange -a n probably disabled the LV somewhere; be sure we + # clean up + lvchange -a y "$DISK" >/dev/null 2>&1 + + return $RET +} + +do_startup() { gen_files + for vm in "${SYSVMS[@]}"; do + start_sysvm "$vm" + done + echo 1 >/proc/sys/net/ipv4/ip_forward for i in all default; do echo 1 >/proc/sys/net/ipv4/conf/$i/rp_filter @@ -30,12 +71,16 @@ do_start() { invoke-rc.d "$PARENTPACKAGE" "$1" } +do_start() { + do_startup "start" +} + do_reload() { - do_start + do_startup "reload" } do_stop() { - invoke-rc.d "$PARENTPACKAGE" "$1" + invoke-rc.d "$PARENTPACKAGE" stop } std_init "$1"