Etcnet/openvswitch

Материал из ALT Linux Wiki

Настройка openvswitch из etcnet

Что такое OVS (openvswitch) и зачем его использовать лучше прочитать на официальном сайте http://openvswitch.org/support/

OVS сложная система. Имеет собственную базу данных, где хранит настройки. И не все эти порты и бриджи могут отражаться в системе как сетевые интерфейсы. В связи с чем создавать интерфейс (папку в /etc/net/ifaces) для такого типа порта нет смысла, т.к. etcnet оперирует реальными интерфейсами. Поэтому управлять будем только теми ресурсами которые реально отражаются в системе как сетевые интерфейсы. Это 3 типа интерфейсов: бридж реальный и фейковый (ovsbr), порт типа internal (ovsport) и специальный тип порта - бондинг (ovsbond). Реальный и фейковый бридж по сути имеют один тип ovsbr и отличаются только наличием родительского бриджа и влана. Порт типа не internal это или существующий реальный интерфейс (eth0) или не отраженные в операционной системе интерфейсы (нпример gre, veth). Поэтому я не выделяю их для etcnet. Все это должно настраиваться через OVS_EXTRA.

Бридж

Для создания этого типа в options должно быть:

TYPE=ovsbr 

Также как опция может быть указан список сетевых интерфейсов, которые должны быть добавлены в данный бридж. Они будут запущены и добавлены в бридж.

HOST='eth2' 

NB! Нельзя сюда писать порты OVS (тип ovsport или ovsbond). Они должны быть описаны отдельно, т.к. для их добавления требуется уже существующий бридж.

В результате будет создан бридж. Проверить можно командой

#ovs-vsctl show

Фейковый бридж

Данный вид бриджа можно использовать в ситуации, когда нет возможности задать влан на порту или когда вы его не знаете. Например подобная ситуация описана в http://blog.scottlowe.org/2012/10/19/vlans-with-open-vswitch-fake-bridges/ . Для создания такого бриджа нужно указывать родительский бридж и влан. Для этого дополнительно к тем переменным что используются для реального бриджа, указываем:

BRIDGE=br0
VID=105

И тогда будет создаваться фейковый бридж

Порт типа internal

Для его создания в options должно быть:

 TYPE=ovsport 

Бридж в который должен этот порт добавиться:

 BRIDGE=br0 

В результате получится сетевой интерфейс который может управляться через утилиту ip и др.

Порт бондинг

Специальный тип порта для объединения 2х физических сетевых интерфейса в один. Для его создания в options должно быть

 TYPE=ovsbond 

Бридж в который должен этот порт добавиться:

 BRIDGE=br0 

Также должны быть указаны не меньше 2х сетевых интерфейсов, которые должны быть добавлены в данный порт.

 HOST='eth1 eth2' 

Общие настройки для всех типов

Для задания всех остальных всевозможных настроек, должны использоваться переменные: OVS_REMOVE Если установлено в yes, то при отключении интерфейса, данный порт будет удален из базы данных OVS. Осторожно, т.к. некоторые параметры, например MAC будет сгенерирован заново. OVS_OPTIONS параметры которые должны быть переданы для настройки данного бриджа или порта. Возможные поля для бриджа можно посмотреть командой:

# ovs-vsctl list bridge
_uuid               : 6aac9201-4272-41cc-a7be-1a36e00f6748
controller          : []
datapath_id         : "000078e7d17fcf13"
datapath_type       : ""
external_ids        : {}
fail_mode           : []
flood_vlans         : []
flow_tables         : {}
ipfix               : []
mirrors             : []
name                : "ovsbr0"
netflow             : []
other_config        : {}
ports               : [1de75723-f51e-441b-8d69-e6536d9dcfad, 47988e8e-23bd-494b-bbd0-49b7fa79e23c, 58a10ab2-f344-46f9-a313-104c23ba2a8b]
protocols           : []
sflow               : []
status              : {}
stp_enable          : false

Тогда если мы хотим включить STP, нужно написать:

OVS_OPTIONS='stp_enable=yes'

Для порта можно посмотреть командой:

# ovs-vsctl list port
_uuid               : 58a10ab2-f344-46f9-a313-104c23ba2a8b
bond_downdelay      : 0
bond_fake_iface     : false
bond_mode           : []
bond_updelay        : 0
external_ids        : {}
fake_bridge         : false
interfaces          : [987b7dfe-34b4-4d55-b9ae-dedfa05d9779]
lacp                : []
mac                 : []
name                : "ovsport0"
other_config        : {}
qos                 : []
statistics          : {}
status              : {}
tag                 : []
trunks              : []
vlan_mode           : []

Если нужно настраивать дополнительно другие интерфейсы или параметры, то это делать нужно через Database Commands (см. соответствующую секцию в ovs-vsctl(8)) Это все указывается в OVS_EXTRA Например влан, тип и т.д.

 OVS_EXTRA='set port eth0 tag=10 -- set port eth1 trunk="1,2,15" ' 

Данные переменные действуют для всех типов сетевых интерфейсов ovs*.

Примеры

Простая настройка:

$ cat ens18/options 
TYPE=eth
CONFIG_WIRELESS=no
BOOTPROTO=static
CONFIG_IPV4=yes

$ cat vmbr0/options
TYPE=ovsbr
CONFIG_WIRELESS=no
BOOTPROTO=static
CONFIG_IPV4=yes
ON_BOOT=yes
HOST="ens18"

# ovs-vsctl show
6669027e-d2a5-4f23-8d36-bf279d39355c
    Bridge "vmbr0"
        Port "vmbr0"
            Interface "vmbr0"
                type: internal
        Port "ens18"
            Interface "ens18"
    ovs_version: "2.11.1"

Настройка VLAN (добавляется к предыдущим):

# cat vlan495/options 
TYPE=ovsport
CONFIG_WIRELESS=no
BOOTPROTO=static
CONFIG_IPV4=yes
BRIDGE=vmbr0
VID=495

# cat vlan666/options 
TYPE=ovsport
CONFIG_WIRELESS=no
BOOTPROTO=static
CONFIG_IPV4=yes
BRIDGE=vmbr0
VID=666

# ovs-vsctl show
6669027e-d2a5-4f23-8d36-bf279d39355c
    Bridge "vmbr0"
        Port "vmbr0"
            Interface "vmbr0"
                type: internal
        Port "ens18"
            Interface "ens18"
        Port "vlan495"
            tag : 495
            Interface "vlan495"
                type: internal
        Port "vlan666"
            tag : 666
            Interface "vlan666"
                type: internal
    ovs_version: "2.11.1"

Однако, пока не решен altbug #38578, необходимо тэги проставить вручную:

# ovs-vsctl set port vlan495 tag=495
# ovs-vsctl set port vlan666 tag=666