Установка сервера 1С предприятия на CenOS 5.5

published: July 8, 2019, 5:44 p.m.

  Создание сервер 1C предприятия на базе CentOS, имеет некоторые нюансы. Не учтенные они могут в последствии вызвать некоторые проблемы. Изначально я устанавливал те пакеты которые предлагают сами 1c, но в процессе использования понял, что данные пакеты собраны очень криво и не будут работать адекватно. Поэтому последние версии я собирал сам, но и тут скрывалось пару подводных камней. Например сборка по x86_64 вызвала непонятные сбои в базе данных на поиск причины которых я потратил не мало времени. Поэтому я использовал 32-битную CentOS.

  Итак скачиваем дистрибутив и устанавливаем его на наш сервер. После установки следует скачать SRPM Postgresql с сайта 1С отсюда, берем версию 8.3.8 как самую стабильную сборку 1С на данный момент. Так же нам понадобится библиотека icu, скачать можно с официального сайта. Нам нужна версия 3.4 находится она здесь, скачайте сжатый архив исходников для LInux:

 #wget ftp://ftp.software.ibm.com/software/globalization/icu/3.4.1/icu-3.4.1.tgz

  На свежеустановленной системе инсталлируем все что нужно для сборки пакетов для системы:

#yum install rpm-build glibc-devel bison flex python-devel tcl-devel readline-devel zlib-devel pam-devel gcc doxygen gcc-c++

  В самом начале создаем непривилигерованного пользователя от имени которого мы будем производить сборку пакетов.

#useradd  builduser

#passwd builduser

Теперь создадим дерево каталогов для сборки пакетов, в Fedora это делается одной командой, здесь придется выполнить две :)

#mkdir -p ~/rpmbuild/{BUILD,RPMS,S{OURCE,PEC,RPM}S}

#echo "%_topdir $HOME/rpmbuild" > ~/.rpmmacros

  Ну вот все приготовительные действия закончены, начнем сборку пакетов. Во первых соберем libicu который требуется для 1c предприятия, для этого помещаем скачанный архив icu-3.4.1.tgz в каталог сборочного дерева для исходных кодов:

#cp icu-3.4.1.tgz ~/rpmbuild/SOURCES/

  Нам понадобится spec файл для сборки пакета, я брал его из более поздней версии исходных кодов, привожу его здесь полностью:

Name:            icu

Version:        3.4.1

Release:        3.1

Summary:        International Components for Unicode

 

Group:          Applications/Text

License:        X License

URL:            http://www.ibm.com/software/globalization/icu/

Source0:        ftp://ftp.software.ibm.com/software/globalization/icu/%{version}/%{name}-%{version}.tgz

BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

 

BuildRequires:  doxygen

 

%description

The International Components for Unicode (ICU) libraries provide

robust and full-featured Unicode services on a wide variety of

platforms.

 

%package     -n lib%{name}

Summary:        International Components for Unicode - libraries

Group:          System Environment/Libraries

 

%description -n lib%{name}

%{summary}.

 

%package     -n lib%{name}-devel

Summary:        Development files for International Components for Unicode

Group:          Development/Libraries

Requires:       lib%{name} = %{version}-%{release}

 

%description -n lib%{name}-devel

%{summary}.

 

%package     -n lib%{name}-doc

Summary:        Documentation for International Components for Unicode

Group:          Documentation

 

%description -n lib%{name}-doc

%{summary}.

 

 

%prep

%setup -q -n %{name}

 

%build

cd source

export CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing"

%configure --enable-static --with-data-packaging=library --disable-samples

make # %{?_smp_mflags} # -j(X>1) may "break" man pages as of 3.2, b.f.u #2357

make doc

 

 

%install

rm -rf $RPM_BUILD_ROOT source/__docs

make -C source install DESTDIR=$RPM_BUILD_ROOT

make -C source install-doc docdir=__docs

chmod +x $RPM_BUILD_ROOT%{_libdir}/*.so.*

 

 

%check || :

make -C source check

 

 

%clean

rm -rf $RPM_BUILD_ROOT

 

 

%post -n lib%{name} -p /sbin/ldconfig

 

%postun -n lib%{name} -p /sbin/ldconfig

 

 

%files

%defattr(-,root,root,-)

%doc license.html readme.html

%{_bindir}/derb

%{_bindir}/genbrk

%{_bindir}/gencnval

%{_bindir}/genrb

%{_bindir}/makeconv

%{_bindir}/pkgdata

%{_bindir}/uconv

%{_sbindir}/*

%{_mandir}/man1/derb.1*

%{_mandir}/man1/gencnval.1*

%{_mandir}/man1/genrb.1*

%{_mandir}/man1/makeconv.1*

%{_mandir}/man1/pkgdata.1*

%{_mandir}/man1/uconv.1*

%{_mandir}/man8/*.8*

 

%files -n lib%{name}

%defattr(-,root,root,-)

%{_libdir}/*.so.*

 

%files -n lib%{name}-devel

%defattr(-,root,root,-)

%{_bindir}/%{name}-config

%{_mandir}/man1/%{name}-config.1*

%{_includedir}/layout

%{_includedir}/unicode

%{_libdir}/*.a

%{_libdir}/*.so

%{_libdir}/%{name}

%dir %{_datadir}/%{name}

%dir %{_datadir}/%{name}/%{version}

%{_datadir}/%{name}/%{version}/mkinstalldirs

%{_datadir}/%{name}/%{version}/config

%doc %{_datadir}/%{name}/%{version}/license.html

 

%files -n lib%{name}-doc

%defattr(-,root,root,-)

%doc source/__docs/%{name}/html/*

 

 В SPEC для icu я исправил под более старую версию пакета некоторые параметры.

 Итак создаем данный spec файл в каталоге ~/rpmbuild/SPECS/:

#vi ~/rpmbuild/SPECS/icu.spec

 И проводим сборку пакета от непривилегированного пользователя builduser:

#rpm -bb  ~/rpmbuild/SPECS/icu.spec

 Если все хорошо, устанавливаем собранные пакеты, командой от root:

#rpm -ihv /home/builduser/rpmbuild/RPMS/i386/libicu-devel-3.4.1-3.1.i386.rpm  /home/builduser/rpmbuild/RPMS/i386/libicu-3.4.1-3.1.i386.rpm

 Теперь от пользователя builduser скачиваем postgresql:

#wget http://v8.1c.ru/overview/postgresql_patches/8-3-8/postgresql-8.3.8-1.1C.src.rpm

 Устанавливаем его в дерево каталогов, запустив от пользователя builduser команду:

#rpm -ihv postgresql-8.3.8-1.1C.src.rpm

 Немного исправим spec файл для postgresql от 1С, который после установки SRPM должен находится в каталоге SPECS, , в нем следует найти такие строки:

cp %{local_libdir}/libicuuc.so.34 %{buildroot}/%{_libdir}/pgsql

cp %{local_libdir}/libicui18n.so.34 %{buildroot}/%{_libdir}/pgsql

cp %{local_libdir}/libicudata.so.34 %{buildroot}/%{_libdir}/pgsql

 И исправить их на такие:

cp %{_libdir}/libicuuc.so.34 %{buildroot}/%{_libdir}/pgsql

cp %{_libdir}/libicui18n.so.34 %{buildroot}/%{_libdir}/pgsql

cp %{_libdir}/libicudata.so.34 %{buildroot}/%{_libdir}/pgsql

 Возможно вы захотите что бы postgres использовал библиотеку libicu от самих 1C, тогда вам придется установить сначала сам сервер 1C, о чем я написал ниже, и в SPEC файле указать пути до библитек из сборки 1С:

 

cp /opt/1C/v8.1/i386/libicuuc.so.34 %{buildroot}/%{_libdir}/pgsql

cp /opt/1C/v8.1/i386/libicui18n.so.34 %{buildroot}/%{_libdir}/pgsql

cp /opt/1C/v8.1/i386/libicudata.so.34 %{buildroot}/%{_libdir}/pgsql

 

 И запускаем сборку:

#rpmbuild -bb ~/rpmbuild/SPECS/postgresql-8.3.1C.spec

 Если сборка завершилась удачно, в сборочном дереве, в каталоге RPMS мы получим наши rpm файлы для установки. Устанавливать их следует командой:

#rpm -ihv /home/builduser/rpmbuild/RPMS/i386/postgresql-*

 После установки нужно изменить файл профиля для пользователя postgres который создается при установке postgresq, точнее следует указать какую локаль следует использовать серверу Postgresq, для этого открываем файл /var/lib/pgsql/.bash_profile и добавляем следующие строчки:

 

LANG=ru_RU.UTF-8

export LANG

 Кстати там я заметил переменную PGDATA которая казалось бы должна определять где будет лежать база данных, но она не работает. Такая же переменная существует в скрипте запуска сервера, думаю что если поменять ее значение в обоих местах то можно добиться что бы база лежала в нужном месте, я не стал заморачиватся так как все равно делаю бекапы на другой компьютер в сети. Итак после того как переменная будет записана делаем инициализацию базы данных:

#service postgres initdb

 Теперь поправим конфигурационный файл что бы можно было заходить локально без пароля, что бы этот самый пароль установить. Открываем файл /var/lib/pgsql/data/pg_hba.conf и изменяем там строчку:

host    all         all         127.0.0.1/32          md5

на:

host    all         all         127.0.0.1/32          trust

теперь можно запустить сервер:

#service postgres start

и войти в систему под пользователем postgres:

 

#psql -h 127.0.0.1 -U postgres

И поменять пароль доступа для пользователя postgres:

 

>ALTER USER postgres PASSWORD 'password';

 Теперь вновь открываем конфиг /var/lib/pgsql/data/pg_hba.conf и меняем там в строчке:

host    all         all         127.0.0.1/32          trust

 Слово trust на md5.

 Сделаем перезагрузку сервера:

 #service postgres reload

 Теперь с postgresql законченно. Следующий шаг установка самого сервера 1C. Скачайте ваш дистрибутив с сайта 1C, напрмиер в домашнюю директорию и установите его командой:

#rpm -ihv ~/1C_Enterprise-*

 Следует скачать драйвера от аппаратного ключа и сервер лицензия для него же, взять их можно отсюда: aksusdb и hasplm.

 Скачиваем и распаковываем их. Втыкаем ключи. Файлы hasplm-redhat-8.30-1.i386.rpm и aksusbd-redhat-1.8.1-3.i386.rpm копируем на сервер и ставим командой:

#rpm -ihv hasplm-redhat-8.30-1.i386.rpm aksusbd-redhat-1.8.1-3.i386.rpm

 Все защита установлена, теперь запускаем сервер предприятий:

#service srv1cv81 start

Если все стартовало нормально, ставим клиент. Я ставил клиента с SMB ресурса с опцией /adm что позволяет обновить все клиенты в сети. Но это не обязательно. Кстати клиент для 1C неплохо работает под wine. Теперь с помощью консоли управления сервером создаем базу данных, как приведено ниже на скриншотах, тока не забудьте поставить данные актуальные для вас ;) :

 

 

 

 

 

Все прошло хорошо? Тогда запускаем клиент указываем существующую базу данных our_base на сервере 1с_server и загружаем свой конфигурацию! На этом пока все.

Понимая top

published: June 18, 2019, 5:33 p.m.

Утилита отслеживания состояния процессов и системы в целом, если в системе есть проблемы, эта утилита первой покажет где они могут быть.

1) Первая строка

top - 13:23:48 up 7 days,  1:47, 23 users,  load average: 0.64, 0.55, 0.56

В первой строке указано текущее время, время аптайма системы, количество пользователей которые активны в системе, и средняя загрузка
Средняя загрузка важный параметр указывающий на производительность системы, рассчитывается как среднее количество процессов находящихся в активном состоянии или в состоянии ожидания. Рассчитывается за 1 минуту, за 5 минут и за 15 минут. по ней можно понять насколько отзывчива операционная система, например если у вас однопроцессорная система и средняя загрузка превышает единицу значит что у вас есть процессы которые часто ждут ответа от подсистем компьютера или слишком долго выполняются на процессоре. В моем случае загрузка не превышает 1 значит все процессы корректно отрабатывают и ничего не должно затормаживать работы операционной системы, ресурсов хватает все хорошо.

Попробуем изменить эти параметры:

yes > /dev/null &

Запусти несколько таких процессов. Данная команда создаст процесс который бесконечно отправляет строку yes в /dev/null создавая нагрузку на CPU. Я создал таких процессов 8 штук в результате видим изменение

top - 15:44:13 up 7 days,  4:08, 23 users,  load average: 7.71, 3.50, 1.82

Отзывчивость системы немного упала. Видим что есть восемь активных процессов которые загружают CPU:


Зашибить их можно командой pkill yes
2) Вторая строка

Tasks: 219 total,   2 running, 217 sleeping,   0 stopped,   0 zombie

Здесь указанно общее количество процессов системы а так количество тех кто находится в состоянии работающих или в состоянии ожидания

Можно видеть что в данный момент в системе существует 219 запущенных процессов, 2 из них находится в активной работе 217 в состоянии sleep (процесс ожидает освобождения ресурсов). Две последние ячейки говорят что нет процессов в состоянии остановки (такое бывает когда процесс остановлен в результате отладки например) и нет процессов zombie ( то есть когда от процесса осталось место его работы но сам процесс уже не существует.

Давайте создадим процесс зомби в системе и посмотрим как это отобразится в top:

берем пример из википедии для тестов.

#include
#include
#include

int main ()
  {
    pid_t child_pid;

    child_pid = fork ();
    if (child_pid > 0) {
      sleep (60);
    }
    else {
      exit (0);
    }
    return 0;
  }

 сохраняем как z.c и компилируем:

gcc z.c -o z

Запускаем процесс зомбификации

./z

смотрим в топ

Tasks: 367 total,   1 running, 365 sleeping,   0 stopped,   1 zombie

появился процесс зомби. Так же его можно увидеть с помощью ps

ps ajx | grep -w Z
22844 22845 22844 24581 pts/21   22844 Z+    1000   0:00 [z]

3) Третья строка

%Cpu(s):  3.4 us,  1.2 sy,  0.0 ni, 94.9 id,  0.1 wa,  0.2 hi,  0.2 si,  0.0 st

Значения загрузки CPU:
Первое значение (3.4 us) какой процент cpu используется в пользовательском контексте, второе значение (1.2 sy) в контексте операционной системы.
Третье значение (0.0 ni) означает сколько процентов используется процессами с пониженным nice (по сути процессы выполняющиеся с повышенным приоритетом).
Четвертый параметр (94.9 id) показывает общий простой CPU.
Пятый параметр (0.1 wa) указывает на ожидание завершения ввода вывода(iowait), параметр важный по нему можно суди о производительности файловой системы. На станциях с нагруженными дисками можно увидеть существенный рост этого значения.
Шестой параметр (0.2 hi) указывает на процент обработки прерываний от железа, высокий процент говорит о хардварной неисправности какой либо подсистемы станции.
Седьмой параметр (0.2 si) показывает сколько процессорного времени затрачено на прерывания от софта. Например его рост можно наблюдать на машинах с высокой нагрузкой по сети.
Восьмой параметр (0.0 st) указывает сколько процессора скушали гипервизоры для работы виртуальных машин.

Давайте попробуем изменить нагрузки на станцию и увидеть как будут меняться эти параметры.

Используем утилиту stress (http://people.seas.harvard.edu/~apw/stress/)

sudo dnf install stress

 Изменим параметр показывающий загрузку в пользовательском контексте

 stress --cpu 8 --timeout 60s

Я запустил его восемь потоками так как на моем CPU восемь ядер. Изменения в топ:

%Cpu(s): 99.0 us,  0.7 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.2 hi,  0.0 si,  0.0 st

Как видим сразу выросло значение  (99.0 us).
Попробуем использовать параметр этой утилиты --vm который вызывает malloc()/free() системные вызовы которые отрабатываются CPU в контексте операционной системы:

stress  -m 8  --timeout 60s

сразу видно резко подскочившее время которое процессор тратит на  обработку в контексте операционной системы (84.6 sy), так же появились значения для хардварных (обращение к контроллерам ОЗУ) и софтварных (непосредственно сами вызовы malloc и free) прерываний. Данная нагрузка более чувствительна для станции чем вызов более простой sqrt() которая вызывает при первой команде:

 %Cpu(s): 14.6 us, 84.6 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.6 hi,  0.1 si,  0.0 st

 Попробуем запустить stress с повышенным приоритетом, аккуратнее данная команда может сделать невозможным использование компьютера 60 секунд ):

sudo nice -n -20 stress --cpu 8 --timeout 60s



Как видим параметр не изменился, к сожалению он не показывает нагрузку при повышенном приоритете
А вот если приоритет понизить то изменения сразу становятся видны:

sudo nice -n 1 stress --cpu 8 --timeout 60s

Хотя данную команду не обязательно запускать от суперпользователя, так как понижение приоритета не требует прав root. Но для чистоты эксперимента я сделал так. Как видим параметр указывает на то что процессор загружен задачей с измененным приоритетом



Почему так, можно прочесть в мане к top, там указано что первый параметр (us) используется для того что бы понять сколько тратится ресурса процессора процессами с установленным планировщиком ОС стандартным уровнем приоритета, а параметр (ni) для процессов с измененных пользователем приоритетом, а так как пользователь может только понизить приоритет соответственно процессы с повышенным приоритетам там не отображаются.
Далее пробуем изменить параметр хардварных прерываний:

stress --io 80 --vm-bytes 512MB --vm-stride 8182 --timeout 60s

 нагружаем ввод/вывод получаем изменения (22.1 wa):

%Cpu(s):  5.3 us, 55.1 sy,  0.0 ni, 14.7 id, 22.1 wa,  1.0 hi,  1.9 si,  0.0 st

Видно что одновременно с возросшим sy выросло ожидание wa. Утилита stress вызывает для нагрузки io вызов sync() что увеличивает iowait и нагружает процессор в привилегированном режиме.
Попробуем загрузить жесткие диски станции

stress --hdd 80 --timeout 60s

 Видно что прирост существенный

%Cpu(s):  8.9 us,  3.7 sy,  0.0 ni,  0.0 id, 86.7 wa,  0.0 hi,  0.7 si,  0.0 st

Так же видна незначительная нагрузка на процессор со стороны пользовательских и системных нагрузок потому что утилита использует вызовы write()/unlink() не требующих больших расчетов на cpu зато более медленная файловая система заставляет ждать процессор пока выполнятся все операции с ней.

4) Четвертая и пятая строки

MiB Mem :  31963.1 total,   7117.7 free,   8407.1 used,  16438.3 buff/cache
MiB Swap:  12212.0 total,   4322.1 free,   7889.9 used.  22665.2 avail Mem

Тут можно посмотреть состояние оперативной памяти и свопа.
MiB Mem :  31963.1 total на станции установлено 32 гига ОЗУ. Измеряются параметры по умолчанию в mibibyte то есть 2 в степени 20. Этот параметр можно изменить запустив top с параметром -E указав через пробел:

               k - kibibytes
               m - mebibytes
               g - gibibytes
               t - tebibytes
               p - pebibytes
               e - exbibytes

7117.7 free указывает что в данный момент времени в системе свободной остается около 7 гигов памяти
8407.1 used указывает что выделено непосредственно программам около 8 гигов
16438.3 buff/cache это интересная особенность ос linux при открытии файлов или обращении в библиотекам данные из них помещаются сюда, и при повторном открытии или обращении будут считываться отсюда что ускоряет работу операционной системы, данный кеш может быть в любой момент скинут операционной системой и не страшно если большую часть ОЗУ занимает этот кеш. Если это становится какой-то проблемой кеш можно в любой момент принудительно отчистить без всяких последствий для ОС. Делается это командой:

echo 3 | sudo tee /proc/sys/vm/drop_caches

 MiB Swap:  12212.0 total полный доступный объем раздела подкачки, используется для того что бы скинуть страницы памяти из оперативы на диск в случае нехватки ОЗУ. если оперативной памяти постоянно не хватает такая операция приводит к тому что ОС занимается большую часть времени перемещениями данных из ОЗУ в своп и обратно машина начинает свопить активно шуршать дисками отзывчивость серьезно снижается. Поэтому следует всегда учитывать хватит ли вам объема ОЗУ для ваших задач, и нет ли программ с утечками данных.
4322.1 free,   7889.9 used. соответственно свободный и используемый объем памяти в свопе.
22665.2 avail Mem последний параметр особенно интересен, он показывает сколько обема в ОЗУ и свопе может быть организованно немедленно для доступа какой либо программы, без обмена со свопом, параметр важный для нагруженных систем где может внезапно организоваться потребность в больших объемах оперативной памяти. Рассчитывается из свободной памяти с учетом того что менеджер памяти операционной системы перестроит slab кеши.

5) Непосредственно сам список процессов
Список состоит из столбцов в которых обозначены те или иные параметры процесса и ресурсы которые этот процесс использует.

PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND

PID это идентификатор процесса, переменная целочисленного типа.
USER пользователь от которого запущен процесс.
PR Приоритет выставленный планировщиком операционной системы. Если вы видите тут значение rt значит процесс работает в режиме реального времени.
NI Приоритет процесса выставленный пользовтелем число от -20 до 19

Далее идет столбцы показывающие работу процесса с памятью. Как известно Linux есть три типа памяти. Первое это физическая память которой обычно всегда мало), тут находится код который должен выполнятся в данный момент и данные для этого используемые. Второе это файл подкачки куда скидывается то в чем нет непосредственной необходимости в данный момент и если есть необходимость в физической памяти. Третье это виртуальная память как почти бесконечный ресурс операционной системы. Именно благодаря виртуальной память в линукс возможны такие вещи как абстракция, изоляция, совместное использование и гибкость при работе с памятью. В мане вся память системы описывается следующей табличкой:

  Приватная Общая
Анонимная
 
  • stack
  • malloc()
  • brk()/sbrk()
  • mmap(PRIVATE, ANON)
  • POSIX shm*
  • mmap(SHARED, ANON)
Файловый бекенд  
  • mmap(PRIVATE, fd)
  • pgms/shared libs
 
  • mmap(SHARED, fd)

VIRT Виртуальная память процесса выделена операционной системой. складывается из всех выделенных странниц из таблички
RES Виртуальная резидентная память процесса которая находится в физической области памяти суммируется из столбцов RSan, RSfd и RSsh (можно включить просмотр клавишей f).

  • RSan резидентная анонимная память без файлов (библ данных и прочего)
  • RSfd резидентная память в которой находятся файлы библиотек и другие файловые данные
  • RSsh резидентная анонимная общая память, сюда входит разделяемая память с библиотеками.

SHR Общая память которая разделяется между другими процессами суммируется столбцами RSfd и RSsh

Итак можно выяснить что процесс занял своими личными данными RES - SHR = RSan. Ну или просто добавить столбец RSan отображение top.

S статус процесса, бывает такой:

D - процесс заснул (ожидает воода пользователя например)
I - работае в холостую
R - обрабатывается в данный момоент процессором
S - процесс спит ожидая своей очереди на обработку
T - остановлен сигналом
t - остановлен отладчиком во время трассировки
Z - зомби

%CPU Доля процессороного времени занятая указзаным процессом. Данный пармерт может быть больше ста процентов на многоядерных системах, если посмотреть в режиме потоков (клавиша H) можно увидеть нормированное значение загрузки всех ядер (не больше 100%).
%MEM Процент занятой резидентной общей памяти процессом. Тоже самое что RES только в процентах.
TIME+ Общее время процессора, использованное задачей с момента ее запуска.
COMMAND Отображает командную строку, использованную для запуска задачи, или имя связанной программы.

Так же есть еще дополнительные столбцы отображаение которых можно включить клавишей f

Итак, top дает достаточно много информации для работающе операционной системы для анализа ее работы в шататных ситуациях и некоторых нештатных.

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

published: June 17, 2019, 2:27 p.m.

Бывает необходимо, что бы виртуальная машина KVM присутствовала в нескольких подсетях с разными VLAN. Что бы автоматизировать данный процесс я использую openvswich, в котором создаю необходимые мне vlan подсети. Давайте создадим такую конфигурацию:

Есть две подсети одна имеет VLAN100 другая VLAN101  данные сети доступны с хостовой машины по кабелю, который воткнут в транковый порт свича, протегированный в соответствующих вланах. В Fedora в стандартных репозиториях есть пакет openvswitch. Установим его командой:

$ sudo dnf install openvswitch -y

После установки следует запустить сервиc openvswitch

$ sudo systemctl enable  openvswitch.service

$ sudo systemctl  start openvswitch.service

При запуске сервис создает базу в файле /etc/openvswitch/conf.db в котором и будет содержать все свои настройки. Для управления конфигурациями служит утилита ovs-vsctl. Структура будущей сети такова

Такая структура необходима из-за некоторых особенностей работы libvirt, например невозможно указать какой конкретно интерфейс и в каком vlan следует создать для определенной машины. Проще всего заранее сделать несколько свичей протегированных в различных vlan,  средствами libvirt добавлять туда интерфейс не задумываясь об их тегах. Свич root-sw это наш корневой свич в который мы подключаем все остальные свичи. Итак создаем root-sw

$ sudo ovs-vsctl add-br root-sw

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

$ sudo ovs-vsctl add-port root-sw eth0

Теперь нужно создать свичи sw-vlan100 и sw-vlan101 укажем что они протегированны во vlan 100 и 101

$ sudo ovs-vsctl add-br sw-vlan100 100

$ sudo ovs-vscrl add-br sw-vlan101 101

Что бы наши машинки сами подцепляли нужные порты в свичах настроим виртуальные сети libvirt. Используем для этого утилиту virsh, входящую в состав пакета libvirt-client.

$ sudo virsh

 Дальнейшие команды выполняем в ней:

virsh # net-list

Name                 State      Autostart     Persistent

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

default              active     yes           yes

 Как видно у нас есть только одна дефолтная сеть default используем ее как шаблон.

virsh # net-edit default

В результате выполнения команды видим xml конфиг default сети, приведем ее к виду

<network>
  <name>sw-vlan100</name>
  <forward mode='bridge'/>
  <bridge name='sw-vlan100' />
  <virtualport type='openvswitch'/>
</network>

После чего выходим из редактора соответствующей командой с сохранением файла. Кстати установить редактор по умолчанию поможет системная переменная

$ export EDITOR="/usr/bin/vim"

так же создаем конфиг второй сети, еще раз запускаем редактирование default сети

virsh # net-edit default

Приводим к виду

<network>
  <name>sw-vlan101</name>
  <forward mode='bridge'/>
  <bridge name='sw-vlan101' />
  <virtualport type='openvswitch'/>
</network>

Делаем службы сетей активными и включаем автостарт

virsh # net-autostart sw-vlan100

virsh # net-start sw-vlan100

virsh # net-autostart sw-vlan101

virsh # net-start sw-vlan101

  Теперь при создании виртуальной машины следует выбрать нужную сеть в virt-manager и порт автоматически будет создаваться в свиче тегированном в нужном vlan.

  Теперь если у вас есть необходимость управлять хостовой машиной по ssh, то создайте интерфейс в нужном vlan и назначьте на него IP адрес

$ sudo ovs-vsctl add-port man0 sw-vlan100

Делаем интерфейс внутренним

$ sudo ovs-vsctl set interface man0 type=internal

 Видим интерфейс в системе

$ ip link show  man0

Тепрь можете назначит ему интерфейс вручную:

$ sudo ip addr add 192.168.1.1/24  dev man0

 Или установить его по DHCP

$ sudo dhclient man0 -pf /run/dhclient.pid

 Спасибо за внимание.