下面我将为你详细介绍 ovs-vsctl 命令,从基本结构到常用操作,并提供清晰的示例。

命令基本结构
ovs-vsctl 的基本结构遵循一个模式,可以分解为几个部分:
ovs-vsctl [options] [command]
[options]: 全局选项,-t(超时时间),--no-wait(不等待操作完成)。[command]: 具体的操作命令,如add-br,add-port,set等。
一个复杂的命令通常由多个子命令组成,通过换行或分号隔开,并用引号括起来,OVS 会按顺序执行这些命令。
ovs-vsctl -- --may-exist add-br br0 \
-- set bridge br0 datapath_type=netdev \
-- add-port br0 veth0 -- set port veth0 \
-- set interface veth0 ofport_request=10
这个例子中, 是一个分隔符,用来告诉 ovs-vsctl 后面的参数是给 OVS 内部命令的,而不是给 ovs-vsctl 工具本身的。
核心概念
在深入命令之前,必须理解 OVS 的几个核心组件:

- Bridge (网桥): 相当于一个虚拟交换机,你可以创建多个网桥,每个网桥是一个独立的二层交换域,默认网桥名为
br0。 - Port (端口): 连接到网桥的端点,一个端口可以是一个物理网卡(如
eth0)、一个虚拟接口(如veth对的一端)、一个内部接口(如br0自身用于管理的ovs-system),甚至是一个 Geneve、VXLAN 等隧道。 - Interface (接口): 端口所代表的网络接口,一个端口通常只包含一个接口,端口和接口的概念在很多情况下可以互换,但
port更侧重于其在交换机上的角色,而interface更侧重于其网络属性。 - Flow (流表): OVS 的核心,它定义了交换机的转发行为,流表由多条流规则组成,每条规则包含匹配字段(如源/目的 MAC/IP、入端口等)和动作(如输出到某个端口、丢弃、修改包头等)。
- Datapath (数据路径): 执行流表转化的底层实现,可以是内核模块(如
system-datapath),也可以是用户空间的 DPDK(netdev-datapath)。
常用 ovs-vsctl 命令详解
网桥 管理
创建网桥
# 创建一个名为 br0 的网桥 ovs-vsctl add-br br0
删除网桥
# 删除名为 br0 的网桥 (注意:会删除其所有端口) ovs-vsctl del-br br0
查看网桥信息
# 列出所有网桥 ovs-vsctl list-br # 显示 br0 的详细信息 ovs-vsctl list br0 # 显示 br0 的配置信息,如 fail-mode, protocols 等 ovs-vsctl br-to-controller br0 ovs-vsctl get bridge br0 datapath_type
设置网桥属性

# 设置网桥的 fail-mode 为 secure (不允许没有控制器的连接) ovs-vsctl set bridge br0 fail-mode=secure # 设置网桥的 STP 协议为不启用 ovs-vsctl set bridge br0 stp_enable=false # 设置网桥使用 DPDK 作为数据路径 ovs-vsctl set bridge br0 datapath_type=netdev
端口 管理
添加端口
# 将物理网卡 eth0 添加到 br0 网桥 ovs-vsctl add-port br0 eth0 # 创建一个 veth pair,并将一端 veth0 添加到 br0 ip link add veth0 type veth peer name veth1 ovs-vsctl add-port br0 veth0
删除端口
# 从 br0 网桥删除 eth0 端口 ovs-vsctl del-port br0 eth0
查看端口信息
# 列出 br0 上的所有端口 ovs-vsctl list-ports br0 # 显示端口 eth0 的详细信息 ovs-vsctl list port eth0 # 获取端口绑定的控制器 (通常用于 patch port) ovs-vsctl get port eth0 interfaces
设置端口属性
# 设置端口 eth0 的 VLAN tag 为 100 (trunk 模式) ovs-vsctl set port eth0 tag=100 # 设置端口 eth0 为 trunk 模式,允许 VLAN 100 和 200 通过 ovs-vsctl set port eth0 trunks=100,200 # 设置端口 eth0 为 access 模式,PVID 为 300 ovs-vsctl clear port eth0 trunks ovs-vsctl set port eth0 tag=300 # 设置端口的镜像属性,将流量镜像到另一个端口 ovs-vsctl -- --may-exist mirror-add mirror0 eth0 -- set port mirror0 type=mirror
接口 管理
设置接口属性
# 设置接口 veth0 的请求端口号为 10 ovs-vsctl set interface veth0 ofport_request=10 # 启用或禁用接口的混杂模式 ovs-vsctl set interface veth0 options:rxq_pcap_rx=veth0.pcap ovs-vsctl set interface veth0 options:rxq_pcap_tx=veth0.pcap # 获取接口的当前端口号 ovs-vsctl get interface veth0 ofport
流表 管理
添加流规则
# 在 br0 上添加一条流规则:匹配从端口 10 进来的包,动作是从端口 20 发出去 ovs-ofctl add-flow br0 "in_port=10,actions=output:20" # 使用 ovs-vsctl 添加流 (更底层的方式,通常用 ovs-ofctl) ovs-vsctl add-flow br0 "priority=100,ip,in_port=10,actions=mod_vlan_vid:100,output:20"
注意:直接操作流表通常使用 ovs-ofctl 或 ovs-appctl,ovs-vsctl 更多是用于配置交换机本身。
查看流表
# 使用 ovs-ofctl 查看流表 ovs-ofctl dump-flows br0
控制器 管理
添加控制器
# 添加一个远程控制器,IP 为 192.168.1.100,端口 6653 ovs-vsctl set-controller br0 tcp:192.168.1.100:6653 # 添加本地控制器的 Unix socket ovs-vsctl set-controller br0 unix:/var/run/openvswitch/db.sock
删除控制器
# 删除 br0 的所有控制器 ovs-vsctl del-controller br0
查看控制器连接状态
# 查看控制器信息 ovs-vsctl list controller br0 # 使用 ovs-appctl 查看详细连接状态 ovs-appctl controller/list-connections
镜像 和 Patch Port
创建 Patch Port Patch Port 用于连接两个 OVS 网桥,实现跨网桥通信。
# 创建一对 patch port,连接 br0 和 br1 ovs-vsctl add-port br0 patch0 -- set interface patch0 type=patch options:peer=patch1 ovs-vsctl add-port br1 patch1 -- set interface patch1 type=patch options:peer=patch0
综合示例
场景:创建一个 OVS 网桥,连接一个物理网卡和一个虚拟机 veth 接口,并配置 VLAN。
-
创建 OVS 网桥
ovs-vsctl add-br br-vlan
-
将物理网卡
eth1加入网桥,并配置为 Trunk 模式ovs-vsctl add-port br-vlan eth1 ovs-vsctl set port eth1 trunks=100,200
-
创建 veth pair 并加入网桥,配置为 Access 模式
ip link add vvm-veth type veth peer name vm-veth ovs-vsctl add-port br-vlan vvm-veth ovs-vsctl set port vvm-veth tag=100
-
启动并配置接口
ip link set br-vlan up ip link set eth1 up ip link set vvm-veth up ip link set vm-veth up # 为 vm-veth 分配一个 IP 地址,模拟虚拟机 ip addr add 192.168.100.10/24 dev vm-veth
-
验证配置
# 查看网桥和端口 ovs-vsctl show
输出结果可能如下:
4f6b8c9e-5a2b-4c3d-9e0f-1a2b3c4d5e6f Bridge br-vlan Port br-vlan Interface br-vlan type: internal Port eth1 Interface eth1 Port vvm-veth tag: 100 Interface vvm-veth ovs_version: "2.17.0"
其他重要工具
除了 ovs-vsctl,你还应该了解这些辅助工具:
-
ovs-ofctl: 用于直接操作 OpenFlow 流表,查看、添加、删除流规则。ovs-ofctl show br0: 显示网桥端口和 OpenFlow 版本。ovs-ofctl dump-flows br0: 打印所有流规则。ovs-ofctl add-flow br0 "dl_type=0x0800,nw_proto=6,actions=drop": 添加一条丢弃所有 TCP 流量的规则。
-
ovs-appctl: 用于与 OVS 的内部进程(如ovs-vswitchd,ovsdb-server)通信,获取调试信息和发送控制命令。ovs-appctl -t /var/run/openvswitch/ovs-vswitchd.pid.ctl vlog/set:any:dbg: 设置日志级别为调试。ovs-appctl dpif/show-dp-features br0: 显示网桥的数据路径特性。
-
ovs-dpctl: 用于检查和管理数据路径内核模块。ovs-dpctl show: 显示所有数据路径及其端口。
-
ovs-appflowctl: 用于监控和管理 AppFlow。
希望这份详细的指南能帮助你更好地理解和使用 Open vSwitch!
