第4章:OVS基本操作:ovs-vsctl命令详解、创建/删除网桥、添加/删除端口

好,咱们进入正题。这一章我带你亲手操作OVS,把那些最核心的命令玩熟。说实话,很多新手一上来就被OVS的各种命令搞晕了,其实没那么复杂。你只要掌握几个关键操作,就能搞定90%的日常工作了。

4.1 ovs-vsctl命令概览

ovs-vsctl 是OVS的瑞士军刀。它负责管理OVS的数据库,说白了就是控制OVS的配置。我习惯把它理解为「OVS的遥控器」——你想让OVS做什么,就用它来发指令。

它的基本语法很简单:

ovs-vsctl [选项] 命令 [参数]

常用的选项就几个:

  • --db:指定数据库地址,默认连本机
  • --timeout:超时时间,我一般设30秒
  • -v:显示详细信息,调试时很有用
我的小习惯:每次操作前,先跑一遍 ovs-vsctl show 看看当前状态。这就像开车前先看仪表盘,能避免很多低级错误。

4.2 创建和删除网桥

网桥是OVS的核心概念。你可以把它想象成一个虚拟的交换机,所有流量都经过它转发。

4.2.1 创建网桥

创建网桥的命令就一行:

ovs-vsctl add-br br0

这条命令会创建一个名为 br0 的网桥。我在项目中遇到过一个问题:创建网桥后,系统会自动生成一个同名的虚拟接口。这个接口默认是UP状态的,但如果你没配IP,它其实是个「哑巴」——能收发包,但没法路由。

创建多个网桥也很简单:

ovs-vsctl add-br br-int
ovs-vsctl add-br br-tun
ovs-vsctl add-br br-ex

嗯,这里要注意:网桥名字不要用特殊字符,最好只用字母、数字和下划线。我曾经见过有人用中文命名,结果脚本跑崩了……

4.2.2 查看网桥信息

创建完后,怎么确认它存在?用这个:

ovs-vsctl list-br

它会列出所有网桥的名字。想看详细信息,就用:

ovs-vsctl show

这个命令的输出很直观,会显示每个网桥的端口、状态等信息。我每次排查网络问题,第一件事就是跑这个命令。

4.2.3 删除网桥

删除网桥更简单:

ovs-vsctl del-br br0

但我要提醒你:删除网桥会同时删除它上面的所有端口和配置。这个操作不可逆!我曾经在测试环境里手滑删错了网桥,结果整个虚拟网络都瘫痪了……从那以后,我每次删网桥前都会先确认三遍。

重要提醒:删除网桥前,务必确认没有虚拟机或容器在使用它。否则你会看到一堆连接超时的报错。

4.3 添加和删除端口

网桥建好了,接下来就是往上面插「网线」——也就是添加端口。端口是OVS和外界通信的通道。

4.3.1 添加物理端口

把物理网卡加到网桥上,命令是这样的:

ovs-vsctl add-port br0 eth0

这条命令会把 eth0 这个物理网卡绑定到 br0 上。注意:一旦绑定,eth0 原有的IP配置就失效了。你得把IP配到网桥接口上。

我刚开始做OpenStack时,就踩过这个坑:把物理网卡加到网桥后,发现SSH连不上服务器了。后来才明白,IP得配到 br0 上,而不是 eth0

4.3.2 添加虚拟端口

除了物理端口,OVS还支持多种虚拟端口。最常用的是 internal 类型:

ovs-vsctl add-port br0 vport0 -- set Interface vport0 type=internal

这条命令创建了一个名为 vport0 的内部端口。它看起来像个虚拟网卡,可以配IP、可以抓包。在Neutron里,很多网络设备都是用这种方式实现的。

还有一种常见的虚拟端口是 patch 端口,用于连接两个网桥:

ovs-vsctl add-port br-int patch-tun -- set Interface patch-tun type=patch options:peer=patch-int
ovs-vsctl add-port br-tun patch-int -- set Interface patch-int type=patch options:peer=patch-tun

你看,这两个端口互相指向对方,就形成了一个通道。Neutron的集成网桥和隧道网桥就是这么连起来的。

4.3.3 查看端口信息

想知道网桥上有哪些端口?用这个:

ovs-vsctl list-ports br0

想看更详细的信息,比如端口类型、状态、统计信息:

ovs-vsctl list interface vport0

这个命令会输出一大堆参数。我一般重点关注 typeofportstatistics 这几个字段。

4.3.4 删除端口

删除端口用这个:

ovs-vsctl del-port br0 eth0

或者只指定端口名,不指定网桥:

ovs-vsctl del-port eth0

第二种写法会自动找到端口所在的网桥并删除。我个人习惯用第一种,更明确,不容易出错。

避坑指南:删除端口后,如果这个端口是物理网卡,它会被释放回系统。但它的IP配置不会自动恢复,你得手动配一下。我曾经因为这个被运维同事骂过……

4.4 实战:搭建一个简单的OVS网络

光说不练假把式。咱们来搭一个简单的环境,把刚才学的都用上。

假设我们要创建一个网桥,上面挂一个物理网卡和一个内部端口:

# 1. 创建网桥
ovs-vsctl add-br br-demo

# 2. 添加物理端口
ovs-vsctl add-port br-demo eth1

# 3. 添加内部端口
ovs-vsctl add-port br-demo vport-demo -- set Interface vport-demo type=internal

# 4. 给内部端口配IP
ip addr add 192.168.100.1/24 dev vport-demo
ip link set vport-demo up

# 5. 查看最终状态
ovs-vsctl show

跑完这些命令,你就有了一个可以工作的OVS网桥。物理网卡 eth1 负责和外部通信,内部端口 vport-demo 可以给虚拟机或容器用。

你想想看,这个结构是不是和Neutron里的集成网桥很像?其实就是同一个思路。

4.5 常用命令速查表

为了方便你日常使用,我把常用命令整理成了表格:

操作 命令 说明
创建网桥 ovs-vsctl add-br <网桥名> 创建一个OVS网桥
删除网桥 ovs-vsctl del-br <网桥名> 删除网桥及其所有端口
列出网桥 ovs-vsctl list-br 显示所有网桥名称
添加端口 ovs-vsctl add-port <网桥> <端口> 添加物理或虚拟端口
删除端口 ovs-vsctl del-port <网桥> <端口> 从网桥移除端口
列出端口 ovs-vsctl list-ports <网桥> 显示网桥上的所有端口
查看接口详情 ovs-vsctl list interface <端口> 显示端口的详细配置和状态
查看整体状态 ovs-vsctl show 显示所有网桥和端口的概要信息

核心要点:

  • ovs-vsctl 是OVS的配置入口,必须熟练掌握
  • 网桥是虚拟交换机,端口是它的接口
  • 物理端口和虚拟端口用法不同,但管理方式一样
  • 操作前先 show 一下,养成好习惯

好了,这一章的内容就到这里。你把这些命令敲一遍,基本就能上手操作OVS了。下一章咱们会深入OVS的流表,那才是真正好玩的地方。