summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'vzctl/init.d')
-rw-r--r--vzctl/init.d/vz.initd245
1 files changed, 245 insertions, 0 deletions
diff --git a/vzctl/init.d/vz.initd b/vzctl/init.d/vz.initd
new file mode 100644
index 0000000..665be64
--- /dev/null
+++ b/vzctl/init.d/vz.initd
@@ -0,0 +1,245 @@
+#!/sbin/runscript
+# Copyright 1999-2005 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/sys-cluster/vzctl/files/vz.initd,v 1.1 2005/09/26 15:32:35 hollow Exp $
+
+depend() {
+ need net
+ before iptables
+}
+
+check_config() {
+ # if we don't want openvz running, say so
+ [ "${VIRTUOZZO}" = "yes" ] || return 1
+
+ # set default values
+ : ${VZCTL:=/usr/sbin/vzctl}
+ : ${VZQUOTA:=/usr/sbin/vzquota}
+ : ${VZVEINFO:=/proc/vz/veinfo}
+ : ${VPSCONFDIR:=/etc/vz}
+ : ${PRELOAD_MODULES:="af_packet"}
+ : ${MODULES:="vzmon vzdquota vzdev"}
+ : ${NET_MODULES="vznetdev vznet"}
+ : ${VZDEV:=venet0}
+ : ${PARALLEL:=4}
+
+ # check if you should load vzwdog module
+ [ "${VZWDOG}" = "yes" ] && MODULES="${MODULES} vzwdog"
+
+ # we need a working vzctl
+ if [ ! -x "${VZCTL}" ]; then
+ eerror "vzctl missing (${VZCTL})"
+ return 1
+ fi
+
+ # prevent dumb users from failure
+ if [ ! -e /dev/vzctl ]; then
+ eerror "Missing device node /dev/vzctl"
+ einfo
+ einfo "Please create the vzctl device node using the following command:"
+ einfo " /bin/mknod /dev/vzctl c 126 0"
+ einfo
+ return 1
+ fi
+
+ if [ -z "${VE0CPUUNITS}" ]; then
+ ewarn "VE0CPUUNITS is not set in /etc/conf.d/vz; using default value of 1000"
+ VE0CPUUNITS=1000
+ fi
+ return 0
+}
+
+start_net() {
+ local mod
+
+ # we don't operate on a running interface
+ if /sbin/ip addr ls | grep -q "venet0:.*UP" 2>/dev/null; then
+ return 0
+ fi
+
+ # load necessary modules
+ for mod in ${NET_MODULES}; do
+ /sbin/modprobe ${mod} 2>/dev/null
+ done
+
+ # configure the device
+ ebegin "Bringing up interface ${VZDEV}"
+ /sbin/ip link set ${VZDEV} up
+ eend $?
+
+ /sbin/ip addr add 0.0.0.0/0 dev ${VZDEV}
+
+ ebegin "Configuring interface ${VZDEV}"
+ /sbin/sysctl -q -w net.ipv4.conf.${VZDEV}.send_redirects=0
+ eend $?
+}
+
+stop_net() {
+ local mod
+
+ if /sbin/ip a l | grep -q "venet0:.*UP" 2>/dev/null; then
+ ebegin "Bringing down interface ${VZDEV}"
+ /sbin/ip link set ${VZDEV} down 2>/dev/null
+ eend $?
+ fi
+
+ # remove all modules we probably loaded on start_net
+ for mod in ${NET_MODULES}; do
+ /sbin/modprobe -r ${mod} > /dev/null 2>&1
+ done
+}
+
+start_ve() {
+ local veid velist msg need_restart=""
+
+ # get all VPSs we should start on boot
+ if ! cd ${VPSCONFDIR}; then
+ eerror $? "Unable to cd to ${VPSCONFDIR}"
+ return 1
+ fi
+ velist=$(grep -l '^ONBOOT=yes\|^ONBOOT=\"yes\"' [0-9]*.conf 2>/dev/null | sed -e 's/.conf//g' | sort -n)
+ cd - >/dev/null
+
+ /sbin/sysctl -q -w net.ipv4.route.src_check=0
+
+ for veid in ${velist}; do
+ ebegin "Starting VPS ${veid}"
+ if [ "${VZFASTBOOT}" = "yes" -a "${DISK_QUOTA}" = "yes" ]; then
+ ${VZQUOTA} stat ${veid} >/dev/null 2>&1
+ if [ $? -eq 6 ]; then
+ if ${VZQUOTA} show ${veid} 2>&1 | grep "vzquota : (warning) Quota is running" >/dev/null 2>&1; then
+ ${VZQUOTA} on ${veid} --nocheck >/dev/null 2>&1
+ need_restart="${need_restart} ${veid}"
+ fi
+ fi
+ fi
+ msg=$(${VZCTL} start ${veid} 2>&1)
+ eend $? "${msg}"
+ done
+
+ for veid in ${need_restart}; do
+ ebegin "Stopping VPS ${veid}"
+ msg=$(${VZCTL} stop ${veid})
+ eend $? "${msg}"
+
+ ebegin "Starting VPS ${veid}"
+ msg=$($VZCTL start ${veid} 2>&1)
+ eend $? "${msg}"
+ done
+
+ # we're ok even if some VPSs failed to start
+ return 0
+}
+
+stop_ve() {
+ local veid velist msg m mounts fail i iter pid pids quota
+
+ if [ -f ${VZVEINFO} ]; then
+ for ((i = 0; i <= 2; i++)); do
+ iter=0
+ pids=
+ velist=$(awk '{print $1;}' < ${VZVEINFO} | grep -v "^0$")
+
+ for veid in ${velist}; do
+ ebegin "Shutting down VPS $veid"
+ # Set fairsched parameters to maximum so
+ # VPS will stop fast
+ ${VZCTL} set ${veid} --cpuunits 2000 --cpulimit 0 >/dev/null 2>&1
+ ${VZCTL} --skiplock stop ${veid} >/dev/null 2>&1 &
+ pids="${pids} $!"
+ let iter++
+ sleep 1
+ if [ ${iter} -gt ${PARALLEL} ]; then
+ for pid in ${pids}; do
+ wait ${pid}
+ done
+ pids=
+ iter=0
+ fi
+ done
+
+ for pid in ${pids}; do
+ wait ${pid}
+ done
+ done
+ fi
+
+ iter=0
+ fail=1
+
+ while [ ${iter} -lt 5 -a ${fail} -ne 0 ]; do
+ fail=0
+ mounts=$(awk '{if ($3=="simfs") print $2}' /proc/mounts)
+
+ for m in ${mounts}; do
+ ebegin "Unmounting VPS area ${m}"
+ msg=$(umount ${m} 2>&1)
+ eend $? "${msg}"
+ if [ $? -ne 0 ]; then
+ let fail++
+ fuser -k -m ${m} > /dev/null 2>&1
+ fi
+ done
+
+ let iter++
+ done
+
+ # turn quota off
+ quota=$(awk -F: '/^[0-9]+:/{print $1}' /proc/vz/vzquota 2>/dev/null)
+
+ for m in ${quota}; do
+ ebegin "Turning quota off for VPS ${m}"
+ msg=$(vzquota off ${m} 2>&1)
+ eend $? "${msg}"
+ done
+}
+
+start() {
+ check_config || return
+
+ local msg mod rc
+
+ ebegin "Loading OpenVZ modules"
+ for mod in ${PRELOAD_MODULES}; do
+ /sbin/modprobe -r ${mod} >/dev/null 2>&1
+ /sbin/modprobe ${mod} >/dev/null 2>&1
+ done
+
+ for mod in ${MODULES}; do
+ /sbin/modprobe ${mod} >/dev/null 2>&1
+ rc=$?
+ if [ ${rc} -ne 0 ]; then
+ eend ${rc} "failed to load module ${mod}"
+ return ${rc}
+ fi
+ done
+ eend
+
+ start_net
+
+ msg=$(${VZCTL} set 0 --cpuunits ${VE0CPUUNITS} 2>&1)
+ [ $? -ne 0 ] && ewarn "vzctl set 0 --cpuunits ${VE0CPUUNITS} failed: ${msg}"
+
+ start_ve
+}
+
+stop() {
+ check_config || return
+
+ local mod
+
+ stop_ve
+ stop_net
+
+ for mod in ${MODULES}; do
+ /sbin/modprobe -r ${mod} > /dev/null 2>&1
+ done
+
+ for mod in ${PRELOAD_MODULES}; do
+ /sbin/modprobe -r ${mod} > /dev/null 2>&1
+ done
+
+ # Even if some modules failed to unload (say they were not loaded)
+ # we return 0 for the service to be marked as stopped.
+ return 0
+}