4、OVS基本管理命令:四大金刚详解

好,咱们进入正题。OVS 的管理命令,说白了就是四个核心工具:ovs-vsctlovs-ofctlovs-appctlovsdb-client。我刚开始接触 OVS 时,也经常搞混它们各自该干什么。今天我就把这四个「金刚」掰开揉碎了讲清楚。

4.1 ovs-vsctl:OVS 的「配置总管」

ovs-vsctl 是我用得最多的命令,没有之一。它负责跟 OVS 的数据库(OVSDB)打交道。你想想看,OVS 的所有配置——Bridge、Port、Interface——都存在这个数据库里。ovs-vsctl 就是操作这个数据库的 CLI 工具。

4.1.1 核心操作:增删改查

我个人习惯把它的操作分成四类:

  • 查(show/list/get):查看当前配置
  • 增(add-bridge/add-port):创建 Bridge 或 Port
  • 改(set):修改已有对象的属性
  • 删(del-bridge/del-port):删除对象

举个例子,查看当前所有 Bridge:

ovs-vsctl show

输出会列出所有 Bridge、Port 以及它们的 Interface。嗯,这里要注意,show 命令的输出是树形结构,一眼就能看清层级关系。

创建一个 Bridge:

ovs-vsctl add-br br0

给 br0 添加一个 Port:

ovs-vsctl add-port br0 eth0
我的小技巧: 如果你不确定某个命令的参数,可以用 ovs-vsctl --help 或者 man ovs-vsctl。我曾经在项目里因为记错参数名,把 Port 的 VLAN tag 配错了,排查了半天才发现是命令写错了。

4.1.2 常用参数:--may-exist 和 --if-exists

这两个参数很实用。--may-exist 的意思是「如果对象已存在,不报错」。比如:

ovs-vsctl --may-exist add-br br0

如果 br0 已经存在,这条命令不会报错,直接返回成功。这在脚本里特别有用。

--if-exists 则用于删除操作:

ovs-vsctl --if-exists del-br br0

如果 br0 不存在,不会报错。说白了,就是让脚本更健壮。

4.2 ovs-ofctl:流表操作的「瑞士军刀」

ovs-ofctl 是直接跟 OpenFlow 协议打交道的命令。它不碰数据库,只操作流表。我经常用它来调试转发行为。

4.2.1 查看流表

查看 br0 上的所有流表:

ovs-ofctl dump-flows br0

输出会显示每条流表的匹配条件、优先级、动作和统计信息。我记得有一次,客户反馈网络不通,我第一反应就是 dump-flows 看看。结果发现有一条流表的优先级设错了,导致流量被错误地丢弃。

4.2.2 添加流表

添加一条流表,让来自 192.168.1.0/24 的流量转发到 port 1:

ovs-ofctl add-flow br0 "ip,nw_src=192.168.1.0/24,actions=output:1"
避坑指南: 我曾经在生产环境直接执行 add-flow,结果覆盖了已有的流表。后来我养成了习惯:先用 dump-flows 看看现有流表,再用 add-flowmod-flows 修改。千万别手滑。

4.2.3 删除流表

删除所有匹配某个条件的流表:

ovs-ofctl del-flows br0 "ip,nw_src=192.168.1.0/24"

如果不加匹配条件,会删除所有流表。嗯,这个操作要小心。

4.3 ovs-appctl:OVS 进程的「诊断工具」

ovs-appctl 是跟 OVS 守护进程(vswitchd)通信的命令。它不修改配置,主要用于诊断和调试。你想想看,当 OVS 运行异常时,ovs-appctl 就是你的第一手诊断工具。

4.3.1 查看端口统计

ovs-appctl bond/show

这个命令会显示 bond 端口的状态、负载均衡情况。我在做链路聚合时,经常用它来检查流量是否均匀分布。

4.3.2 查看日志级别

ovs-appctl vlog/list

输出会列出所有模块的日志级别。如果某个模块日志太多,可以临时调整:

ovs-appctl vlog/set dpif:dbg

把 dpif 模块的日志级别设为 debug。调试完记得改回去,不然日志会刷屏。

4.3.3 查看连接状态

ovs-appctl ovsdb-server/get-db-status

这个命令会显示 OVSDB 的连接状态。如果 OVS 无法启动,我第一件事就是跑这个命令,看看数据库是不是坏了。

我的经验: ovs-appctl 有很多子命令,可以用 ovs-appctl --help 查看完整列表。我个人习惯把常用的几个记在笔记里,比如 bond/showvlog/listfdb/show

4.4 ovsdb-client:数据库的「直接操作」

ovsdb-client 是直接操作 OVSDB 的命令。它比 ovs-vsctl 更底层,可以执行任意 SQL 风格的查询。说实话,日常运维中用得不多,但排查复杂问题时非常有用。

4.4.1 查询 Bridge 表

ovsdb-client dump Bridge

输出会显示所有 Bridge 的详细信息,包括 UUID、名称、端口列表等。这比 ovs-vsctl show 更原始,但信息更全。

4.4.2 执行事务

ovsdb-client transact '[["Open_vSwitch", {"op": "select", "table": "Bridge", "where": []}]]'

这个命令会返回 JSON 格式的结果。嗯,说实话,我很少直接用 transact,除非是在写自动化脚本时需要直接操作数据库。

4.4.3 监控数据库变化

ovsdb-client monitor Open_vSwitch Bridge

这个命令会实时显示 Bridge 表的变化。我在调试 OVS 配置同步问题时,经常开着这个窗口,一边改配置一边看变化。

注意: ovsdb-client 直接操作数据库,如果操作不当,可能导致 OVS 配置损坏。我建议只在测试环境使用,或者至少先备份数据库。

4.5 四个命令的对比总结

命令 作用对象 主要用途 使用频率
ovs-vsctl OVSDB 配置管理(增删改查) 最高
ovs-ofctl 流表 转发规则管理
ovs-appctl 守护进程 诊断、调试、日志
ovsdb-client OVSDB 底层数据库操作

说白了,这四个命令各有分工:ovs-vsctl 管配置,ovs-ofctl 管转发,ovs-appctl 管诊断,ovsdb-client 管底层。我建议你先把 ovs-vsctlovs-ofctl 练熟,这两个是日常用得最多的。遇到疑难杂症时,再掏出 ovs-appctlovsdb-client 来排查。

好,这一章就到这里。下一章我们聊聊 OVS 的 VLAN 配置,这可是网络隔离的基础。