blob: 1db41d3244d7cba0a0552a5002f668f6585370a3 [file] [log] [blame] [raw]
#!/bin/sh
# Copyright (C) 2000-2006 SWsoft. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
#
# OpenVZ startup script
###
# chkconfig: 2345 96 88
# description: OpenVZ startup script.
###
### BEGIN INIT INFO
# Provides: vz
# required-start: $network $remote_fs $local_fs sshd
# required-stop:
# Default-Start: 2 3 5
# Default-Stop:
# Description: OpenVZ startup script.
### END INIT INFO
# This line is needed to cheat /etc/init.d/rc who expects action word
VZCONF=/etc/vz/vz.conf
[ -f ${VZCONF} ] || exit 0
. ${VZCONF}
[ "${VIRTUOZZO}" = "no" ] && exit 0
VZCTL=/usr/sbin/vzctl
VZQUOTA=/usr/sbin/vzquota
LOCKFILE=/var/lock/subsys/vz_lock
PROC_VZVEINFO=/proc/vz/veinfo
[ -x ${VZCTL} ] || exit 0
VZDEV=venet0
PRELOAD_MODULES="af_packet"
MODULES="vzmon vzdquota vzdev"
CPT_MODULES="vzcpt vzrst"
VETH_MODULES="vzethdev"
MODULES_OTHER="vzcompat ${CPT_MODULES} ${VETH_MODULES}"
NET_MODULES="vznetdev vznet"
IPT_MODULES="ip_tables ${IPTABLES}"
if [ "${VZWDOG}" = "yes" ]; then
MODULES="${MODULES} vzwdog"
fi
CONFIG_DIR=/etc/vz/conf
rc_done='..done'
rc_failed='..failed'
# Source function library.
if [ -r /etc/init.d/functions ]; then
source /etc/init.d/functions
if [ -r /etc/redhat-release ] || [ -r /etc/centos-release ]; then
DISTR=redhat
fi
elif [ -r /etc/rc.status ]; then
source /etc/rc.status
if [ -r /etc/SuSE-release ]; then
DISTR=suse
fi
fi
VEINFO=""
RETVAL=0
PARALLEL=4
cd /
check_is_root()
{
ID=`id -u`
if [ ! $ID -eq 0 ]; then
echo "You need to be root to run this command."
exit 1
fi
}
get_veinfo()
{
if [ -f /proc/vz/veinfo ]; then
VEINFO=/proc/vz/veinfo
elif [ -f /proc/veinfo ]; then
VEINFO=/proc/veinfo
else
return 1
fi
return 0
}
print_success()
{
if [ "$DISTR" = "redhat" ]; then
echo_success
else
echo -n "$rc_done"
fi
echo
}
print_failure()
{
if [ "$DISTR" = "redhat" ]; then
failure $"$1"
else
echo -n "$rc_failed"
fi
echo
}
__echo()
{
if [ "$DISTR" = "redhat" ]; then
echo -n $"$1"
else
echo -n "$1"
fi
}
status()
{
local base=${0##*/}
if get_veinfo; then
echo "OpenVZ is running..."
return 0
else
echo "OpenVZ is stopped."
return 3
fi
}
function setup_net()
{
local mod
if ip a l | grep -q "venet0:.*UP" 2>/dev/null; then
return 0
fi
for mod in ${NET_MODULES}; do
modprobe ${mod} 2>/dev/null
done
__echo "Bringing up interface $VZDEV: "
ip link set $VZDEV up
if [ $? -eq 0 ] ; then
print_success
else
print_failure
fi
ip addr add 0.0.0.0/0 dev $VZDEV
__echo "Configuring interface $VZDEV: "
sysctl -w net.ipv4.conf.$VZDEV.send_redirects=0 >/dev/null
if [ $? -eq 0 ] ; then
print_success
else
print_failure
fi
if [ "${IPV6}" = "yes" ]; then
__echo "Configuring ipv6 $VZDEV: "
# Fix me: ip addres should be generated
ip -6 addr add fe80::1/128 dev $VZDEV
if [ $? -eq 0 ] ; then
print_success
else
print_failure
fi
fi
}
function hn_setup()
{
if test -z "${VE0CPUUNITS}"; then
echo "Warning: VE0CPUUNITS is not set in ${VZCONF}; using value of 1000"
VE0CPUUNITS=1000
fi
msg=`${VZCTL} set 0 --cpuunits ${VE0CPUUNITS} 2>&1`
if [ $? -ne 0 ]; then
print_failure "vzctl set 0 --cpuunits ${VE0CPUUNITS} failed: $msg"
fi
if ! test -f "${CONFIG_DIR}/0.conf"; then
return
fi
if ! grep -q '^ONBOOT=yes\|^ONBOOT=\"yes\"' ${CONFIG_DIR}/0.conf;
then
return
fi
__echo "Configure node UB resources: "
msg=`$VZCTL set 0 --reset_ub 2>&1`
if [ $? -eq 0 ]; then
print_success
else
print_failure "$msg"
fi
}
function ve_start()
{
local veid
local velist
local msg
local need_restart
need_restart=""
cd ${CONFIG_DIR} || return
velist=`grep -l '^ONBOOT=yes\|^ONBOOT=\"yes\"' [0-9]*.conf 2>/dev/null | \
sed -e 's/.conf//g' | sort -n`
cd - >/dev/null
echo "0" > /proc/sys/net/ipv4/route/src_check
for veid in $velist; do
[ "${veid}" = "0" ] && continue
__echo "Starting VE ${veid}: "
if [ "x${VZFASTBOOT}" = "xyes" -a "x${DISK_QUOTA}" = "xyes" ];
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`
if [ $? -eq 0 ]; then
print_success
else
print_failure "$msg"
fi
done
for veid in ${need_restart}; do
__echo "Stopping VE ${veid}: "
$VZCTL stop ${veid} 2>&1 >/dev/null 2>&1
if [ $? -eq 0 ]; then
print_success
else
print_failure "$msg"
fi
__echo "Starting VE ${veid}: "
msg=`$VZCTL start ${veid} 2>&1`
if [ $? -eq 0 ]; then
print_success
else
print_failure "$msg"
fi
done
}
function ve_stop()
{
local veid
local velist
local msg
local m
local mounts
local fail
local iter
local quota
local pids
if get_veinfo; then
for ((i = 0; i <= 2; i++)); do
iter=0;
pids=
velist=`awk '{print $1;}' < ${VEINFO} | grep -v "^0$"`
for veid in $velist; do
echo "Shutting down VE $veid"
# Set fairsched parameters to maximum so
# VE 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 test $iter -lt 5 -a $fail -ne 0; do
fail=0
mounts=`awk '{if ($3=="simfs") print $2}' /proc/mounts`
for m in $mounts; do
__echo "Unmounting VE area "
echo -n $m
msg=`umount $m 2>&1`
if [ $? -eq 0 ]; then
print_success
else
print_failure "$msg"
fail=$((fail+1))
fuser -k -m ${m} > /dev/null 2>&1
fi
done
iter=$((iter+1))
done
# turn quota off
quota=`awk -F: '/^[0-9]+:/{print $1}' /proc/vz/vzquota 2>/dev/null`
for m in ${quota}; do
__echo "Turn quota off for VE "
echo -n $m
msg=`vzquota off ${m} 2>&1`
if [ $? -eq 0 ]; then
print_success
else
print_failure "$msg"
fi
done
}
function lockfile()
{
local TEMPFILE="${1}.$$"
local LOCKFILE="${1}"
echo $$ > ${TEMPFILE} 2> /dev/null || {
echo "Can't write to ${TEMPFILE}"
}
ln ${TEMPFILE} ${LOCKFILE} >/dev/null 2>&1 && {
rm -f ${TEMPFILE};
return 0;
}
kill -0 `cat $LOCKFILE` >/dev/null 2>&1 && {
return 1;
}
ln ${TEMPFILE} ${LOCKFILE} >/dev/null 2>&1 && {
rm -f ${TEMPFILE};
return 0;
}
rm -f ${LOCKFILE}
echo $$ > ${LOCKFILE}
return 0
}
function start()
{
local veid
local velist
local msg
if ! lockfile $LOCKFILE; then
__echo "OpenVZ is locked"
print_failure
return 1
fi
if [ -f /var/lock/subsys/vz ]; then
__echo "OpenVZ already running"
print_failure
return 1
fi
__echo "Starting OpenVZ: "
load_modules "${IPT_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
RETVAL=$?
if [ $RETVAL -ne 0 ]; then
print_failure "Loading module ${MOD}"
return $RETVAL
fi
done
load_modules "${MODULES_OTHER}"
print_success "loading OpenVZ modules"
if [ ! -e /dev/vzctl ]; then
# On most modern distros udev will create a device for you,
# while on the old distros /dev/vzctl comes with vzctl rpm.
# So the below mknod call is probably not needed at all.
/bin/mknod -m 600 /dev/vzctl c 126 0 > /dev/null 2>&1
RETVAL=$?
if [ $RETVAL -ne 0 ]; then
__echo "creating vzctl device"
print_failure
return $RETVAL
fi
fi
setup_net
hn_setup
ve_start
rm -f $LOCKFILE
touch /var/lock/subsys/vz
}
function stop()
{
if ! lockfile $LOCKFILE; then
__echo "OpenVZ is locked"
print_failure
RETVAL=1
return 1
fi
ve_stop
__echo "Stopping OpenVZ: "
ip link set ${VZDEV} down 2>/dev/null
for MOD in $MODULES; do
/sbin/modprobe -r $MOD > /dev/null 2>&1
done
for MOD in $PRELOAD_MODULES ${IPT_MODULES2} ${NET_MODULES}; do
/sbin/modprobe -r $MOD > /dev/null 2>&1
done
print_success
rm -f $LOCKFILE
rm -f /var/lock/subsys/vz
}
function load_modules()
{
local modules=$1
local mod
for mod in ${modules}; do
if /sbin/lsmod | grep -qw ${mod}; then
continue
fi
/sbin/modprobe $mod >/dev/null 2>&1
done
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
RETVAL=$?
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
exit 1
esac
exit $RETVAL