4、OVS基本管理命令:四大金刚详解
好,咱们进入正题。OVS 的管理命令,说白了就是四个核心工具:ovs-vsctl、ovs-ofctl、ovs-appctl 和 ovsdb-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-flow 或 mod-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/show、vlog/list、fdb/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-vsctl 和 ovs-ofctl 练熟,这两个是日常用得最多的。遇到疑难杂症时,再掏出 ovs-appctl 和 ovsdb-client 来排查。
好,这一章就到这里。下一章我们聊聊 OVS 的 VLAN 配置,这可是网络隔离的基础。