Hi On Fri, Apr 13, 2007 at 07:59:21PM +0400, Kir Kolyshkin wrote: > Ola Lundqvist wrote: > >Hi Kir > > > >On Fri, Apr 13, 2007 at 06:16:25PM +0400, Kir Kolyshkin wrote: > > > >>I see two distinct problems described in this bug report: > >>1. simfs not loaded > >>2. (enhancement) check running kernel config > >> > >>Both are fixed in vzctl git. > >> > >>Check for kernel config options: > >>http://git.openvz.org/?p=vzctl;a=commit;h=8adf5dcc9dda2f621d6df7cec88ad6ab16bb5041 > >> > >>Loading simfs module: > >>http://git.openvz.org/?p=vzctl;a=commit;h=f09fd723bbe70d98b772bd9d13fdf844d14cad59 > >> > > > >Thanks a lot for this information. > > > > > >>Will be available in vzctl-3.0.17. The only thing I'm not sure about if > >>this initscript (etc/init.d/vz-redhat.in) is used by Debian. > >> > > > >Yes it is, but with a patch. Maybe you can include that as well? About half > >of it is compatible with redhat, but something need to be done about this > >subsys thing that do not exist in debian. Is that directory really needed? > > > By Red Hat standards -- yes. But we can determine the distro runtime and > fix the appropriate variables, can't we?
Yes. :) > Can I rely on Debian having /etc/debian.version and > /lib/lsb/init-functions (and not having /etc/init.d/functions and > /etc/rc.status)? No... On sarge: ls -l /lib/lsb/init-functions ls: /lib/lsb/init-functions: File or directory not found ls -l /etc/debian.version ... same thing > If yes -- patch is attached for your review (against the latest vzctl > git). For convenience, I'm also attaching the actual script. I think it is better to check for the actual directory needed, that is /var/run/subsys. :) If it is not found, use /var/run instead. Regards, // Ola > >At least short description and force-reload should be possible to include > >in the RedHat version. :) > > > >The patch is as follows: > > > >--- vzctl-3.0.16.orig/etc/init.d/vz-redhat.in > >+++ vzctl-3.0.16/etc/init.d/vz-redhat.in > >@@ -1,4 +1,4 @@ > >-#!/bin/sh > >+#!/bin/bash > > > > Why you change it to bash? Is there something bash-specific in the > script? If yes, I'd like to kill it out. > > > # Copyright (C) 2000-2007 SWsoft. All rights reserved. > > # > > # This program is free software; you can redistribute it and/or modify > >@@ -30,6 +30,7 @@ > > # Default-Start: 2 3 5 > > # Default-Stop: > > # Description: OpenVZ startup script. > >+# Short-Description: OpenVZ startup script > > ### END INIT INFO > > > > > > > > > >@@ -43,7 +44,7 @@ > > > > > > [EMAIL PROTECTED]@/vzctl > > [EMAIL PROTECTED]@/vzquota > >-LOCKFILE=/var/lock/subsys/vz_lock > >+LOCKFILE=/var/lock/vz_lock > > VESTAT=/proc/vz/vestat > > PRELOAD_MODULES= > > MODULES= > >@@ -422,7 +423,7 @@ > > print_failure > > return 1 > > fi > >- if [ -f /var/lock/subsys/vz ]; then > >+ if [ -f /var/lock/vz ]; then > > __echo "OpenVZ already running" > > print_failure > > return 1 > >@@ -463,7 +464,7 @@ > > ve_start > > > > > > rm -f $LOCKFILE > >- touch /var/lock/subsys/vz > >+ touch /var/lock/vz > > } > > > > > > function stop() > >@@ -487,7 +488,7 @@ > > done > > print_success > > rm -f $LOCKFILE > >- rm -f /var/lock/subsys/vz > >+ rm -f /var/lock/vz > > } > > > > > > function load_modules() > >@@ -511,6 +512,10 @@ > > stop) > > stop > > ;; > >+ force-reload) > >+ stop > >+ start > >+ ;; > > restart) > > stop > > start > > > > > >Regards, > > > >// Ola > > > > > > > > > > #!/bin/sh > # Copyright (C) 2000-2007 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. > # Short-Description: OpenVZ startup script > ### END INIT INFO > > > # This line is needed to cheat /etc/init.d/rc who expects action word > > VZCONF=/home/kir/git-local/vzctl/inst/etc/vz/vz.conf > > [ -f ${VZCONF} ] || exit 0 > . ${VZCONF} > [ "${VIRTUOZZO}" = "no" ] && exit 0 > > VZCTL=/home/kir/git-local/vzctl/inst/sbin/vzctl > [ -x ${VZCTL} ] || exit 0 > > VZQUOTA=/home/kir/git-local/vzctl/inst/sbin/vzquota > CONFIG_DIR=/home/kir/git-local/vzctl/inst/etc/vz/conf > LOCKFILE=/var/lock/subsys/vz_lock > SUBSYS_VZ=/var/lock/subsys/vz > VESTAT=/proc/vz/vestat > VZDEV=venet0 > PRELOAD_MODULES= > MODULES= > MODULES_OTHER= > NET_MODULES= > IPT_MODULES= > > if [ "${MODULES_DISABLED}" != "yes" ]; then > PRELOAD_MODULES="af_packet" > MODULES="vzmon vzdquota vzdev" > CPT_MODULES="vzcpt vzrst" > MODULES_OTHER="vzcompat ${CPT_MODULES}" > VNET_MODULES="vznetdev vznet" > VETH_MODULES="vzethdev" > NET_MODULES="${VNET_MODULES} ${VETH_MODULES}" > if [ "${VZWDOG}" = "yes" ]; then > MODULES="${MODULES} vzwdog" > fi > IPT_MODULES="ip_tables ${IPTABLES} xt_tcpudp" > VZFS_MODULES="simfs" > fi > > > 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 > elif [ -r /lib/lsb/init-functions ]; then > source /lib/lsb/init-functions > if [ -f /etc/debian.version ]; then > DISTR=debian > LOCKFILE=/var/lock/vz_lock > SUBSYS_VZ=/var/lock/vz > fi > fi > > VEINFO="" > RETVAL=0 > # Number of the parallel VEs on stop. > # In case empty value the number of parallel VEs calculated as 'num_cpu * 4' > PARALLEL= > cd / > > # We used to install OpenVZ cron job when the vzctl package was > # installed, irrespective of whether OpenVZ was actually being > # run. Although the cron jobs didn't create any problems if someone > # wasn't running OpenVZ some users complained about the cron log file > # filling up, resource usage, and power consumption since systems > # wouldn't really idle. It really only makes sense to run the OpenVZ > # cron job if the vz service is turned on and not just merely > # having the package installed. This init.d script is an obvious place > # to install or remove the cron jobs based on the service > # being enabled or not. > SRC_CRONSCRIPT_DIR=/home/kir/git-local/vzctl/inst/etc/vz/cron > DST_CRONSCRIPT_DIR=/home/kir/git-local/vzctl/inst/etc/cron.d > > check_old_cron_files() > { > # avoid double OpenVZ cron settings > local f > for f in vpsreboot vpsnetclean; do > [ -f $DST_CRONSCRIPT_DIR/$f ] && rm -f $DST_CRONSCRIPT_DIR/$f > done > } > > setup_cron() > { > check_old_cron_files > [ -z "$SRC_CRONSCRIPT_DIR" ] && return > [ -d "$SRC_CRONSCRIPT_DIR" ] || return > install -m644 -o root -g root $SRC_CRONSCRIPT_DIR/vz \ > $DST_CRONSCRIPT_DIR > } > > remove_cron() > { > check_old_cron_files > [ -z "$SRC_CRONSCRIPT_DIR" ] && return > [ -d "$SRC_CRONSCRIPT_DIR" ] || return > cat > $DST_CRONSCRIPT_DIR/vz <<EOF > # DO NOT EDIT THIS FILE! > # > # Contents of this file managed by /etc/init.d/vz script > # Master copy is $SRC_CRONSCRIPT_DIR/vz. > # Consult that file for documentation. > EOF > } > > check_kernel() > { > if ! [ test -d /proc/vz ]; then > print_failure "Running kernel is not OpenVZ kernel." > exit 1 > fi > } > > check_kernel_config() > { > test -r /proc/config.gz || return 0 > > local conf opt err=0 > local opt_must="SIM_FS VE VE_CALLS VZ_GENCALLS VZ_DEV" > # local opt_rec="SCHED_VCPU FAIRSCHED VZ_QUOTA VZ_QUOTA_UGID VE_NETDEV > VE_ETHDEV > # VE_IPTABLES VZ_CHECKPOINT VZ_WDOG" > > conf=$(zcat /proc/config.gz 2>/dev/null | grep -E -v '^#|^$') || return > 0 > > for opt in opt_must; do > if ! echo "$conf" | grep -q "${opt}="; then > __echo "Missing kernel config option: CONFIG_$opt" > err=1 > fi > done > if [ err != 0 ]; then > print_failure "Please recompile your kernel." > exit 1 > fi > } > > get_parallel() > { > [ -n "${PARALLEL}" ] && return > PARALLEL=`awk ' > BEGIN { num=0; } > $1 == "processor" { num++; } > END { print num * 4; }' /proc/cpuinfo` > } > > get_veinfo() > { > if [ -f /proc/vz/veinfo ]; then > VEINFO=/proc/vz/veinfo > elif [ -f /proc/veinfo ]; then > VEINFO=/proc/veinfo > elif [ ! -f $VESTAT ]; then > return 1 > fi > return 0 > } > > print_success() > { > if [ "$DISTR" = "redhat" ]; then > echo_success > elif [ "$DISTR" = "debian" ]; then > : # do nothing > else > echo -n "$rc_done" > fi > echo > } > > print_failure() > { > if [ "$DISTR" = "debian" ]; then > log_failure_msg $1 > return > fi > echo -n "$1" > 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() > { > check_kernel > > if get_veinfo && [ -f $SUBSYS_VZ ]; then > echo "OpenVZ is running..." > return 0 > else > echo "OpenVZ is stopped." > return 3 > fi > } > > start_net() > { > local mod > > if ip a l | grep -q "venet0:.*UP" 2>/dev/null; then > return 0 > fi > # load all kernel modules needed for VE networking > for mod in ${NET_MODULES}; do > modprobe ${mod} 2>/dev/null > done > get_veinfo > if [ -z "$VEINFO" ]; then > return 0 > fi > __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 -q -w net.ipv4.conf.$VZDEV.send_redirects=0 > 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 > } > > stop_net() > { > local mod > > if ip a l | grep -q "venet0:.*UP" 2>/dev/null; then > __echo "Bringing down interface $VZDEV: " > ip link set $VZDEV down > if [ $? -eq 0 ] ; then > print_success > else > print_failure > fi > fi > for mod in ${NET_MODULES}; do > /sbin/modprobe -r ${mod} > /dev/null 2>&1 > done > } > > setup_ve0() > { > 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 > } > > start_ves() > { > 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 > sysctl -q -w net.ipv4.route.src_check=0 > 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 > } > > stop_ves() > { > local veid > local velist > local msg > local m > local mounts > local fail > local iter > local quota > local pids > > if get_veinfo; then > get_parallel > for ((i = 0; i <= 2; i++)); do > iter=0; > pids= > velist=`awk '$1 != "VEID" && $1 != "Version:" {print > $1}' ${VESTAT}` > 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++ > 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 > } > > lockfile() > { > local TEMPFILE="${1}.$$" > local LOCKFILE="${1}" > > trap -- "rm -f ${LOCKFILE} ${TEMPFILE}" EXIT > > 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 > } > > start() > { > local veid > local velist > local msg > local mod > > check_kernel > check_kernel_config > > if ! lockfile $LOCKFILE; then > __echo "OpenVZ is locked" > print_failure > return 1 > fi > if [ -f ${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 "failed to load module ${mod}" > return $RETVAL > fi > done > load_modules "${MODULES_OTHER} ${VZFS_MODULES}" > 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 > print_failure "creating /dev/vzctl" > return $RETVAL > fi > fi > > start_net > setup_ve0 > setup_cron > start_ves > > rm -f $LOCKFILE > touch $SUBSYS_VZ > } > > stop() > { > local mod > > if ! lockfile $LOCKFILE; then > __echo "OpenVZ is locked" > print_failure > RETVAL=1 > return 1 > fi > > stop_ves > remove_cron > stop_net > __echo "Stopping OpenVZ: " > for mod in ${MODULES_OTHER} ${PRELOAD_MODULES} ${IPT_MODULES} > ${VZFS_MODULES}; do > /sbin/modprobe -r ${mod} > /dev/null 2>&1 > done > rm -f $LOCKFILE > rm -f $SUBSYS_VZ > print_success > } > > 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 > ;; > force-reload) > stop > start > ;; > restart) > stop > start > ;; > status) > status > RETVAL=$? > ;; > *) > echo "Usage: $0 {start|stop|status|restart}" > exit 1 > esac > > exit $RETVAL -- --- Ola Lundqvist systemkonsult --- M Sc in IT Engineering ---- / [EMAIL PROTECTED] Annebergsslingan 37 \ | [EMAIL PROTECTED] 654 65 KARLSTAD | | http://opalsys.net/ Mobile: +46 (0)70-332 1551 | \ gpg/f.p.: 7090 A92B 18FE 7994 0C36 4FE4 18A1 B1CF 0FE5 3DD9 / --------------------------------------------------------------- -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]