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 -o -e /sys/module/openvswitch_mod && \
58 # Load openvswitch. If that's successful then we're done.
59 insert_mods && return 0
61 # If the bridge module is loaded, then that might be blocking
62 # openvswitch. Try to unload it, if there are no bridges.
63 test -e /sys/module/bridge || return 1
64 bridges=`echo /sys/class/net/*/bridge | sed 's,/sys/class/net/,,g;s,/bridge,,g'`
65 if test "$bridges" != "*"; then
66 log_warning_msg "not removing bridge module because bridges exist ($bridges)"
69 action "removing bridge module" rmmod bridge || return 1
71 # Try loading openvswitch again.
76 ovs-vsctl --no-wait "$@"
80 set ovs_vsctl set Open_vSwitch .
82 OVS_VERSION=`ovs-vswitchd --version | sed 's/.*) //;1q'`
83 set "$@" ovs-version="$OVS_VERSION"
87 id_file=$etcdir/system-id.conf
88 uuid_file=$etcdir/install_uuid.conf
89 if test -e "$id_file"; then
90 SYSTEM_ID=`cat "$id_file"`
91 elif test -e "$uuid_file"; then
92 # Migrate from old file name.
94 SYSTEM_ID=$INSTALLATION_UUID
95 echo "$SYSTEM_ID" > "$id_file"
96 elif SYSTEM_ID=`uuidgen`; then
97 echo "$SYSTEM_ID" > "$id_file"
99 log_failure_msg "missing uuidgen, could not generate system ID"
104 log_failure_msg "system ID not configured, please use --system-id"
110 set "$@" external-ids:system-id="\"$SYSTEM_ID\""
112 if test X"$SYSTEM_TYPE" != X; then
113 set "$@" system-type="\"$SYSTEM_TYPE\""
115 log_failure_msg "no default system type, please use --system-type"
118 if test X"$SYSTEM_VERSION" != X; then
119 set "$@" system-version="\"$SYSTEM_VERSION\""
121 log_failure_msg "no default system version, please use --system-version"
124 action "Configuring Open vSwitch system IDs" "$@" $extra_ids
127 check_force_cores () {
128 if test X"$FORCE_COREFILES" = Xyes; then
133 del_transient_ports () {
134 for port in `ovs-vsctl --bare -- --columns=name find port other_config:transient=true`; do
135 ovs_vsctl -- del-port "$port"
142 if daemon_is_running ovsdb-server; then
143 log_success_msg "ovsdb-server is already running"
145 # Create initial database or upgrade database schema.
146 upgrade_db $DB_FILE $DB_SCHEMA || return 1
148 # Start ovsdb-server.
149 set ovsdb-server "$DB_FILE"
150 for db in $EXTRA_DBS; do
156 if test ! -f "$db"; then
157 log_warning_msg "$db (from \$EXTRA_DBS) does not exist."
158 elif ovsdb-tool db-version "$db" >/dev/null; then
161 log_warning_msg "$db (from \$EXTRA_DBS) cannot be read as a database (see error message above)"
164 set "$@" -vconsole:emer -vsyslog:err -vfile:info
165 set "$@" --remote=punix:"$DB_SOCK"
166 set "$@" --private-key=db:Open_vSwitch,SSL,private_key
167 set "$@" --certificate=db:Open_vSwitch,SSL,certificate
168 set "$@" --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert
169 start_daemon "$OVSDB_SERVER_PRIORITY" "$OVSDB_SERVER_WRAPPER" "$@" \
172 # Initialize database settings.
173 ovs_vsctl -- init -- set Open_vSwitch . db-version="$schemaver" \
175 set_system_ids || return 1
176 if test X"$DELETE_BRIDGES" = Xyes; then
177 for bridge in `ovs_vsctl list-br`; do
178 ovs_vsctl del-br $bridge
181 if test X"$DELETE_TRANSIENT_PORTS" = Xyes; then
188 # Now that ovs-vswitchd has started and completed its initial
189 # configuration, tell ovsdb-server to conenct to the remote managers. We
190 # used to do this at ovsdb-server startup time, but waiting for
191 # ovs-vswitchd to finish configuring means that remote managers see less
192 # churn in the database at startup or restart. (For example, managers
193 # won't briefly see empty datapath-id or ofport columns for records that
195 action "Enabling remote OVSDB managers" \
196 ovs-appctl -t ovsdb-server ovsdb-server/add-remote \
197 db:Open_vSwitch,Open_vSwitch,manager_options
200 start_forwarding () {
203 insert_mod_if_required || return 1
205 if daemon_is_running ovs-vswitchd; then
206 log_success_msg "ovs-vswitchd is already running"
208 # Increase the limit on the number of open file descriptors.
209 # On Linux, ovs-vswitchd needs about three file descriptors
210 # per bridge and "n-handler-threads" file descriptors per bridge
211 # port, so this allows a very large number of bridges and ports.
213 if [ $(ulimit -n) -lt $MAXFD ]; then
217 # Start ovs-vswitchd.
218 set ovs-vswitchd unix:"$DB_SOCK"
219 set "$@" -vconsole:emer -vsyslog:err -vfile:info
220 if test X"$MLOCKALL" != Xno; then
223 start_daemon "$OVS_VSWITCHD_PRIORITY" "$OVS_VSWITCHD_WRAPPER" "$@"
232 stop_daemon ovsdb-server
236 stop_daemon ovs-vswitchd
239 ## ----------------- ##
240 ## force-reload-kmod ##
241 ## ----------------- ##
243 internal_interfaces () {
244 # Outputs a list of internal interfaces:
246 # - There is an internal interface for every bridge, whether it
247 # has an Interface record or not and whether the Interface
248 # record's 'type' is properly set or not.
250 # - There is an internal interface for each Interface record whose
251 # 'type' is 'internal'.
253 # But ignore interfaces that don't really exist.
254 for d in `(ovs_vsctl --bare \
255 -- --columns=name find Interface type=internal \
256 -- list-br) | sort -u`
258 if test -e "/sys/class/net/$d"; then
265 bridges=`ovs_vsctl -- --real list-br`
266 if [ -n "${bridges}" ] && \
267 "$datadir/scripts/ovs-save" "$1" ${bridges} > "$2"; then
271 [ -z "${bridges}" ] && return 0
274 save_flows_if_required () {
275 if test X"$DELETE_BRIDGES" != Xyes; then
276 action "Saving flows" ovs_save save-flows "${script_flows}"
281 "$datadir/scripts/ovs-save" save-interfaces ${ifaces} \
282 > "${script_interfaces}"
285 flow_restore_wait () {
286 ovs_vsctl set open_vswitch . other_config:flow-restore-wait="true"
289 flow_restore_complete () {
290 ovs_vsctl --if-exists remove open_vswitch . other_config \
291 flow-restore-wait="true"
295 [ -x "${script_flows}" ] && \
296 action "Restoring saved flows" "${script_flows}"
299 restore_interfaces () {
300 [ ! -x "${script_interfaces}" ] && return 0
301 action "Restoring interface configuration" "${script_interfaces}"
303 if test $rc = 0; then
308 log="logger -p daemon.$level -t ovs-save"
309 $log "interface restore script exited with status $rc:"
310 $log -f "$script_interfaces"
313 init_restore_scripts () {
314 script_interfaces=`mktemp`
315 script_flows=`mktemp`
316 trap 'rm -f "${script_interfaces}" "${script_flows}"' 0
319 force_reload_kmod () {
320 ifaces=`internal_interfaces`
321 action "Detected internal interfaces: $ifaces" true
324 save_flows_if_required
326 # Restart the database first, since a large database may take a
327 # while to load, and we want to minimize forwarding disruption.
333 if action "Saving interface configuration" save_interfaces; then
336 log_warning_msg "Failed to save configuration, not replacing kernel module"
341 chmod +x "$script_interfaces"
343 for dp in `ovs-dpctl dump-dps`; do
344 action "Removing datapath: $dp" ovs-dpctl del-dp "$dp"
347 for vport in `awk '/^vport_/ { print $1 }' /proc/modules`; do
348 action "Removing $vport module" rmmod $vport
349 if ! grep -q $vport /proc/modules; then
350 removed_vports="$removed_vports $vport"
354 # try both old and new names in case this is post upgrade
355 if test -e /sys/module/openvswitch_mod; then
356 action "Removing openvswitch module" rmmod openvswitch_mod
357 elif test -e /sys/module/openvswitch; then
358 action "Removing openvswitch module" rmmod openvswitch
361 # Start vswitchd by asking it to wait till flow restore is finished.
365 # Restore saved flows and inform vswitchd that we are done.
367 flow_restore_complete
372 "$datadir/scripts/ovs-check-dead-ifs"
380 if daemon_is_running ovsdb-server && daemon_is_running ovs-vswitchd; then
382 save_flows_if_required
385 # Restart the database first, since a large database may take a
386 # while to load, and we want to minimize forwarding disruption.
392 # Start vswitchd by asking it to wait till flow restore is finished.
396 # Restore saved flows and inform vswitchd that we are done.
398 flow_restore_complete
401 # Restore the interfaces if required. Return true even if restore fails.
402 restore_interfaces || true
405 ## --------------- ##
406 ## enable-protocol ##
407 ## --------------- ##
410 # Translate the protocol name to a number, because "iptables -n -L" prints
411 # some protocols by name (despite the -n) and therefore we need to look for
414 # (iptables -S output is more uniform but old iptables doesn't have it.)
415 protonum=`grep "^$PROTOCOL[ ]" /etc/protocols | awk '{print $2}'`
416 if expr X"$protonum" : X'[0-9]\{1,\}$' > /dev/null; then :; else
417 log_failure_msg "unknown protocol $PROTOCOL"
422 match="(\$2 == \"$PROTOCOL\" || \$2 == $protonum)"
423 insert="iptables -I INPUT -p $PROTOCOL"
424 if test X"$DPORT" != X; then
425 name="$name to port $DPORT"
426 match="$match && /dpt:$DPORT/"
427 insert="$insert --dport $DPORT"
429 if test X"$SPORT" != X; then
430 name="$name from port $SPORT"
431 match="$match && /spt:$SPORT/"
432 insert="$insert --sport $SPORT"
434 insert="$insert -j ACCEPT"
436 if (iptables -n -L INPUT) >/dev/null 2>&1; then
437 if iptables -n -L INPUT | awk "$match { n++ } END { exit n == 0 }"
439 # There's already a rule for this protocol. Don't override it.
440 log_success_msg "iptables already has a rule for $name, not explicitly enabling"
442 action "Enabling $name with iptables" $insert
444 elif (iptables --version) >/dev/null 2>&1; then
445 action "cannot list iptables rules, not adding a rule for $name"
447 action "iptables binary not installed, not adding a rule for $name"
459 DELETE_TRANSIENT_PORTS=no
464 OVSDB_SERVER_PRIORITY=-10
465 OVS_VSWITCHD_PRIORITY=-10
466 OVSDB_SERVER_WRAPPER=
467 OVS_VSWITCHD_WRAPPER=
469 DB_FILE=$dbdir/conf.db
470 DB_SOCK=$rundir/db.sock
471 DB_SCHEMA=$datadir/vswitch.ovsschema
478 type_file=$etcdir/system-type.conf
479 version_file=$etcdir/system-version.conf
481 if test -e "$type_file" ; then
482 SYSTEM_TYPE=`cat $type_file`
483 SYSTEM_VERSION=`cat $version_file`
484 elif (lsb_release --id) >/dev/null 2>&1; then
485 SYSTEM_TYPE=`lsb_release --id -s`
486 system_release=`lsb_release --release -s`
487 system_codename=`lsb_release --codename -s`
488 SYSTEM_VERSION="${system_release}-${system_codename}"
491 SYSTEM_VERSION=unknown
498 $0: controls Open vSwitch daemons
499 usage: $0 [OPTIONS] COMMAND
501 This program is intended to be invoked internally by Open vSwitch startup
502 scripts. System administrators should not normally invoke it directly.
505 start start Open vSwitch daemons
506 stop stop Open vSwitch daemons
507 restart stop and start Open vSwitch daemons
508 status check whether Open vSwitch daemons are running
509 version print versions of Open vSwitch daemons
510 load-kmod insert modules if not already present
511 force-reload-kmod save OVS network device state, stop OVS, unload kernel
512 module, reload kernel module, start OVS, restore state
513 enable-protocol enable protocol specified in options with iptables
514 help display this help message
516 One of the following options is required for "start", "restart" and "force-reload-kmod":
517 --system-id=UUID set specific ID to uniquely identify this system
518 --system-id=random use a random but persistent UUID to identify this system
520 Other important options for "start", "restart" and "force-reload-kmod":
521 --system-type=TYPE set system type (e.g. "XenServer")
522 --system-version=VERSION set system version (e.g. "5.6.100-39265p")
523 --external-id="key=value"
524 add given key-value pair to Open_vSwitch external-ids
525 --delete-bridges delete all bridges just before starting ovs-vswitchd
527 Less important options for "start", "restart" and "force-reload-kmod":
528 --daemon-cwd=DIR set working dir for OVS daemons (default: $DAEMON_CWD)
529 --no-force-corefiles do not force on core dumps for OVS daemons
530 --no-mlockall do not lock all of ovs-vswitchd into memory
531 --ovsdb-server-priority=NICE set ovsdb-server's niceness (default: $OVSDB_SERVER_PRIORITY)
532 --ovs-vswitchd-priority=NICE set ovs-vswitchd's niceness (default: $OVS_VSWITCHD_PRIORITY)
534 Debugging options for "start", "restart" and "force-reload-kmod":
535 --ovsdb-server-wrapper=WRAPPER
536 --ovs-vswitchd-wrapper=WRAPPER
537 --ovs-vswitchd-wrapper=WRAPPER
538 run specified daemon under WRAPPER (either 'valgrind' or 'strace')
540 File location options:
541 --db-file=FILE database file name (default: $DB_FILE)
542 --db-sock=SOCKET JSON-RPC socket name (default: $DB_SOCK)
543 --db-schema=FILE database schema file name (default: $DB_SCHEMA)
545 Options for "enable-protocol":
546 --protocol=PROTOCOL protocol to enable with iptables (default: gre)
547 --sport=PORT source port to match (for tcp or udp protocol)
548 --dport=PORT ddestination port to match (for tcp or udp protocol)
551 -h, --help display this help message
552 -V, --version display version information
554 Default directories with "configure" option and environment variable override:
555 logs: @LOGDIR@ (--with-logdir, OVS_LOGDIR)
556 pidfiles and sockets: @RUNDIR@ (--with-rundir, OVS_RUNDIR)
557 conf.db: @DBDIR@ (--with-dbdir, OVS_DBDIR)
558 system configuration: @sysconfdir@ (--sysconfdir, OVS_SYSCONFDIR)
559 data files: @pkgdatadir@ (--pkgdatadir, OVS_PKGDATADIR)
560 user binaries: @bindir@ (--bindir, OVS_BINDIR)
561 system binaries: @sbindir@ (--sbindir, OVS_SBINDIR)
563 Please report bugs to bugs@openvswitch.org (see REPORTING-BUGS for details).
570 var=`echo "$option" | tr abcdefghijklmnopqrstuvwxyz- ABCDEFGHIJKLMNOPQRSTUVWXYZ_`
571 eval set=\${$var+yes}
572 eval old_value=\$$var
573 if test X$set = X || \
574 (test $type = bool && \
575 test X"$old_value" != Xno && test X"$old_value" != Xyes); then
576 echo >&2 "$0: unknown option \"$arg\" (use --help for help)"
583 echo ovsdb-server ovs-vswitchd
596 echo "$0 (Open vSwitch) $VERSION"
600 value=`expr X"$arg" : 'X[^=]*=\(.*\)'`
603 extra_ids="$extra_ids external-ids:$value"
606 echo >&2 "$0: --external-id argument not in the form \"key=value\""
612 option=`expr X"$arg" : 'X--\([^=]*\)'`
613 value=`expr X"$arg" : 'X[^=]*=\(.*\)'`
618 option=`expr X"$arg" : 'X--no-\(.*\)'`
624 option=`expr X"$arg" : 'X--\(.*\)'`
630 echo >&2 "$0: unknown option \"$arg\" (use --help for help)"
634 if test X"$command" = X; then
637 echo >&2 "$0: exactly one non-option argument required (use --help for help)"
645 start_ovsdb || exit 1
658 for daemon in `daemons`; do
659 daemon_status $daemon || rc=$?
664 for daemon in `daemons`; do
672 insert_mod_if_required
681 echo >&2 "$0: missing command name (use --help for help)"
685 echo >&2 "$0: unknown command \"$command\" (use --help for help)"