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]

Reply via email to