2 # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2016 Nicira, Inc.
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at:
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
17 */*) dir0=`echo "$0" | sed 's,/[^/]*$,,'` ;;
20 . "$dir0/ovs-lib" || exit 1
22 for dir in "$sbindir" "$bindir" /sbin /bin /usr/sbin /usr/bin; do
33 # Keep track of removed vports so we can reload them if needed
37 # Try loading openvswitch again.
38 action "Inserting openvswitch module" modprobe openvswitch
40 for vport in $removed_vports; do
41 # Don't treat failures to load vports as fatal error
42 action "Inserting $vport module" modprobe $vport || true
46 insert_mod_if_required () {
47 # If this kernel has no module support, expect we're done.
48 if test ! -e /proc/modules
50 log_success_msg "Kernel has no loadable module support. Skipping modprobe"
54 # If openvswitch is already loaded then we're done.
55 test -e /sys/module/openvswitch && return 0
57 # Load openvswitch. If that's successful then we're done.
58 insert_mods && return 0
60 # If the bridge module is loaded, then that might be blocking
61 # openvswitch. Try to unload it, if there are no bridges.
62 test -e /sys/module/bridge || return 1
63 bridges=`echo /sys/class/net/*/bridge | sed 's,/sys/class/net/,,g;s,/bridge,,g'`
64 if test "$bridges" != "*"; then
65 log_warning_msg "not removing bridge module because bridges exist ($bridges)"
68 action "removing bridge module" rmmod bridge || return 1
70 # Try loading openvswitch again.
75 ovs-vsctl --no-wait "$@"
79 set ovs_vsctl set Open_vSwitch .
81 OVS_VERSION=`ovs-vswitchd --version | sed 's/.*) //;1q'`
82 set "$@" ovs-version="$OVS_VERSION"
86 id_file=$etcdir/system-id.conf
87 uuid_file=$etcdir/install_uuid.conf
88 if test -e "$id_file"; then
89 SYSTEM_ID=`cat "$id_file"`
90 elif test -e "$uuid_file"; then
91 # Migrate from old file name.
93 SYSTEM_ID=$INSTALLATION_UUID
94 echo "$SYSTEM_ID" > "$id_file"
95 elif SYSTEM_ID=`uuidgen`; then
96 echo "$SYSTEM_ID" > "$id_file"
98 log_failure_msg "missing uuidgen, could not generate system ID"
103 log_failure_msg "system ID not configured, please use --system-id"
109 set "$@" external-ids:system-id="\"$SYSTEM_ID\""
111 set "$@" external-ids:hostname="\"$(hostname)\""
113 if test X"$SYSTEM_TYPE" != X; then
114 set "$@" system-type="\"$SYSTEM_TYPE\""
116 log_failure_msg "no default system type, please use --system-type"
119 if test X"$SYSTEM_VERSION" != X; then
120 set "$@" system-version="\"$SYSTEM_VERSION\""
122 log_failure_msg "no default system version, please use --system-version"
125 action "Configuring Open vSwitch system IDs" "$@" $extra_ids
128 check_force_cores () {
129 if test X"$FORCE_COREFILES" = Xyes; then
134 del_transient_ports () {
135 for port in `ovs-vsctl --bare -- --columns=name find port other_config:transient=true`; do
136 ovs_vsctl -- del-port "$port"
143 if daemon_is_running ovsdb-server; then
144 log_success_msg "ovsdb-server is already running"
146 # Create initial database or upgrade database schema.
147 upgrade_db $DB_FILE $DB_SCHEMA || return 1
149 # Start ovsdb-server.
150 set ovsdb-server "$DB_FILE"
151 for db in $EXTRA_DBS; do
157 if test ! -f "$db"; then
158 log_warning_msg "$db (from \$EXTRA_DBS) does not exist."
159 elif ovsdb-tool db-version "$db" >/dev/null; then
162 log_warning_msg "$db (from \$EXTRA_DBS) cannot be read as a database (see error message above)"
165 set "$@" -vconsole:emer -vsyslog:err -vfile:info
166 set "$@" --remote=punix:"$DB_SOCK"
167 set "$@" --private-key=db:Open_vSwitch,SSL,private_key
168 set "$@" --certificate=db:Open_vSwitch,SSL,certificate
169 set "$@" --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert
170 start_daemon "$OVSDB_SERVER_PRIORITY" "$OVSDB_SERVER_WRAPPER" "$@" \
173 # Initialize database settings.
174 ovs_vsctl -- init -- set Open_vSwitch . db-version="$schemaver" \
176 set_system_ids || return 1
177 if test X"$DELETE_BRIDGES" = Xyes; then
178 for bridge in `ovs_vsctl list-br`; do
179 ovs_vsctl del-br $bridge
182 if test X"$DELETE_TRANSIENT_PORTS" = Xyes; then
189 if test X"$OVSDB_SERVER" = Xyes; then
195 # Now that ovs-vswitchd has started and completed its initial
196 # configuration, tell ovsdb-server to conenct to the remote managers. We
197 # used to do this at ovsdb-server startup time, but waiting for
198 # ovs-vswitchd to finish configuring means that remote managers see less
199 # churn in the database at startup or restart. (For example, managers
200 # won't briefly see empty datapath-id or ofport columns for records that
202 if test X"$OVSDB_SERVER" = Xyes || test X"$OVS_VSWITCHD" = Xyes; then
203 if daemon_is_running ovsdb-server \
204 && daemon_is_running ovs-vswitchd; then
205 action "Enabling remote OVSDB managers" \
206 ovs-appctl -t ovsdb-server ovsdb-server/add-remote \
207 db:Open_vSwitch,Open_vSwitch,manager_options
212 do_start_forwarding () {
215 insert_mod_if_required || return 1
217 if daemon_is_running ovs-vswitchd; then
218 log_success_msg "ovs-vswitchd is already running"
220 # Increase the limit on the number of open file descriptors.
221 # On Linux, ovs-vswitchd needs about three file descriptors
222 # per bridge and "n-handler-threads" file descriptors per bridge
223 # port, so this allows a very large number of bridges and ports.
225 if [ $(ulimit -n) -lt $MAXFD ]; then
229 # Start ovs-vswitchd.
230 set ovs-vswitchd unix:"$DB_SOCK"
231 set "$@" -vconsole:emer -vsyslog:err -vfile:info
232 if test X"$MLOCKALL" != Xno; then
235 start_daemon "$OVS_VSWITCHD_PRIORITY" "$OVS_VSWITCHD_WRAPPER" "$@"
239 start_forwarding () {
240 if test X"$OVS_VSWITCHD" = Xyes; then
250 if test X"$OVSDB_SERVER" = Xyes; then
251 stop_daemon ovsdb-server
256 if test X"$OVS_VSWITCHD" = Xyes; then
257 stop_daemon ovs-vswitchd
261 ## ----------------- ##
262 ## force-reload-kmod ##
263 ## ----------------- ##
265 internal_interfaces () {
266 # Outputs a list of internal interfaces:
268 # - There is an internal interface for every bridge, whether it
269 # has an Interface record or not and whether the Interface
270 # record's 'type' is properly set or not.
272 # - There is an internal interface for each Interface record whose
273 # 'type' is 'internal'.
275 # But ignore interfaces that don't really exist.
276 for d in `(ovs_vsctl --bare \
277 -- --columns=name find Interface type=internal \
278 -- list-br) | sort -u`
280 if test -e "/sys/class/net/$d"; then
287 bridges=`ovs_vsctl -- --real list-br`
288 if [ -n "${bridges}" ] && \
289 "$datadir/scripts/ovs-save" "$1" ${bridges} > "$2"; then
293 [ -z "${bridges}" ] && return 0
296 save_flows_if_required () {
297 if test X"$DELETE_BRIDGES" != Xyes; then
298 action "Saving flows" ovs_save save-flows "${script_flows}"
303 "$datadir/scripts/ovs-save" save-interfaces ${ifaces} \
304 > "${script_interfaces}"
307 flow_restore_wait () {
308 if test X"$OVS_VSWITCHD" = Xyes; then
309 ovs_vsctl set open_vswitch . other_config:flow-restore-wait="true"
313 flow_restore_complete () {
314 if test X"$OVS_VSWITCHD" = Xyes; then
315 ovs_vsctl --if-exists remove open_vswitch . other_config \
316 flow-restore-wait="true"
321 [ -x "${script_flows}" ] && \
322 action "Restoring saved flows" "${script_flows}"
325 restore_interfaces () {
326 [ ! -x "${script_interfaces}" ] && return 0
327 action "Restoring interface configuration" "${script_interfaces}"
329 if test $rc = 0; then
334 log="logger -p daemon.$level -t ovs-save"
335 $log "interface restore script exited with status $rc:"
336 $log -f "$script_interfaces"
339 init_restore_scripts () {
340 script_interfaces=`mktemp`
341 script_flows=`mktemp`
342 trap 'rm -f "${script_interfaces}" "${script_flows}"' 0
345 force_reload_kmod () {
347 if test X"$OVS_VSWITCHD" != Xyes; then
348 log_failure_msg "Reloading of kmod without ovs-vswitchd is an error"
352 ifaces=`internal_interfaces`
353 action "Detected internal interfaces: $ifaces" true
356 save_flows_if_required
358 # Restart the database first, since a large database may take a
359 # while to load, and we want to minimize forwarding disruption.
365 if action "Saving interface configuration" save_interfaces; then
368 log_warning_msg "Failed to save configuration, not replacing kernel module"
373 chmod +x "$script_interfaces"
375 for dp in `ovs-dpctl dump-dps`; do
376 action "Removing datapath: $dp" ovs-dpctl del-dp "$dp"
379 for vport in `awk '/^vport_/ { print $1 }' /proc/modules`; do
380 action "Removing $vport module" rmmod $vport
381 if ! grep -q $vport /proc/modules; then
382 removed_vports="$removed_vports $vport"
386 if test -e /sys/module/openvswitch; then
387 action "Removing openvswitch module" rmmod openvswitch
390 # Start vswitchd by asking it to wait till flow restore is finished.
394 # Restore saved flows and inform vswitchd that we are done.
396 flow_restore_complete
401 "$datadir/scripts/ovs-check-dead-ifs"
409 if daemon_is_running ovsdb-server && daemon_is_running ovs-vswitchd; then
411 if test X"$OVS_VSWITCHD" = Xyes; then
412 save_flows_if_required
416 # Restart the database first, since a large database may take a
417 # while to load, and we want to minimize forwarding disruption.
423 # Start vswitchd by asking it to wait till flow restore is finished.
427 # Restore saved flows and inform vswitchd that we are done.
429 flow_restore_complete
432 # Restore the interfaces if required. Return true even if restore fails.
433 restore_interfaces || true
436 ## --------------- ##
437 ## enable-protocol ##
438 ## --------------- ##
441 # Translate the protocol name to a number, because "iptables -n -L" prints
442 # some protocols by name (despite the -n) and therefore we need to look for
445 # (iptables -S output is more uniform but old iptables doesn't have it.)
446 protonum=`grep "^$PROTOCOL[ ]" /etc/protocols | awk '{print $2}'`
447 if expr X"$protonum" : X'[0-9]\{1,\}$' > /dev/null; then :; else
448 log_failure_msg "unknown protocol $PROTOCOL"
453 match="(\$2 == \"$PROTOCOL\" || \$2 == $protonum)"
454 insert="iptables -I INPUT -p $PROTOCOL"
455 if test X"$DPORT" != X; then
456 name="$name to port $DPORT"
457 match="$match && /dpt:$DPORT/"
458 insert="$insert --dport $DPORT"
460 if test X"$SPORT" != X; then
461 name="$name from port $SPORT"
462 match="$match && /spt:$SPORT/"
463 insert="$insert --sport $SPORT"
465 insert="$insert -j ACCEPT"
467 if (iptables -n -L INPUT) >/dev/null 2>&1; then
468 if iptables -n -L INPUT | awk "$match { n++ } END { exit n == 0 }"
470 # There's already a rule for this protocol. Don't override it.
471 log_success_msg "iptables already has a rule for $name, not explicitly enabling"
473 action "Enabling $name with iptables" $insert
475 elif (iptables --version) >/dev/null 2>&1; then
476 action "cannot list iptables rules, not adding a rule for $name"
478 action "iptables binary not installed, not adding a rule for $name"
490 DELETE_TRANSIENT_PORTS=no
497 OVSDB_SERVER_PRIORITY=-10
498 OVS_VSWITCHD_PRIORITY=-10
499 OVSDB_SERVER_WRAPPER=
500 OVS_VSWITCHD_WRAPPER=
502 DB_FILE=$dbdir/conf.db
503 DB_SOCK=$rundir/db.sock
504 DB_SCHEMA=$datadir/vswitch.ovsschema
511 type_file=$etcdir/system-type.conf
512 version_file=$etcdir/system-version.conf
514 if test -e "$type_file" ; then
515 SYSTEM_TYPE=`cat $type_file`
516 SYSTEM_VERSION=`cat $version_file`
517 elif (lsb_release --id) >/dev/null 2>&1; then
518 SYSTEM_TYPE=`lsb_release --id -s`
519 system_release=`lsb_release --release -s`
520 system_codename=`lsb_release --codename -s`
521 SYSTEM_VERSION="${system_release}-${system_codename}"
524 SYSTEM_VERSION=unknown
531 $0: controls Open vSwitch daemons
532 usage: $0 [OPTIONS] COMMAND
534 This program is intended to be invoked internally by Open vSwitch startup
535 scripts. System administrators should not normally invoke it directly.
538 start start Open vSwitch daemons
539 stop stop Open vSwitch daemons
540 restart stop and start Open vSwitch daemons
541 status check whether Open vSwitch daemons are running
542 version print versions of Open vSwitch daemons
543 load-kmod insert modules if not already present
544 force-reload-kmod save OVS network device state, stop OVS, unload kernel
545 module, reload kernel module, start OVS, restore state
546 enable-protocol enable protocol specified in options with iptables
547 help display this help message
549 One of the following options is required for "start", "restart" and "force-reload-kmod":
550 --system-id=UUID set specific ID to uniquely identify this system
551 --system-id=random use a random but persistent UUID to identify this system
553 Other important options for "start", "restart" and "force-reload-kmod":
554 --system-type=TYPE set system type (e.g. "XenServer")
555 --system-version=VERSION set system version (e.g. "5.6.100-39265p")
556 --external-id="key=value"
557 add given key-value pair to Open_vSwitch external-ids
558 --delete-bridges delete all bridges just before starting ovs-vswitchd
560 Less important options for "start", "restart" and "force-reload-kmod":
561 --daemon-cwd=DIR set working dir for OVS daemons (default: $DAEMON_CWD)
562 --no-force-corefiles do not force on core dumps for OVS daemons
563 --no-mlockall do not lock all of ovs-vswitchd into memory
564 --ovsdb-server-priority=NICE set ovsdb-server's niceness (default: $OVSDB_SERVER_PRIORITY)
565 --ovs-vswitchd-priority=NICE set ovs-vswitchd's niceness (default: $OVS_VSWITCHD_PRIORITY)
567 Debugging options for "start", "restart" and "force-reload-kmod":
568 --ovsdb-server-wrapper=WRAPPER
569 --ovs-vswitchd-wrapper=WRAPPER
570 --ovs-vswitchd-wrapper=WRAPPER
571 run specified daemon under WRAPPER (either 'valgrind' or 'strace')
573 File location options:
574 --db-file=FILE database file name (default: $DB_FILE)
575 --db-sock=SOCKET JSON-RPC socket name (default: $DB_SOCK)
576 --db-schema=FILE database schema file name (default: $DB_SCHEMA)
578 Options for "enable-protocol":
579 --protocol=PROTOCOL protocol to enable with iptables (default: gre)
580 --sport=PORT source port to match (for tcp or udp protocol)
581 --dport=PORT ddestination port to match (for tcp or udp protocol)
584 -h, --help display this help message
585 -V, --version display version information
587 Default directories with "configure" option and environment variable override:
588 logs: @LOGDIR@ (--with-logdir, OVS_LOGDIR)
589 pidfiles and sockets: @RUNDIR@ (--with-rundir, OVS_RUNDIR)
590 conf.db: @DBDIR@ (--with-dbdir, OVS_DBDIR)
591 system configuration: @sysconfdir@ (--sysconfdir, OVS_SYSCONFDIR)
592 data files: @pkgdatadir@ (--pkgdatadir, OVS_PKGDATADIR)
593 user binaries: @bindir@ (--bindir, OVS_BINDIR)
594 system binaries: @sbindir@ (--sbindir, OVS_SBINDIR)
596 Please report bugs to bugs@openvswitch.org (see REPORTING-BUGS for details).
603 var=`echo "$option" | tr abcdefghijklmnopqrstuvwxyz- ABCDEFGHIJKLMNOPQRSTUVWXYZ_`
604 eval set=\${$var+yes}
605 eval old_value=\$$var
606 if test X$set = X || \
607 (test $type = bool && \
608 test X"$old_value" != Xno && test X"$old_value" != Xyes); then
609 echo >&2 "$0: unknown option \"$arg\" (use --help for help)"
616 echo ovsdb-server ovs-vswitchd
629 echo "$0 (Open vSwitch) $VERSION"
633 value=`expr X"$arg" : 'X[^=]*=\(.*\)'`
636 extra_ids="$extra_ids external-ids:$value"
639 echo >&2 "$0: --external-id argument not in the form \"key=value\""
645 option=`expr X"$arg" : 'X--\([^=]*\)'`
646 value=`expr X"$arg" : 'X[^=]*=\(.*\)'`
651 option=`expr X"$arg" : 'X--no-\(.*\)'`
657 option=`expr X"$arg" : 'X--\(.*\)'`
663 echo >&2 "$0: unknown option \"$arg\" (use --help for help)"
667 if test X"$command" = X; then
670 echo >&2 "$0: exactly one non-option argument required (use --help for help)"
678 start_ovsdb || exit 1
691 for daemon in `daemons`; do
692 daemon_status $daemon || rc=$?
697 for daemon in `daemons`; do
705 insert_mod_if_required
714 echo >&2 "$0: missing command name (use --help for help)"
718 echo >&2 "$0: unknown command \"$command\" (use --help for help)"