mirror of
https://github.com/openvswitch/ovs
synced 2025-10-25 15:07:05 +00:00
Sometimes it takes a moment for the OVS daemons to die. When that happens, the "start" half of "openvswitch restart" can fail when ovsdb-tool runs, because ovsdb-server will still have the lock on the database if it has not exited yet. So this commit just makes the "stop" half wait for the daemons to really die. Bug #3369.
400 lines
12 KiB
Bash
Executable File
400 lines
12 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# openvswitch
|
|
#
|
|
# chkconfig: 2345 09 91
|
|
# description: Manage Open vSwitch kernel modules and user-space daemons
|
|
|
|
# Copyright (C) 2009, 2010 Nicira Networks, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at:
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
. /etc/init.d/functions
|
|
|
|
. /etc/xensource-inventory
|
|
test -e /etc/sysconfig/openvswitch && . /etc/sysconfig/openvswitch
|
|
|
|
NETWORK_MODE=$(cat /etc/xensource/network.conf)
|
|
case $NETWORK_MODE in
|
|
vswitch|openvswitch)
|
|
;;
|
|
bridge)
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Open vSwitch disabled (/etc/xensource/network.conf is invalid)" >&2
|
|
exit 0
|
|
;;
|
|
esac
|
|
|
|
# General config variables in /etc/sysconfig/openvswitch
|
|
if test "$PRODUCT_VERSION" = "5.5.0"; then
|
|
# XenServer 5.5.0 needs ovs-brcompatd and /proc/net simulation.
|
|
: ${ENABLE_BRCOMPAT:=y}
|
|
: ${ENABLE_FAKE_PROC_NET:=y}
|
|
else
|
|
# Later versions don't need them.
|
|
: ${ENABLE_BRCOMPAT:=n}
|
|
: ${ENABLE_FAKE_PROC_NET:=n}
|
|
fi
|
|
: ${ENABLE_MONITOR:=y}
|
|
: ${FORCE_COREFILES:=y}
|
|
|
|
# Config variables specific to ovsdb-server
|
|
: ${OVSDB_SERVER_REMOTES:=punix:/var/run/openvswitch/db.sock db:Open_vSwitch,managers}
|
|
: ${OVSDB_SERVER_DB:=/etc/openvswitch/conf.db}
|
|
: ${OVSDB_SERVER_PIDFILE:=/var/run/openvswitch/ovsdb-server.pid}
|
|
: ${OVSDB_SERVER_RUN_DIR:=/var/xen/openvswitch}
|
|
: ${OVSDB_SERVER_PRIORITY:=-10}
|
|
: ${OVSDB_SERVER_LOGFILE:=/var/log/openvswitch/ovsdb-server.log}
|
|
: ${OVSDB_SERVER_FILE_LOGLEVEL:=INFO}
|
|
: ${OVSDB_SERVER_SYSLOG_LOGLEVEL:=ERR}
|
|
: ${OVSDB_SERVER_MEMLEAK_LOGFILE:=}
|
|
: ${OVSDB_SERVER_STRACE_LOG:=}
|
|
: ${OVSDB_SERVER_STRACE_OPT:=}
|
|
: ${OVSDB_SERVER_VALGRIND_LOG:=}
|
|
: ${OVSDB_SERVER_VALGRIND_OPT:=}
|
|
|
|
# Config variables specific to ovs-vswitchd
|
|
: ${VSWITCHD_OVSDB_SERVER:=unix:/var/run/openvswitch/db.sock}
|
|
: ${VSWITCHD_OVSDB_SCHEMA:=/usr/share/openvswitch/vswitch.ovsschema}
|
|
: ${VSWITCHD_PIDFILE:=/var/run/openvswitch/ovs-vswitchd.pid}
|
|
: ${VSWITCHD_RUN_DIR:=/var/xen/openvswitch}
|
|
: ${VSWITCHD_PRIORITY:=-10}
|
|
: ${VSWITCHD_MLOCKALL:=yes}
|
|
: ${VSWITCHD_LOGFILE:=/var/log/openvswitch/ovs-vswitchd.log}
|
|
: ${VSWITCHD_FILE_LOGLEVEL:=INFO}
|
|
: ${VSWITCHD_SYSLOG_LOGLEVEL:=ERR}
|
|
: ${VSWITCHD_MEMLEAK_LOGFILE:=}
|
|
: ${VSWITCHD_STRACE_LOG:=}
|
|
: ${VSWITCHD_STRACE_OPT:=}
|
|
: ${VSWITCHD_VALGRIND_LOG:=}
|
|
: ${VSWITCHD_VALGRIND_OPT:=}
|
|
|
|
# Config variables specific to ovs-brcompatd
|
|
: ${BRCOMPATD_PIDFILE:=/var/run/openvswitch/ovs-brcompatd.pid}
|
|
: ${BRCOMPATD_RUN_DIR:=/var/xen/openvswitch}
|
|
: ${BRCOMPATD_PRIORITY:=-10}
|
|
: ${BRCOMPATD_LOGFILE:=/var/log/openvswitch/ovs-brcompatd.log}
|
|
: ${BRCOMPATD_FILE_LOGLEVEL:=INFO}
|
|
: ${BRCOMPATD_SYSLOG_LOGLEVEL:=ERR}
|
|
: ${BRCOMPATD_MEMLEAK_LOGFILE:=}
|
|
: ${BRCOMPATD_STRACE_LOG:=}
|
|
: ${BRCOMPATD_STRACE_OPT:=}
|
|
: ${BRCOMPATD_VALGRIND_LOG:=}
|
|
: ${BRCOMPATD_VALGRIND_OPT:=}
|
|
|
|
# Full paths to executables & modules
|
|
ovsdb_server="/usr/sbin/ovsdb-server"
|
|
ovsdb_tool="/usr/bin/ovsdb-tool"
|
|
vswitchd="/usr/sbin/ovs-vswitchd"
|
|
brcompatd="/usr/sbin/ovs-brcompatd"
|
|
dpctl="/usr/bin/ovs-dpctl"
|
|
appctl="/usr/bin/ovs-appctl"
|
|
ofctl="/usr/bin/ovs-ofctl"
|
|
vsctl="/usr/bin/ovs-vsctl"
|
|
|
|
if [ "$ENABLE_FAKE_PROC_NET" = "y" ]; then
|
|
if [ "$ENABLE_BRCOMPAT" != "y" ]; then
|
|
warning "FAKE_PROC_NET required BRCOMPAT which was disabled. Force enabling."
|
|
ENABLE_BRCOMPAT="y"
|
|
fi
|
|
fi
|
|
|
|
if test "$ENABLE_MONITOR" = "y"; then
|
|
monitor_opt="--monitor"
|
|
else
|
|
monitor_opt=
|
|
fi
|
|
|
|
function dp_list {
|
|
"$dpctl" show | grep '^dp[0-9]\+:' | cut -d':' -f 1
|
|
}
|
|
|
|
function turn_on_corefiles {
|
|
ulimit -Sc 67108864
|
|
}
|
|
|
|
function remove_all_dp {
|
|
for dp in $(dp_list); do
|
|
action "Removing datapath: $dp" "$dpctl" del-dp "$dp"
|
|
done
|
|
}
|
|
|
|
function insert_modules_if_required {
|
|
if ! lsmod | grep -q "openvswitch_mod"; then
|
|
action "Inserting llc module" modprobe llc
|
|
action "Inserting openvswitch module" modprobe openvswitch_mod
|
|
fi
|
|
if [ "$ENABLE_BRCOMPAT" = "y" ] && [ -n "$BRCOMPATD_PIDFILE" ] && ! lsmod | grep -q "brcompat_mod"; then
|
|
action "Inserting brcompat module" modprobe brcompat_mod
|
|
fi
|
|
}
|
|
|
|
function remove_modules {
|
|
if lsmod | grep -q "brcompat_mod"; then
|
|
action "Removing brcompat module" rmmod brcompat_mod.ko
|
|
fi
|
|
if lsmod | grep -q "openvswitch_mod"; then
|
|
action "Removing openvswitch module" rmmod openvswitch_mod.ko
|
|
fi
|
|
}
|
|
|
|
function start_daemon {
|
|
local DAEMON=$1
|
|
shift
|
|
local BINARY=$1
|
|
|
|
# cd to daemon's run_dir so core files get dumped into a sensible place.
|
|
eval local run_dir=\$${DAEMON}_RUN_DIR
|
|
if [ ! -d "$run_dir" ]; then
|
|
install -d -m 755 -o root -g root "$run_dir"
|
|
fi
|
|
cd "$run_dir"
|
|
|
|
# Configure log levels.
|
|
eval local syslog_loglevel=\$${DAEMON}_SYSLOG_LOGLEVEL
|
|
eval local file_loglevel=\$${DAEMON}_FILE_LOGLEVEL
|
|
eval local logfile=\$${DAEMON}_LOGFILE
|
|
set -- "$@" -vANY:CONSOLE:EMER -vANY:SYSLOG:"$syslog_loglevel"
|
|
if test -n "$file_loglevel" && test -n "$logfile"; then
|
|
install -d -m 755 -o root -g root `dirname "$logfile"`
|
|
set -- "$@" --log-file="$logfile" -vANY:FILE:"$file_loglevel"
|
|
fi
|
|
|
|
# Configure leak checker.
|
|
eval local memleak_logfile=\$${DAEMON}_MEMLEAK_LOGFILE
|
|
if test -n "$memleak_logfile"; then
|
|
set -- "$@" --check-leaks="$memleak_logfile"
|
|
if test -e "$memleak_logfile"; then
|
|
mv "$memleak_logfile" "$memleak_logfile.prev"
|
|
fi
|
|
fi
|
|
|
|
# Configure debugging wrappers.
|
|
eval local strace_log=\$${DAEMON}_STRACE_LOG
|
|
eval local strace_opt=\$${DAEMON}_STRACE_OPT
|
|
eval local valgrind_log=\$${DAEMON}_VALGRIND_LOG
|
|
eval local valgrind_opt=\$${DAEMON}_VALGRIND_OPT
|
|
if test -n "$strace_log" && test -n "$valgrind_log"; then
|
|
printf "Can not start with both VALGRIND and STRACE\n"
|
|
exit 1
|
|
elif test -n "$strace_log"; then
|
|
local mode=strace
|
|
set -- strace -o "$strace_log" $strace_opt "$@"
|
|
elif test -n "$valgrind_log"; then
|
|
local mode=valgrind
|
|
set -- valgrind --log-file="$valgrind_log" $valgrind_opt "$@"
|
|
else
|
|
local mode=production
|
|
eval local pidfile=\$${DAEMON}_PIDFILE
|
|
install -d -m 755 -o root -g root `dirname $pidfile`
|
|
set -- "$@" --pidfile="$pidfile" --detach $monitor_opt --no-chdir
|
|
fi
|
|
|
|
# Configure niceness.
|
|
eval local priority=\$${DAEMON}_PRIORITY
|
|
if test -n "$priority"; then
|
|
set -- nice -n $priority "$@"
|
|
fi
|
|
|
|
if test $mode = production; then
|
|
action "Starting `basename $BINARY`" "$@"
|
|
else
|
|
# Start in background and force a "success" message
|
|
action "Starting `basename $BINARY` with $mode debugging" true
|
|
("$@") &
|
|
fi
|
|
}
|
|
|
|
function start_ovsdb_server {
|
|
set -- "$ovsdb_server" "$OVSDB_SERVER_DB"
|
|
for remote in $OVSDB_SERVER_REMOTES; do
|
|
set -- "$@" --remote="$remote"
|
|
done
|
|
set -- "$@" --private-key=db:SSL,private_key --certificate=db:SSL,certificate --bootstrap-ca-cert=db:SSL,ca_cert
|
|
start_daemon OVSDB_SERVER "$@"
|
|
}
|
|
|
|
function start_vswitchd {
|
|
local fake_proc_net_opt=
|
|
if [ "$ENABLE_FAKE_PROC_NET" = "y" ]; then
|
|
fake_proc_net_opt="--fake-proc-net"
|
|
fi
|
|
|
|
local mlockall_opt=
|
|
if [ "$VSWITCHD_MLOCKALL" != "no" ]; then
|
|
mlockall_opt="--mlockall"
|
|
fi
|
|
|
|
start_daemon VSWITCHD "$vswitchd" $fake_proc_net_opt $mlockall_opt \
|
|
"$VSWITCHD_OVSDB_SERVER"
|
|
}
|
|
|
|
function start_brcompatd {
|
|
start_daemon BRCOMPATD "$brcompatd" \
|
|
--appctl-command="$appctl --target=/var/run/openvswitch/ovs-vswitchd.\`cat $VSWITCHD_PIDFILE\`.ctl %s" \
|
|
"$VSWITCHD_OVSDB_SERVER"
|
|
}
|
|
|
|
function stop_daemon {
|
|
local DAEMON=$1
|
|
local BINARY=$2
|
|
eval local pidfile=\$${DAEMON}_PIDFILE
|
|
if test -f "$pidfile"; then
|
|
local pid=$(cat "$pidfile")
|
|
action "Killing `basename $BINARY` ($pid)" kill $pid
|
|
for delay in .1 .25 .65 1 1 1 1; do
|
|
if kill -0 $pid >/dev/null 2>&1; then
|
|
sleep $delay
|
|
else
|
|
break
|
|
fi
|
|
done
|
|
rm -f "$pidfile"
|
|
fi
|
|
}
|
|
|
|
function restart_approval {
|
|
if test ! -t 0; then
|
|
# Don't prompt if invoked non-interactively.
|
|
return 0
|
|
fi
|
|
cat <<EOF
|
|
|
|
WARNING!!!
|
|
|
|
Restarting Open vSwitch on a live server is not guaranteed to work. It is
|
|
provided as a convenience for those situations in which it does work.
|
|
|
|
EOF
|
|
read -s -r -n 1 -p "Continue with restart (y/N): " response
|
|
printf "\n"
|
|
case "$response" in
|
|
y|Y)
|
|
return 0
|
|
;;
|
|
*)
|
|
return 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
function set_system_uuid {
|
|
if test -n "$INSTALLATION_UUID"; then
|
|
action "Configuring Open vSwitch system UUID" true
|
|
$vsctl --no-wait set Open_vSwitch . external-ids:system-uuid="$INSTALLATION_UUID"
|
|
else
|
|
action "Configuring Open vSwitch system UUID" false
|
|
fi
|
|
}
|
|
|
|
function start {
|
|
if [ "$FORCE_COREFILES" = "y" ]; then
|
|
turn_on_corefiles
|
|
fi
|
|
|
|
insert_modules_if_required
|
|
|
|
# Increase the limit on the number of open file descriptors since
|
|
# ovs-vswitchd needs a few per bridge
|
|
ulimit -n 4096
|
|
|
|
# Allow GRE traffic.
|
|
iptables -I INPUT -p gre -j ACCEPT
|
|
|
|
if [ ! -e "$OVSDB_SERVER_DB" ]; then
|
|
warning "$OVSDB_SERVER_DB does not exist"
|
|
install -d -m 755 -o root -g root `dirname $OVSDB_SERVER_DB`
|
|
|
|
action "Creating empty database $OVSDB_SERVER_DB" true
|
|
$ovsdb_tool -vANY:console:emer create "$OVSDB_SERVER_DB" "$VSWITCHD_OVSDB_SCHEMA"
|
|
else
|
|
# Upgrade or downgrade schema and compact database.
|
|
$ovsdb_tool -vANY:console:emer convert "$OVSDB_SERVER_DB" "$VSWITCHD_OVSDB_SCHEMA"
|
|
fi
|
|
|
|
start_ovsdb_server
|
|
$vsctl --no-wait init
|
|
if [ ! -e /var/run/openvswitch.booted ]; then
|
|
touch /var/run/openvswitch.booted
|
|
for bridge in $($vsctl list-br); do
|
|
$vsctl --no-wait del-br $bridge
|
|
done
|
|
fi
|
|
|
|
set_system_uuid
|
|
|
|
start_vswitchd
|
|
if [ "${ENABLE_BRCOMPAT}" = "y" ] ; then
|
|
start_brcompatd
|
|
fi
|
|
touch /var/lock/subsys/openvswitch
|
|
}
|
|
|
|
function stop {
|
|
stop_daemon BRCOMPATD "$brcompatd"
|
|
stop_daemon VSWITCHD "$vswitchd"
|
|
stop_daemon OVSDB_SERVER "$ovsdb_server"
|
|
rm -f /var/lock/subsys/openvswitch
|
|
}
|
|
|
|
function restart {
|
|
if restart_approval; then
|
|
stop
|
|
start
|
|
fi
|
|
}
|
|
|
|
case "$1" in
|
|
start)
|
|
start
|
|
;;
|
|
stop)
|
|
stop
|
|
;;
|
|
restart)
|
|
restart
|
|
;;
|
|
reload|force-reload)
|
|
# Nothing to do--ovs-vswitchd and ovsdb-server keep their configuration
|
|
# up-to-date all the time.
|
|
;;
|
|
strace-vswitchd)
|
|
shift
|
|
strace -p $(cat "$VSWITCHD_PIDFILE") "$@"
|
|
;;
|
|
strace-brcompatd)
|
|
shift
|
|
strace -p $(cat "$BRCOMPATD_PIDFILE") "$@"
|
|
;;
|
|
status)
|
|
status -p "$OVSDB_SERVER_PIDFILE" ovsdb-server &&
|
|
status -p "$VSWITCHD_PIDFILE" ovs-vswitchd &&
|
|
(test "$ENABLE_BRCOMPAT" != "y" ||
|
|
status -p "$BRCOMPATD_PIDFILE" ovs-brcompatd)
|
|
;;
|
|
version)
|
|
/usr/sbin/ovsdb-server -V
|
|
/usr/sbin/ovs-vswitchd -V
|
|
/usr/sbin/ovs-brcompatd -V
|
|
;;
|
|
help)
|
|
printf "openvswitch [start|stop|restart|reload|force-reload|status|version]\n"
|
|
;;
|
|
*)
|
|
printf "Unknown command: $1\n"
|
|
exit 1
|
|
;;
|
|
esac
|