Это пожалуй одна из самых актуальных функций коммутатора, как физического, так и виртуального. Я думаю, что объяснять их функциональное предназначение будет лишним, поэтому просто покажу как это реализуется в Open vSwitch.
В скудной документации это предложено делать следующим способом:
Берется конкретный, уже существующий порт и ему, путем внесения изменений в базу, присваивается тег (tag) с номером желаемого VLAN-а (VLAN ID)
# ovs-vsctl set port <имя_порта> tag=10
Все вроде бы просто и логично. Но, у этого способа есть как минимум три серьезных проблемы, делающие его фактически неприменимым.
Во-первых, необходимо знать какие порты принадлежат ВМ. Какого-то штатного способа сделать это я не нашел. Во-вторых, после выключения ВМ, ее порт и соответствующие ему настройки автоматически удаляются. И в третьих, даже если мы создадим для каждой ВМ статический порт и присвоим нужные теги, способа подключить ВМ к существующему порту при использовании KVM и libvirt, нет.
По большему счету, это проблема libvirt. Судя по списку изменений [1], до версии 0.10.0 он не умел работать с VLAN’ами. Точнее, он мог автоматически создавать интерфейсы при запуске ВМ, но не позволял помещать их в нужные VLAN’ы, тогда как, например, XenServer, тесно интегрированный с OVS, позволяет указать номер VLAN при настройке сетевого интерфейса ВМ. В дистрибутивах с долгосрочной поддержкой версия libvirt отстает (например, Ubuntu 12.04 LTS это 0.9.8), так что приходится использовать другой путь.
Мы можем включить в нужный VLAN не отдельный порт а целый коммутатор целиком. По умолчанию коммутатор создается в VLAN-е 0. Наш главный, родительский(ovs-sw0) мы так и оставим. А вот несколько других, дочерних, мы создадим в нужных нам VLAN-ах и подключим их к главному как порты.
Синтаксис:
# ovs-vsctl add-br <новый_дочерний_мост> <родительский_мост> <VLAN ID>
# ovs-vsctl add-br sw0-vlan10 ovs-sw0 10
Данная команда создает виртуальный коммутатор sw0-vlan10, подключает к основному как порт и помещает его в VLAN с номером 10.
Таким путем, можно создать сколько угодно VLAN-ов. А чтоб поместить ВМ в нужный VLAN, необходимо вместо общего устройства ovs-sw0 указать например sw0-vlan10.
Теперь, команда ovs-vsctl show дополнительно будет показывать теги каждого порта, определяя тем самым его принадлежность к VLAN.
Посмотреть в каком VLAN-е находится конкретный коммутатор:
# ovs-vsctl br-to-vlan <имя_коммутатора>
Посмотреть имя родительского коммутатора:
# ovs-vsctl br-to-parent <имя_коммутатора>
Ссылки
[1] Лог внесенных изменений в версиях Libvirt — http://libvirt.org/news.html
Помогла ли вам статья?