Open vSwitch

出自 ArchWiki

此条目或章节需要扩充。

原因: 此条目需要更好的解释和扩充。(在Talk:Open vSwitch中讨论)

Open vSwitch (OVS) 是一个多层软件交换机。它旨在通过程序化扩展实现大规模网络自动化,同时仍然支持标准的管理接口和协议。 Open vSwitch 非常适合作为虚拟机环境中的虚拟交换机。

安装

安装 openvswitch 软件包。

所需服务和设置

要使用 ovs-vswitchd启动/启用 ovs-vswitchd.service

ovs-vswitchd.service 也会启动 ovsdb-server.service,后者用于在数据库中保存 OVS 配置,以便在重启后保持设置持久化。

创建桥接

# ovs-vsctl add-br mybridge

大多数命令可以通过将 add 替换为 del 来反转,例如 del-br。

打印新创建的桥接,其中一个端口的接口名为 mybridge

# ovs-vsctl show
e4e95383-2d81-45bd-b411-d289b11405b2
    Bridge mybridge
        Port mybridge
            Interface mybridge
                type: internal

将物理适配器添加到桥接

获取当前活动的接口和配置

$ ip addr
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:91:11:95 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 brd 192.168.1.255 scope global dynamic eno1
       valid_lft 82284sec preferred_lft 82284sec
    inet6 fe80::5054:ff:fe91:1195/64 scope link
       valid_lft forever preferred_lft forever

禁用任何正在运行的自动配置,任选其一

# dhcpcd -k eno1 # if dhcpcd is running
# systemctl stop systemd-networkd.service # for systemd-networkd
# ip addr del 192.168.1.10/24 dev eno1 #  also remove the current ip configuration

将物理接口添加到 mybridge

# ovs-vsctl add-port mybridge eno1
警告: 这将导致此适配器失去连接,请确保您有其他方式可以访问您的系统。

打印当前设置

# ovs-vsctl show
e4e95383-2d81-45bd-b411-d289b11405b2
    Bridge mybridge
        Port mybridge
            Interface mybridge
                type: internal
        Port eno1
            Interface eno1

测试配置

# dhcpcd mybridge
$ ip addr
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master ovs-system state UP group default qlen 1000
    link/ether 52:54:00:91:11:95 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::5054:ff:fe91:1195/64 scope link
       valid_lft forever preferred_lft forever
3: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 6e:a7:28:66:78:e2 brd ff:ff:ff:ff:ff:ff
4: mybridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether ba:21:d0:cd:38:4f brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.11/24 brd 192.168.1.255 scope global dynamic noprefixroute mybridge
       valid_lft 86372sec preferred_lft 75572sec
    inet6 fe80::183e:d590:9014:eeb4/64 scope link
       valid_lft forever preferred_lft forever

使更改在重启后持久化

Open vSwitch 将自动应用使用 ovs-commands 所做的任何更改。但是为了使其工作,我们需要使用 systemd-networkd 更改一些内容。

首先,删除 eno1 的任何旧配置,并在启动期间启动该接口。我们还将使用以下配置在 mybridge 上运行 DHCP

/etc/systemd/network/eno1.network
[Match]
Name=eno1

[Link]
RequiredForOnline=carrier

[Network]
IPv6AcceptRA=false
LinkLocalAddressing=no
MulticastDNS=false
LLMNR=false
/etc/systemd/network/mybridge.network
[Match]
Name=mybridge

[Link]
RequiredForOnline=routable

[Network]
DHCP=yes

Vlan

通过物理端口设置 trunk,使用 vlan 10 + 20 以及标记为 vlan 1 的未标记流量

# ovs-vsctl set port eno1 vlan_mode=native-untagged
# ovs-vsctl set port eno1 tag=1 # tag untagged vlan 1
# ovs-vsctl set port eno1 trunks=10,20 # allow tagged vlans 10 and 20
提示: 使用 -- 作为分隔符在一个命令中执行多个操作,例如,以上命令等同于
# ovs-vsctl set port eno1 vlan_mode=native-untagged -- set port eno1 tag=1 -- set port eno1 trunks=10,20

创建一个新的 vport1,类型为 internal,用于主机系统,vlan 为 10

# ovs-vsctl add-port mybridge vport1 tag=10 -- set Interface vport1 type=internal
# dhcpcd vport1 # to test it out!

虚拟端口

虚拟端口和虚拟机支持需要 ip_forward

# echo 1 > /proc/sys/net/ipv4/ip_forward

手动创建一个 tuntap 接口

# ip tuntap add mode tap vport2

为了使以上两个更改在重启后持久化

/etc/sysctl.conf
net.ipv4.ip_forward = 1
/etc/systemd/network/90-vport2.netdev
[NetDev]
Name=vport2
Kind=tap

创建一个新端口并将其标记为 vlan 20

# ovs-vsctl add-port mybridge vport2 -- set port vport2 tag=20

vport2 现在可以在 libvirt 中使用。

参见