Etcnet/openvswitch
Настройка 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