Виртуален комутатор - (OVS) Open vSwitch
Последна редакция: 23.06.2017 г.

                1. Въведение
  Ограниченията на съществуващите виртуални комутатори дават възможност Open vSwitch бързо да печели популярност.
- OpenvSwitch - openvswitch.org възниква от проекта Ethan – SIGCOMM 2007, като целта е създаване на опростен switch с управление от централен контролер. Open vSwitch е многослоен, мултиплатформен софтуерен виртуален комутатор с отворен код, който се разпространява под лиценза на Apache 2.0. [2]. Създаден е от Nicira, която по-късно е придобита от Vmware. Pаботи като софтуерен суич под Linux, FreeBSD, NetBSD, Windows операционни системи. Проектиран е да поддържа разпределението в няколко физически сървъра. Създаването на първия Open vSwitch (OVS) започва през 2009 г. Успешно функционира с повечето хипервайзорни и контейнерни платформи като Xen, KVM, VirtualBox и Docker.
Използва се от платформено независими виртуални среди и осигурява мрежова свързаност както между виртуалните машини на един хост, така и между отдалечени виртуални машини. По-голямата част от кода е написан на платформено-независим C и лесно да бъдат адаптиран към други среди [1].

SDN

Фигура. 1 Представяне на Open vSwitch


     2. Архитектура на Open vSwitch (OVS)
Архитектурата на Open vSwitch (OVS) се състои от три основни компонента:
        - база данни;
        - програмен комутатор;
        - модул на ядрото.

SDN

Фигура 2. Компонентите и интерфейсовете на Open vSwitch [3]

       2.1. База данни
  На всеки физически възел съвместно с хипервайзора се разполага комутатор със собствена база данни. Оvsdb-server е малка по обем база данни, в която се съхраняват конфигурационни настройки на комутатора като например поредица от правила, информация за интерфейсове, мостове и портове и др.
Ovsdb-server попълва своята база данни, като използва протокола за управление на Open vSwitch Database (OVSDB ) RFC 7047 във формат JSON. Номерът на подразбиращия се порт е 6640 [4]. Използва се и за възстановяване на системата при рестарт.
Инструментите за конфигуриране се съдържат в: ovsdb-tool.
Командата ovs-vsctl дава възможност за директни промени в БД. Използва се за създаване на мостове, добавяне и конфигуриране на интерфейсове и др.
Видът, в който се съхраняват данните в OVSDB, може да се провери така:
# mininet> sh ovs-ofctl dump-flows s1 // Ако s1 e OVSSwitch суич.
Потребителят може да провери статуса на ovsdb-server-а, като използва командата от Linux shell [5]:
# ps aux|grep ovs
       2.2. Програмен комутатор
  Един от основните компоненти е ovs-vswitchd демонът, който реализира Open vSwitch комутатора и контролира всички комутатори в системата. Осъществява връзка с ovsdb-server сървъра посредством протокола за управление OVSDB.
Комуникира с модулите от ядрото, като изплзва netlink протокол [6]. Взаимодейства в системата, като използва абстрактния интерфейс netdev, за да може да бъде съвместим с традиционните мрежи, а също така и за пренасяне на други платформи.
OVS-vswitchd поддържа множество независими канали за данни (data paths), известни като мостове.
За управление на ovs-vswtichd демона се използват командите ovs-appctl и ovs-ofctl :
    ovs-appctl – изпраща команди за стартиране на Open vSwitch daemons (ovs-vswitchd);
    ovs-ofctl – е инструмент за контролиране и изпращане на заявки към OpenFlow контролерите.
Може да се използва за извършване на определени действия върху потоците на ovs-vswitchd.
       2.3. Модул на ядрото
  Модулът на ядрото е проектиран за бърза обработка на пакетите. Основната му дейност е свързана с изпълнение на инструкциите за пренасочване на пакетите по съответните портове или тунели. Ако пакетът не съвпада, се изпраща за обработка в потребителското пространство (ovs-vswitchd). Тук се реализира така нареченият път на данните (datapath) - съвкупност от виртуални и физически портове, реализирани в ядрото. Директни промени в datapath могат да се осъществят с командата ovs-dpctl.
Новите версии на datapath съдържат два слоя кеширане: кеш microflow и вторичен слой, наречен megaflow кеш.
Кеш microflow е бърз кеш, който трябва да съдържа точно съвпадение. Всеки кеш запис посочва всяко поле на хедъра на пакета и необходимото съвпадение на пакети с точно тези заглавни части. Този модел работи добре в повечето случаи. Подходът може сериозно да намали ефективността си, когато се сблъска с голям брой краткотрайни връзки или някои нестандартни случаи, като например при сканиране на портове и peer-to-peer заявки към сървъри. В тези случаи много от пакетите ще трябва да преминат по бавния път “slow-path”, т.е. през областта на ovs-vswitchd, с което скоростта на обработка значително намалява.
  Съществено значение оказва и времето, необходимо на ядрото да съобщи за пропуск или съвпадение на потребителската област. Open vSwitch се справя с този проблем, като групира настройките на потоците, които пристигат заедно. По този начин се подобрява ефективността с около 24% [3].
При megaflows вместо просто кеш съвпадение кешът на ядрото вече поддържа произволно побитовото wildcarding съвпадение. По този начин се използват само тези полета, които действително оказват влияние на пренасочването. Megaflow е единична таблица, която поддържа родово съвпадение. Предимствата й са, че тя не разполага с приоритети, което ускорява класификацирането на пакетите. Търсенето се прекратява след установяване на първото съвпадение, не се търсят съвпадения с по-висок приоритет.
Open vSwitch дава възможност за запазване на microflow като кеш от първо ниво. Пакетите, които не съвпадат точно, се прехвърлят към кеша на megaflow, за да се проверят за съвпадение и в него. Пакетите, които нямат съвпадение и в кеша на megaflow, се връщат отново в конвейера, където SDN контролерът решава как да бъдат обработени.
Въвеждането на megaflows-ите представлява подобрение, което значително намалява броя на пакетите, преминаващи през “slow-path“.
       3. Заключение
Open vSwitch е софтуер с отворен код, който успешно се конкурира с комерсиалните продукти. Своевременно се обновява и оптимизира в съответствие с увеличаващите се натоварвания в компютърните мрежи.
Използва се във виртуална среда за свързване на виртуални машини, независимо от хипервайзора, който използва. Open vSwitch e успешно интегриран в облачните среди като OpenStack, openQRM, OpenNebula и др. Поведението на виртуалните комутатори е изключително важна част от съвременните мрежи при определяне на общата производителност на мрежата.
Целта е да се стимулира приемането на общ слой за виртуализация на мрежата, в който да се използват различни видове виртуални платформи. Виртуализацията на мрежата позволява ефективното използване на мрежовите ресурси и гъвкаво управление на трафика. Дава възможност за изолиран трафик на потребители и приложения в рамките на една физическа мрежа. Администраторите ще могат да прилагат свои собствени политики за маршрутизация и ще използват максимално физическата мрежова инфраструктура.


Инсталиране на Open vSwitch в CentOS 7 (x86_64)
По същият начин работи и на виртуална машина КVМ

За инсталиране има хубава статия:
Open vSwitch installation on CentOS 7.2 от 05. 2016 г. англ. език. Дата*: 28.01.2017 г.

За мен конктетно понеже съм root потребител първоначално (преди т.1) преминавам в dir: home:
# cd ..
# cd home
     в т. 3. Build the RPM
#rpmbuild -bb --nocheck ~/openvswitch-2.5.1/rhel/openvswitch_no_kmod.spec
за себе си премахвам: " ~/ " и пиша:
# rpmbuild -bb --nocheck openvswitch-2.5.1/rhel/openvswitch_no_kmod.spec

Стартиране на Open vSwitch:
# sudo /etc/init.d/openvswitch start
Може да се стартира и по този начин:
# systemctl start openvswitch.service
Проверка дали работи:
# sudo ovs-vsctl show
# ovs-vsctl -V
# sudo /etc/init.d/openvswitch stop


Инсталиране на Open vSwitch 2.5.1 в Ubuntu 16.04 (x86_64)
По същият начин работи и на виртуална машина КVМ

# sudo apt-get install build-essential libssl-dev linux-headers-$(uname -r)
# wget http://openvswitch.org/releases/openvswitch-2.5.1.tar.gz
# tar zxvf openvswitch-2.5.1.tar.gz
# cd openvswitch-2.5.1
# ./configure --with-linux=/lib/modules/`uname -r`/build
# ./configure
# make
# sudo make install
# sudo mkdir -p /usr/local/etc/openvswitch
# sudo ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema
# sudo ovsdb-server -v --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach --log-file
# ovs-vsctl --no-wait init
# ovs-vswitchd --pidfile --detach
# /etc/init.d/openvswitch-switch start
Би трябвало да Ви изведе на екрана:
     * ovsdb-server is already running
     * ovs-vswitchd is already running
     * Enabling remote OVSDB managers
В зависимост от това, какво е инсталирано на системата, дали е ново инсталирана система и не се извеждат тези надписи инсталирайте допълнително:
# sudo apt-get install -qy openvswitch-switch openvswitch-common
      Стартиране:
1.Сървъра за базата данни:
# sudo ovsdb-server -v --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach --log-file
2. Инициализиране на OVS:
# ovs-vsctl --no-wait init
# ovs-vswitchd --pidfile --detach
3. Стартиране на OpenvSwitch:
# /etc/init.d/openvswitch-switch start

      Можем да го копираме наведнъж:
sudo ovsdb-server -v --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach --log-file
ovs-vsctl --no-wait init
ovs-vswitchd --pidfile --detach
/etc/init.d/openvswitch-switch start
Тестваме на мрежовия емулатор: Mininet

      Първоначално инициализираме mininet:
sudo mn -c
Примерна топология (възможно най-опростената) 1:
sudo mn
mininet> dump
dump - показва информация за съществуващите връзки;
net - показва информация за връзките в мрежата;
Примерна топология 2:
sudo mn --arp --topo single,3 --mac --switch ovsk
mininet> h1 ping h2
Ако нямате: h1 ping h2, добавете обикновен L2 поток :
sh ovs-ofctl add-flow s1 action=normal
mininet> h1 ping h2
mininet> dump
Инсталиране на Floodlight контролер

# git clone git://github.com/floodlight/floodlight.git
# cd floodlight
# ant
# ./floodlight.sh
Примерна топология (3), ако имаме инсталиран Floodlight контролер.
Ако сте root потребител влизате в терминалния прозорец:
# cd ..
Влизаме в директорията в която е инсталиран:
# cd floodlight
Стартираме контролера:
# java -jar ./target/floodlight.jar

Отваряме втори терминален прозорец и пишем:
# sudo mn --arp --topo single,3 --mac --switch ovsk --controller=remote,ip=127.0.0.1,port=6653
mininet> nodes
mininet> pingall
mininet> exit


Други команди:
Ako нямаме инсталиран контролер, стартиране/ спиране на тест-контролера на OVS:
# /etc/init.d/openvswitch-testcontroller start
# /etc/init.d/openvswitch-testcontroller stop
или
под Ubuntu 17.10 (x86_64) може да се стартира по този начин:
# cd /etc/init.d
# ovs-testcontroller ptcp:
В нов терминален прозорец можем да проверим, какви приложения са стартирани в момента:
# ps -ea | grep ovs
Проверка на инсталираната версия:
# ovs-vsctl -V


Инсталиране на Open vSwitch 2.12.0 в Ubuntu 19.10(x86_64)

1. Upgrade linux kernel version 5.3.18 or upper.
sudo apt-get install build-essential libssl-dev linux-headers-$(uname -r)
wget http://openvswitch.org/releases/openvswitch-2.12.0.tar.gz
tar zxvf openvswitch-2.12.0.tar.gz
cd openvswitch-2.12.0
./configure --with-linux=/lib/modules/`uname -r`/build
./configure
make
sudo make install
sudo mkdir -p /usr/local/etc/openvswitch
sudo ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema
sudo ovsdb-server -v --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach --log-file
ovs-vsctl --no-wait init
ovs-vswitchd --pidfile --detach
/etc/init.d/openvpn start
Би трябвало да Ви изведе на екрана:
     [ ok ] Starting openvpn (via systemctl): openvpn.service.
      Стартиране:
1.Сървъра за базата данни:
sudo ovsdb-server -v --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach --log-file
2. Инициализиране на OVS:
ovs-vsctl --no-wait init
ovs-vswitchd --pidfile --detach
3. Стартиране на OpenvSwitch:
/etc/init.d/openvpn start

      Можем да го копираме наведнъж:
sudo ovsdb-server -v --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach --log-file
ovs-vsctl --no-wait init
ovs-vswitchd --pidfile --detach
/etc/init.d/openvpn start


. . . . . . . ........



Сайтове развиващи Open vSwitch (OVS)
           Пояснение: Дата*: - Сайтът е бил достъпен към тази дата.

- [1] What is Open vSwitch англ. език. Дата*: 25.01.2017 г.

- Open vSwitch Advanced Features ! англ. език.

- The Design and Implementation of Open vSwitch Ben Pfaff, Justin Pettit, Teemu Koponen, Ethan J. Jackson ... англ. език. Дата*: 23.06.2017 г.

- Open vSwitch Release 2.7.90 от Jun 16, 2017 г. англ. език. Дата*: 23.06.2017 г.

- Underneath OpenStack Quantum: Software Defined Networking with Open vSwitch от 04.2013 г. англ. език. Дата*: 25.01.2017 г.

- KVM and OpenVSwitch on Centos 6.3 Minimal от 19.09 2012 г. англ. език. Дата*: 25.01.2017 г.

- supercomputing.caltech.edu/blog/index.php/welcome от 05. 2016 г. англ. език. Дата*: 25.01.2017 г.

- Mininet and Open vSwitch on CentOS 7 от 09 2014 г. англ. език. Дата*: 25.01.2017 г.

- How to install and configure OVS virtual switch on CentOS 7 or RED HAT 7 host with KVM от 14.09. 2016 г. англ. език. Дата*: 25.01.2017 г.

- Create a Learning Switch от 16.11. 2016 г. англ. език. Дата*: 25.01.2017 г.

- Open vSwitch. Цикл статей Switch от 12. 2013 г. руски език. Дата*: 25.01.2017 г.

- ONF Technical Library — библиотека със статии англ. език. Дата*: 25.01.2017 г.

- Control a Slice of a real Network от 05. 2014 г. англ. език. Дата*: 25.01.2017 г.




Благодаря за вниманието Ви !