Бывает необходимо, что бы виртуальная машина 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Как видно у нас есть только одна дефолтная сеть default используем ее как шаблон.
Name State Autostart Persistent
--------------------------------------------------
default active yes yes
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Теперь при создании виртуальной машины следует выбрать нужную сеть в virt-manager и порт автоматически будет создаваться в свиче тегированном в нужном vlan.
virsh # net-start sw-vlan100
virsh # net-autostart sw-vlan101
virsh # net-start sw-vlan101
Теперь если у вас есть необходимость управлять хостовой машиной по 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Спасибо за внимание.