Рубрики
ovs / openvswitch / dpdk

ovs / openvswitch

ссылки:

https://www.openvswitch.org/
https://docs.openvswitch.org/en/latest/faq/issues/
https://www.openvswitch.org/support/dist-docs/ovs-vswitchd.conf.db.5.html
https://docs.openvswitch.org/en/latest/intro/install/dpdk/
https://habr.com/ru/companies/intel/articles/309836/

Информация о бридже:

ovs-vsctl show
ovs-vsctl list port
ovs-ofctl show ovsbr0

Создание бриджа и добавление сетевой карты:

ovs-vsctl add-br ovsbr0
ovs-vsctl add-port ovsbr0 eth0
ovs-vsctl add-port ovsbr0 eth1
ovs-vsctl add-port ovsbr0 wlan0

Назначение IP адреса на бридж:

ip addr flush dev eth0
ip addr add 192.168.128.5/24 dev ovsbr0
ip link set ovsbr0 up

Создание бриджа ovsbr0 и сделать bond:

ovs-vsctl add-br ovsbr0
ovs-vsctl add-bond ovsbr0 bond0 eth0 eth1
#mode  active-backup, balance-slb, or balance-tcp
ovs-vsctl add-bond ovsbr0 bond0 eth1 eth2 bond_mode=active-backup

Включить STP:

ovs-vsctl add-br ovsbr0
ovs-vsctl set bridge ovsbr0 stp_enable=true
ovs-vsctl add-port ovsbr0 eth0
ovs-vsctl add-port ovsbr0 eth1

Создание внутреннего устройства:

!!! так работать не будет:
## tunctl -t tap0
## ip addr add 192.168.0.123/24 dev tap0
## ip link set tap0 up
## ovs-vsctl add-br br0
##ovs-vsctl add-port br0 tap0

Почему:
Ответ в том, что Open vSwitch перехватывает только полученные пакеты, но это уже передаваемый пакет. 
То же самое происходит и со всеми остальными типами сетевых устройств, кроме «внутренних» портов Open vSwitch. 
Если вы, например, добавите физический порт Ethernet к мосту OVS, настроите IP-адрес на физическом порту Ethernet, 
а затем отправите «ping» на адрес в этой подсети, произойдет то же самое: 
ARP будет передан на физический порт Ethernet и Open vSwitch его никогда не видят.
Обратите внимание, что в таком случае на «отводном» устройстве не настраивается IP-адрес
(обычно IP-адрес настроен в виртуальном сетевом адаптере внутри виртуальной машины, но он не виден ядру хоста Linux или Open vSwitch).

А вот так все заработает:
ovs-vsctl add-br ovsbr0
ovs-vsctl add-port ovsbr0 int0 -- set Interface int0 type=internal
ip addr add 192.168.0.123/24 dev int0
ip link set int0 up

Потеря пакетов в начале тестов RFC2544

В случае OVS кэш очищается быстро, и чтобы учесть задержку генератора трафика между фазой обучения и тестирования, 
настройки максимального времени ожидания простоя следует изменить на 50000 мс:
ovs-vsctl --no-wait set Open_vSwitch . other_config:max-idle=50000

MTU

Установить mtu:
ovs-vsctl set int ovsbr0 mtu_request=1450

Вернуть mtu по умолчанию:
ovs-vsctl set int br0 mtu_request=[]

Добавление VLAN

Одним из больших плюсов работы с OpenVSwitch является поддержка VLAN. 
Для этого нужно обозначить теги на виртуальных портах и настроить сетевую карту как транковый интерфейс.

Создадим новый виртуальный коммутатор:
ovs-vsctl add-br ovsbr0

Добавляем реальную сетевую карту к виртуальному коммутатору:
ovs-vsctl add-port ovsbr0 eth0

Делаем порт коммутатора транковым и описываем теги, которые будут проходить через коммутатор:
ovs-vsctl set port eth0 trunks=10,20,300,400,1000

Добавляем виртуальный сетевой интерфейс и присваиваем ему тег:
ovs-vsctl add-port ovsbr0 testvlan20 tag=20 -- set interface testvlan20 type=internal

Теперь можно посмотреть конфигурацию:
ovs-vsctl show

Еще примеры:
обычное использование без vlan:
ovs-vsctl show - показывает информацию по свитчу, проверяем работу и заодно узнаем какая у нас версия ovs
ovs-vsctl add-br br0 - добавляем свитч с именем br0
ovs-vsctl add-port br0 eth0 - добавляем интерфейс eth0 в свитч br0 
 
пример с vlan:
ovs-vsctl add-br ovs0 - добавляем свитч openvswitch с именем br0
ovs-vsctl add-port ovs0 eth0 - добавляем интерфейс eth0 в свитч ovs0 
ovs-vsctl set port eth0 vlan_mode=native-untagged tag=2 trunks=2,3,4 - вешаем trunk на интерфейс eth0 
ovs-vsctl add-port ovs0 ovs0-vlan2 tag=2 -- set Interface ovs0-vlan2 type=internal - добавляем порт и вешаем access (tag=2) на интерфейс ovs0-vlan2
ovs-vsctl add-port ovs0 ovs0-vlan4 tag=4 -- set Interface ovs0-vlan4 type=internal - добавляем порт и вешаем access (tag=4) на интерфейс ovs0-vlan2
ovs-vsctl add-port ovs0 ovs0-vlan3 tag=3 -- set Interface ovs0-vlan3 type=internal - добавляем порт и вешаем access (tag=3) на интерфейс ovs0-vlan2
 
ovs-vsctl set port ovsbr0 tag=29
 
удаление портов и коммутатора:
ovs-vsctl del-port ovs0-vlan2 - удалить порт (ovs0-vlan2) из коммутатора
ovs-vsctl del-br ovs0 - удалить коммутатор ovs0

Включение Netflow на виртуальном коммутаторе OpenVSwitch:

Если возникает необходимость вести учет сетевого трафика, проходящего через интерфейсы, 
то заставить OpenVSwitch отправлять пакеты Netflow на адрес коллектора можно одной командой:
ovs-vsctl -- set Bridge ovsbr0 netflow=@nf -- --id=@nf create NetFlow targets="IP_ADDRESS:PORT" active-timeout=30

Изменить время:
ovs-vsctl set Netflow ovsbr0 active_timeout=60

Чтобы прекратить отправлять данные на Netflow коллектор, достаточно очистить настройки Netflow для виртуального коммутатора:
ovs-vsctl clear Bridge ovsbr0 netflow

dpdk

Выделение памяти:
numa0 mem:
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem="1024,0"
или numa
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem="1024"

Выделение процессоров:
Установленный бит в маске означает, что поток pmd создается и закрепляется за соответствующим ядром ЦП. 
Например, чтобы запустить потоки pmd на ядрах 1 и 2:
ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x6

Проверка доступности dpdk:
ovs-vsctl get Open_vSwitch . dpdk_initialized

Проверка версии ovs:
ovs-vswitchd --version

Проверка версии dpdk:
ovs-vsctl get Open_vSwitch . dpdk_version "DPDK 17.11.0"

Добавление сетевых карт в бридж ovs dpdk:
ovs-vsctl add-br ovsbr0 -- set bridge br0 datapath_type=netdev
ovs-vsctl add-port ovsbr0 eth0_name -- set Interface myportnameone type=dpdk options:dpdk-devargs=0000:06:00.0
ovs-vsctl add-port ovsbr0 eth1_name -- set Interface myportnametwo type=dpdk options:dpdk-devargs=0000:06:00.1

Очереди dpdk:
ovs-vsctl set Interface  options:n_rxq=
ovs-vsctl set Interface dpdk0 options:n_rxq_desc=
ovs-vsctl set Interface dpdk0 options:n_txq_desc=
Различные конфигурации n_rxq_desc и n_txq_desc дают разные преимущества с точки зрения пропускной способности и задержки для разных сценариев. 
Как правило, меньшие размеры очередей могут оказать положительное влияние на задержку за счет пропускной способности. 
Обратное часто справедливо для очередей большего размера. 
Примечание. Увеличение количества дескрипторов rx, например. до 4096 может отрицательно повлиять на производительность из-за того, 
что могут использоваться невекторизованные функции DPDK rx. 
Это зависит от используемого драйвера, но справедливо для часто используемых драйверов DPDK i40e и ixgbe.

Ограничения скорости / шейпер


ovs-vsctl set interface vhost-user1 ingress_policing_rate=10000 ingress_policing_burst=1000

ingress_policing_rate: максимальная скорость (Кбит/с), разрешенная для этой виртуальной машины. 
Это значение обязательно для создания ограничителя входящего трафика. 
Если значение не указано, существующая настройка ограничения скорости останется без изменений.

ingress_policing_burst: размер буфера маркеров в килобайтах. 
Минимальное значение этого параметра должно быть равно наибольшему предполагаемому размеру пакета. 
Если значение не указано, используется значение по умолчанию, равное 8000 КБ.


Существующую настройку ограничения скорости для vhost-user1 можно получить с помощью следующей команды:
ovs-vsctl list interface vhost-user1

Чтобы отменить ограничения скорости трафика vhost-user1, установите для параметра ingress_policing_rate значение 0, 
как показано ниже (настраивать значение параметра ingress_policing_burst не нужно):
ovs-vsctl set interface vhost-user1 ingress_policing_rate=0
Рубрики
ovs / openvswitch / dpdk

Faucet / openvswitch / OpenFlow / SDN

Ссылки:

http://www.openvswitch.org/support/ovscon2016/8/1450-mysore.pdf
https://docs.faucet.nz/en/latest/installation.html
https://github.com/faucetsdn/faucet
https://gist.github.com/cyrenity/397c6baebdc20d9a9e377523f256620e
https://github.com/wandsdn/sc18-ansible

Установка faucet:

### https://docs.faucet.nz/en/latest/installation.html#faucet-apt-install
sudo apt-get install curl gnupg apt-transport-https lsb-release
echo "deb https://packagecloud.io/faucetsdn/faucet/$(lsb_release -si | awk '{print tolower($0)}')/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/faucet.list
sudo curl -1sLf https://packagecloud.io/faucetsdn/faucet/gpgkey -o /etc/apt/trusted.gpg.d/faucet.asc
sudo apt-get update
sudo apt-get install faucet-all-in-one
sudo apt-get install faucet
sudo apt-get install gauge


### Настройка Prometheus
vim /etc/default/prometheus
---------------------------
...
ARGS="--config.file=/etc/faucet/prometheus/prometheus.yml"
...
---------------------------
systemctl restart prometheus.service 


### настройка grafana
sudo systemctl daemon-reload
sudo systemctl enable grafana-server
sudo systemctl start grafana-server
Сначала загрузите http://localhost:3000 в свой веб-браузер (по умолчанию и имя пользователя, и пароль admin).
Веб-интерфейс сначала предложит нам добавить источник данных. 
Используйте следующие настройки:
Name:   Prometheus
Type:   Prometheus
URL:    http://localhost:9090
Нажмите: Save & Test
Далее мы хотим добавить несколько информационных панелей, чтобы позже мы могли просматривать показатели из крана.
Наведите курсор на + кнопку на левой боковой панели в веб-интерфейсе и нажмите Import
https://docs.faucet.nz/en/latest/_static/grafana-dashboards/faucet_instrumentation.json
https://docs.faucet.nz/en/latest/_static/grafana-dashboards/faucet_inventory.json
https://docs.faucet.nz/en/latest/_static/grafana-dashboards/faucet_port_statistics.json

Настройка сервера faucet:

### https://docs.faucet.nz/en/latest/tutorials/first_time.html
### https://docs.faucet.nz/en/latest/configuration.html#configuration-options

Готовим конфиг faucet:
vim /etc/faucet/faucet.yaml
----------------------
---
include:
    - acls.yaml

vlans:
    office:
        vid: 100
        description: "office network"
        acls_in: [office-vlan-protect]
dps:
    sw0:
        dp_id: 0x4
        hardware: "Open vSwitch"
        interfaces:
            5:
                name: "5"
                description: "in5"
                native_vlan: office
            6:
                name: "6"
                description: "in6"
                native_vlan: office
    sw1:
        dp_id: 0x1
        hardware: "Open vSwitch"
        interfaces:
            2:
                name: "2"
                description: "in2"
                native_vlan: office
            3:
                name: "3"
                description: "in3"
                native_vlan: office
    sw2:
        dp_id: 0x2
        hardware: "Open vSwitch"
        interfaces:
            2:
                name: "2"
                description: "in2"
                native_vlan: office
            3:
                name: "3"
                description: "in3"
                native_vlan: office
    sw3:
        dp_id: 0x3
        hardware: "Open vSwitch"
        interfaces:
            6:
                name: "6"
                description: "in6"
                native_vlan: office
            7:
                name: "7"
                description: "in7"
                native_vlan: office
            8:
                name: "8"
                description: "in8"
                native_vlan: office
            9:
                name: "9"
                description: "in9"
                native_vlan: office

----------------------

vim /etc/faucet/acls.yaml 
-------------------------
---
acls:
    office-vlan-protect:
        # Prevent IPv4 communication betwen Office/Guest networks
        - rule:
              actions:
                  allow: 1        # allow
-------------------------


Проверяем на ошибки конфиг faucet:
check_faucet_config /etc/faucet/faucet.yaml

Логи:
tail  /var/log/faucet/faucet.log
journalctl -u faucet.service


Конфиг /etc/faucet/gauge.yaml отвечает за мониторинг faucet(grafana и prometheus).

Настройка openwswitch на клиентах:

### https://docs.faucet.nz/en/latest/vendors/ovs/faucet_testing_with_OVS_on_hardware.html?highlight=openvswitch#commands-on-open-vswitch
Установка пакетов:
apt-get install openvswitch-switch
systemctl status openvswitch-switch.service

Создание бриджа и добавление портов: 
ovs-vsctl add-br ovsbr0
ovs-vsctl add-port ovsbr0 ens3 -- set Interface ens3 ofport_request=1
ovs-vsctl add-port ovsbr0 ens4 -- set Interface ens4  ofport_request=2
ovs-vsctl add-port ovsbr0 ens5 -- set Interface ens5  ofport_request=3
ovs-vsctl add-port ovsbr0 ens6 -- set Interface ens6  ofport_request=4
ovs-vsctl set-fail-mode ovsbr0 secure
ovs-vsctl set bridge ovsbr0 protocols=OpenFlow13,OpenFlow10
ovs-vsctl set-controller ovsbr0 tcp:172.16.0.1:6636 tcp:172.16.0.1:6637

Получаем инфу по клиенту:
ovs-vsctl get bridge ovsbr0 datapath_id
ovs-vsctl show

Изменить настройку  fail_mode:
ovs-vsctl set  bridge ovsbr0  fail_mode=standalone
ovs-vsctl set  bridge ovsbr0  fail_mode=secure

Очистить настройку fail_mode: 
ovs-vsctl clear  bridge ovsbr0  fail_mode

Сменить datapath_id( 0x2 и 0x1 ):
ovs-vsctl set bridge ovsbr0 other-config:datapath-id=0000000000000001
ovs-vsctl set bridge ovsbr0 other-config:datapath-id=0000000000000002

Показать информацию о бридже и портах:
ovs-vsctl get  Interface ens4  ofport_request
ovs-vsctl show
ovs-vsctl list port
ovs-vsctl list port ovsbr0 
ovs-ofctl show ovsbr0
ovs-ofctl dump-tables ovsbr0
ovs-ofctl dump-flows ovsbr0
ovs-ofctl queue-get-config ovsbr0
ovs-vsctl get-controller br0
ovsdb-tool show-log
ovs-dpctl show
ovsdb-client dump


Сброс ovs:
ovs-vsctl emer-reset

Удачное подключение выглядит так:

#### Так вот
# ovs-vsctl show 
55432938-4f67-49b2-983e-bf0bb9f73336
    Bridge ovsbr0
        Controller "tcp:172.16.0.1:6637"
            is_connected: true
        Controller "tcp:172.16.0.1:6636"
            is_connected: true

### Если нет проверяем соответствие портов

vim /etc/default/faucet 
vim /etc/default/gauge

## 
ss -tpln 

## Логи:
tail  /var/log/faucet/faucet.log
journalctl -u faucet.service

Рубрики
ovs / openvswitch / dpdk

debian / openvswitvh / dpdk

0. устанавливаем
apt install openvswitch-switch-dpdk

1. добавить в конец 
vim /etc/dpdk/interfaces  
------------------------------
pci     0000:09:00.0    vfio-pci 
pci     0000:09:00.1    vfio-pci
------------------------------

2. добавить в конец 
vim /etc/dpdk/dpdk.conf
-----------------------
NR_2M_PAGES=1024
NR_1G_PAGES=4
------------------------

3. настраиваем ovs
!!! Для проверки номерации ядер в системе можно использовать команду lstopo из пакета hwloc.
!!! lstop
!!! (numactl -H) Установите ядра процессора, на которых должны создаваться потоки ядра dpdk dpdk-core-mask: (требуется шестнадцатеричная строка для наборов процессоров)

ovs-vsctl set Open_vSwitch . "other_config:dpdk-init=true"
ovs-vsctl set Open_vSwitch . "other_config:dpdk-lcore-mask=0x1"
ovs-vsctl set Open_vSwitch . "other_config:dpdk-socket-mem=2048"
ovs-vsctl set Open_vSwitch . "other_config:vhost-iommu-support=true"
systemctl restart ovs-vswitchd.service

4. Создаем бридж и добавляем сетевые карты
ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev 
ovs-vsctl add-port br0 dpdk-p0 -- set Interface dpdk-p0 type=dpdk options:dpdk-devargs=0000:09:00.0 
ovs-vsctl add-port br0 dpdk-p1 -- set Interface dpdk-p1 type=dpdk options:dpdk-devargs=0000:09:00.1
Рубрики
ovs / openvswitch / dpdk

openvswitch / ovs-vsct / dpdk / debian 11 / ubuntu / modprobe / apt /

Ссылки:

http://core.dpdk.org/doc/
https://doc.dpdk.org/guides/tools/devbind.html


https://ubuntu.com/server/docs/network-dpdk
https://ubuntu.com/server/docs/openvswitch-dpdk
https://ubuntu.com/server/docs/search?q=openvswitch&siteSearch=https%3A%2F%2Fubuntu.com%2Fserver%2Fdocs
https://askubuntu.com/questions/1128111/how-to-install-openvswitch-in-ubuntu-16-04

https://habr.com/ru/company/huawei/blog/653839/
https://habr.com/ru/company/intel/blog/280502/


https://docs.microsoft.com/ru-ru/azure/virtual-network/setup-dpdk

https://selectel.ru/blog/vvedenie-v-dpdk-arxitektura-i-princip-raboty/
https://habr.com/ru/company/selectel/blog/313150/


https://docs.openvswitch.org/en/latest/intro/

https://www.intel.com/content/www/us/en/developer/articles/technical/open-vswitch-with-dpdk-overview.html


https://forum.proxmox.com/threads/tutorial-run-open-vswitch-ovs-dpdk-on-pve-7-0.97116/

https://ovs.readthedocs.io/en/latest/howto/dpdk.html

https://doc.dpdk.org/guides/sample_app_ug/l2_forward_real_virtual.html

https://docs.openvswitch.org/en/latest/intro/install/dpdk/

https://habr.com/ru/post/267591/

http://core.dpdk.org/supported/

Установка openvswitch \ debian:

Установка:
sudo apt update
sudo apt upgrade
sudo apt install openvswitch-switch

Установка зависимостей:
sudo apt install build-essential fakeroot graphviz autoconf automake bzip2 debhelper dh-autoreconf libssl-dev libtool openssl procps python-all python-qt4 python-twisted-conch python-zopeinterface module-assistant dkms make libc6-dev python-argparse uuid-runtime netbase kmod python-twisted-web iproute2 ipsec-tools openvswitch-switch racoon

sudo dpkg-checkbuilddeps

Установка openvswitch dpdk \debian:

Удаляем обычный openvswitch
apt remove openvswitch-* --purge
apt autoremove -f 

Удаляем конфигурации openvswitch: 
rm usr/local/var/run/openvswitch /usr/local/etc/openvswitch /var/log/openvswitch /var/lib/openvswitch -rf 

Устанавливаем openvswitch-switch-dpdk:
apt install openvswitch-switch-dpdk

Пример использование DPDK

0. добавили драйверы с поддержкой dpdk: 
vfio-pci 
uio_pci_generic 
ixgbe

1. Создали бридж в openvswitch-switch-dpdk

2. Добавили в него сетевую карту dpdk-p1

Добавление сетевой карты в управление DPDK:

dpdk-devbind --status - проверяем состояние dpdk (доступные \ подключенные устройства)

Загружаем модули ядра 
modprobe vfio-pci
modprobe uio_pci_generic
modprobe ixgbe

Драйверы для устройств:
vfio-pci
uio_pci_generic
Чтобы понять какой IO нужен для работы с картой, сначала пробуем vfio-pci, а если в dmesg будет ошибка - "привязываем" к uio_pci_generic.
dpdk-devbind --bind=vfio-pci 09:00.0
dmesg 
dpdk-devbind --bind=uio_pci_generic 09:00.0

DPDK device config

/etc/dpdk/interfaces
--------------------
pci 0000:09:00.0 uio_pci_generic
--------------------

dpdk-devbind --status - проверяем состояние dpdk (доступные \ подключенные устройства)

DPDK hugapages

vim /etc/dpdk/dpdk.conf
-----------------------
NR_2M_PAGES=1024
NR_1G_PAGES=4
------------------------

dpdk-hugepages -p 1G --setup 2G

Подготовка OVS для использования DPDK

# Enable DPDK support
ovs-vsctl set Open_vSwitch . "other_config:dpdk-init=true"
# run on core 1 only
ovs-vsctl set Open_vSwitch . "other_config:dpdk-lcore-mask=0x1"
# allocate 2G huge pages
ovs-vsctl set Open_vSwitch . "other_config:dpdk-socket-mem=2048"
# enable vhost-user-client IOMMU support
ovs-vsctl set Open_vSwitch . "other_config:vhost-iommu-support=true"
# restart OVS
systemctl restart ovs-vswitchd.service

# problem 
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
# restart OVS
systemctl restart ovs-vswitchd.service

Создание br0 и добавление dpdk-p0

ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
ovs-vsctl add-port br0 dpdk-p0 -- set Interface dpdk-p0 type=dpdk options:dpdk-devargs=0000:09:00.1

PMD Thread Statistics:

To show current stats:
ovs-appctl dpif-netdev/pmd-stats-show

To clear previous stats:
ovs-appctl dpif-netdev/pmd-stats-clear

Port/RXQ Assigment to PMD Threads:

To show port/rxq assignment:
ovs-appctl dpif-netdev/pmd-rxq-show

To change default rxq assignment to pmd threads, rxqs may be manually pinned to desired cores using:
ovs-vsctl set Interface  other_config:pmd-rxq-affinity=

where:
 is a CSV list of : values

For example:
$ ovs-vsctl set interface dpdk-p0 options:n_rxq=4 other_config:pmd-rxq-affinity="0:3,1:7,3:8"

Adding an OVS port to a KVM guest:

# create a directory for vhost-user sockets
mkdir -p /var/run/vhostuserclient

# add a vhost-user-client port
ovs-vsctl add-port br0 vhost-user-1 -- set Interface vhost-user-1 type=dpdkvhostuserclient "options:vhost-server-path=/var/run/vhostuserclient/vhost-user-client-1"

# vm setup
- Ensure the VM instance is powered off.
- Change the machine type to `q35`.
- Enable NUMA on guest CPU.
- Edit `/etc/pve/qemu-server/.conf`, add the following lines to add the port to guest with mac address `00:00:00:00:00:01` and enable hugepages and (optional) vIOMMU on the guest:
```
args: -machine q35+pve0,kernel_irqchip=split -device intel-iommu,intremap=on,caching-mode=on -chardev socket,id=char1,path=/var/run/vhostuserclient/vhost-user-client-1,server=on -netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce=on -device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1
hugepages: 1024
```

Рубрики
ovs / openvswitch / dpdk

ovs / openvswitch / виртуальный интерфейс / virtual interface / debian

Пример:

1. Добавляем интерфейс vitest
!!! будет ошибка что не существует интерфейс с именем vitest, но он будет создан
!!! ovs-vsctl show будет ошибка (error: "could not open network device vitest (No such device)") 

ovs-vsctl add-port ovsbr0 vitest 

2. Теперь делаем его внутренним
ovs-vsctl set interface vitest type=internal

3. Теперь мы можем работать с ним как с обычным интерфейсом
!!! По поводу vlan их надо задавать в ovs
ip address add 192.168.101.12/24 dev vitest - добавить адрес 192.168.101.12 с сетевой маской 24 на устройство vitest                                         
ip address del 192.168.1.5/24 dev vitest - удалить ip-адрес 192.168.1.5/24 с интерфейса eth0 vitest 
ip link set mtu 9000 dev vitest - установим MTU устройства vitest на 9000
ip link set dev vitest  mtu 1400 - установить MTU равным 1400 на интерфейсе vitest
ip link add link vitest name vitest.500 type vlan id 500 - добавить vlan 500 интерфейс vitest.500 к родительскому vitest

4. задаем vlans
ovs-vsctl set port vitest tag=566 
ovs-vsctl set port  tag=4082 trunks=4082,566 vlan_mode=native-untagged

5. Очистить tag, vlans, vlan_mode
ovs-vsctl clear port vitest trunks
ovs-vsctl clear port vitest tag
ovs-vsctl clear port vitest vlan_mode

6. удалить порт 
ovs-vsctl del-port vitest

7. Дополнительные команды:
ip a  - показать все интерфейсы
ovs-vsctl show - показать порты в ovs
man ovs-vsctl - помощь по ovs-vsctl

Одной командой создать ВИ vitest c tag555:

ovs-vsctl add-port ovsbr0 vitest tag=555 -- set interface vitest type=internal

Настройка авто конфигурирования ip на интерфейсе vitest:

1. Редактируем файл interfaces
vim /etc/network/interfaces
---------------------------
auto vitest
iface vitest inet static
      address 10.168.177.200
      netmask 255.255.255.192
---------------------------

2. ifup vitest  - проверяем и запасаем интерфейс vitest

Пример настойки интерфейса ВМ



  
  
    
  
  
      
   
  


Рубрики
KVM ovs / openvswitch / dpdk

KVM OVS / установка KVM / настройка сети openvswitch / debian

Установка KVM

cat /proc/cpuinfo | grep -E '(vmx|svm)' -m 1 - проверить что процессор поддерживает Виртуализацию
 
apt install qemu-kvm libvirt-daemon-system ovmf  virtinst - установка на debian
apt install qemu-kvm libvirt-bin ovmf  virtinst - установка на ubuntu (до 20)
yum -y install kvm libvirt qemu-kvm virtinst - установка на CentOS
 
apt install virt-manager - установка virt-manager
 
qemu-kvm - гипервизор
libvirt-bin - по для управления гипервизором(virsh)
virt-manager - графическая утилита для управления гипервизором (не обязательная программа, для установки требуется x-windows)
ovmf - по для поддержки загрузки uefi для гостей
virtinst - программа для создания виртуальных машин в консоли 
 
ip -a - посмотреть адаптеры
iptables -vnL - показать правила firewall
sudo iptables -nvL  - показать правила firewall
 
virt-host-validate - проверка установленных компонентов

libvirtd - основной демон управления виртуализацией
systemctl status libvirtd - проверяем состояние демона
systemctl start libvirtd - запускаем демон
systemctl enable libvirtd - добавляем в автозагрузку

Установка OVS и настройка OVS

apt install openvswitch-switch - устанавливаем ovs

ovs-vsctl show - смотрим что у нас с сетью
ovs-vsctl add-br ovsbr0 - создаем свитч с именем ovsbr0
ovs-vsctl add-port ovsbr0 eno1 - добавляем в свитч с именем ovsbr0 интерфейс eno0
ovs-vsctl show - проверяем настройки


Настройка интерфейса хоста static:

nano /etc/network/interfaces
----------------------------------------
auto lo
iface lo inet loopback

auto eno1
iface eno1 inet manual
dns-nameservers 192.168.15.1
dns-nameservers 8.8.8.8

auto ovsbr0
iface br0 inet static
address 192.168.15.253/24
gateway 192.168.15.1

-------------------------------------

Настройка сети dhcp:

nano /etc/network/interfaces
----------------------------------------
auto lo
iface lo inet loopback

auto eno1
iface eno1 inet manual
dns-nameservers 192.168.15.1
dns-nameservers 8.8.8.8

auto ovsbr0
iface ovsbr0 inet dhcp
-------------------------------------

Применить настройки сети без перезагрузки:

/etc/init.d/networking restart - перезагрузка сети (пере читается конфигурация сети) 
systemctl stop NetworkManager.service - остановить сеть
systemctl start NetworkManager.service - запустить (пере читается конфигурация сети) 
systemctl restart networking - перезагрузка сети (пере читается конфигурация сети) 

Настройка сети KVM и OVS

!!! можно просто отредактировать сеть по умолчанию default
!!! virsh net-edit default

0. Выполняем выгрузку сети по умолчанию
virsh net-list --all - показать все сети 
virsh net-dumpxml default > /root/1.xml - этой командой мы можем сохранить настройки сети default

1. Редактируем файл 1.xml  
1.1 пример простой сети (ovs) для добавления в KVM 
-------------

  ovsbr0
  
  
  

-------------
 
1.2 пример сложной сети с vlan (ovs) для добавления в KVM 
-------------------

  ovs-network
  
  
  
  
    
      
    
  
  
    
      
    
  
  
    
      
    
  
  
    
      
    
  
  
    
      
      
    
  

-------------------
 
 
2. Добавляем сеть ovsbr0 из файла 1.xml
virsh net-define --file /root/1.xml - этой командой мы можем создать сеть из файла (/root/1.xml)
virsh net-start --network ovsbr0 - запуск сети 
virsh net-autostart --network ovsbr0 - включение автозапуска для сети 

Пример настройки интерфейса ВМ

0. virsh list --all - показать доступные ВМ
1. virsh edit VM_name - редактируем файл настроек VM_name
----------------
  
      
      
      
      
----------------

Редактирование сети default на живую:

Добавление нового vlan:

virsh net-update default add portgroup "
     
         
     
" --live --config


irsh net-update default add portgroup "
     
         
         
     
" --live --config


Изменение существующего vlan:

virsh net-update default modify portgroup  "
    
      
    
  " --live --config


Рубрики
ovs / openvswitch / dpdk

openvswitch / ovs / bond0

Пример 1:

0. Создали бридж с именем ovsbr1:
ovs-vsctl add-br ovsbr1 

1. Синтаксис bond:
ovs-vsctl add-bond   

2. Создали bond0 в свитче ovsbr1 из интересов eth1,eth3
ovs-vsctl add-bond ovsbr1 bond0 eth1 eth3

2. Включили lacp на интерфейсе bond0
ovs-vsctl set port bond0 lacp=active

# вариант на backup-active
ovs-vsctl add-bond ovsbr0 bond0 enp2s0 wlan0 bond_mode=active-backup

Пример 2:

ovs-vsctl add-bond ovsbr1 bond0 eth1 eth3 lacp=active

Дополнительные команды:

ovs-appctl bond/show  - показать информацию о bond

ovs-appctl lacp/show  - показать информацию о lacp

ovs-vsctl list port bond0 - показать порты в bond

ovs-vsctl set port ovsbr0 tag=29 - установить vlan с tag 29


ovs-vsctl del-port br0 bond0 -- add-bond br0 bond0 a b c d - удалить bond0 из br0 и создать bond0 из интерфейсов a,b,c,d


Ссылки:

https://blog.scottlowe.org/2012/10/19/link-aggregation-and-lacp-with-open-vswitch/
https://mail.openvswitch.org/pipermail/ovs-discuss/2017-October/045455.html
https://wiki.archlinux.org/title/systemd-networkd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)
Рубрики
KVM ovs / openvswitch / dpdk

ovs \ libvirt \ virsh \ lxc \ openvswitch \ openflow \ контейнеры

ссылки:

http://www.openvswitch.org/
https://docs.openvswitch.org/en/latest/howto/libvirt/
https://libvirt.org/drvlxc.html
https://libvirt.org/drvqemu.html
https://www.linux-kvm.org/page/Main_Page
https://xakep.ru/2017/09/04/open-vswitch/
https://habr.com/ru/post/242741/
https://xakep.ru/2012/11/19/59656/
https://docs.openvswitch.org/en/latest/howto/libvirt/
https://russianblogs.com/article/5481757540/

Установка необходимых пакетов:

# ставим на Debian 10

apt install openvswitch-switch - ставим openvswitch (ovs)
apt install qemu-kvm libvirt-clients libvirt-daemon-system - устанавливаем libvirt

openvswitch:

обычное использование без vlan:
ovs-vsctl show - показывает информацию по свитчу, проверяем работу и заодно узнаем какая у нас версия ovs
ovs-vsctl add-br br0 - добавляем свитч с именем br0
ovs-vsctl add-port br0 eth0 - добавляем интерфейс eth0 в свитч br0 

пример с vlan:
ovs-vsctl add-br ovs0 - добавляем свитч openvswitch с именем br0
ovs-vsctl add-port ovs0 eth0 - добавляем интерфейс eth0 в свитч ovs0 
ovs-vsctl set port eth0 vlan_mode=native-untagged tag=2 trunks=2,3,4 - вешаем trunk на интерфейс eth0 
ovs-vsctl add-port ovs0 ovs0-vlan2 tag=2 -- set Interface ovs0-vlan2 type=internal - добавляем порт и вешаем access (tag=2) на интерфейс ovs0-vlan2
ovs-vsctl add-port ovs0 ovs0-vlan4 tag=4 -- set Interface ovs0-vlan4 type=internal - добавляем порт и вешаем access (tag=4) на интерфейс ovs0-vlan2
ovs-vsctl add-port ovs0 ovs0-vlan3 tag=3 -- set Interface ovs0-vlan3 type=internal - добавляем порт и вешаем access (tag=3) на интерфейс ovs0-vlan2

ovs-vsctl set port ovsbr0 tag=29

удаление портов и коммутатора:
ovs-vsctl del-port ovs0-vlan2 - удалить порт (ovs0-vlan2) из коммутатора
ovs-vsctl del-br ovs0 - удалить коммутатор ovs0

Примеры настройки сети:

dhcp client:
dhclient ovs0-vlan3 - получить настройки по dhcp для интерфейса ovs0-vlan3

static ifconfig:
ifconfig ovs0-vlan2 inet 10.254.254.1/24 up - настраиваем ip 10.254.254.1/24 и запускаем интерфейс
ifconfig ovs0-vlan4 up - просто запускаем интерфейс без настройки ip


static ip:
ip a - показать доступные устройства
ip address add  192.168.66.10/24 dev eth0 - задаем адрес ipv4
ip link set up eth0 - запускаем интерфейс

Собственно пытаемся работать:

virsh --c lxc:// - подключаемся к консоли управления lxc контейнерами
create /root/lxc0.xml - создаем контейнер из шаблона lxc0.xml
create /root/lxc1.xml - создаем контейнер из шаблона lxc1.xml
list - показать доступные контейнеры
console lxc0 - подключаемся к контейнеру lxc0 (CTRL+] - отключится контейнера)

ip a - показать доступные устройства
ip address add  192.168.66.10/24 dev eth0 - задаем адрес ipv4
ip link set up eth0 - запускаем интерфейс


ip a - показать доступные устройства
ip address add  192.168.66.11/24 dev eth0 - задаем адрес ipv4
ip link set up eth0 - запускаем интерфейс




Шаблон для контейнера(lxc0.xml)


    lxc0
    131072
    
        exe
        /sbin/init
    
    1
    
    
        
            
            
            
        
        
    

Шаблон для контейнера(lxc1.xml)


    lxc1
    131072
    
        exe
        /sbin/init
    
    1
    
    
        
            
            
            
        
        
    



OpenFlow


По умолчанию openvswitch работает как обычный свитч (нету vlan)
ovs-vsctl set-fail-mode br0 secure - включаем режим работы умного свитча (Задействуем протокол OpenFlow)

Гоняем трафик между двумя портами
ovs-ofctl add-flow br0 in_port=1,action=output=2
ovs-ofctl add-flow br0 in_port=2,action=output=1
ovs-ofctl dump-flows br0 - проверяем что мы там настроили 

ovs-vsctl set-fail-mode br0 standalone - вернуть настройки в обычный режим (br0 снова будет как обычный свитч)



# еще 
ovs-ofctl -O OpenFlow13 dump-flows ovsbr0
ovs-ofctl -O OpenFlow13 dump-ports ovsbr0