Похоже, я снова здесь, привет. Я знаком с hyperv и vmware, но последнее время экспериментирую с Proxmox, и, честно говоря, это просто великолепно. Почему я так долго до этого не дошёл? В любом случае, кажется, я как-то споткнулся здесь, придя из Macvtap LANd. @dietmar «В чём преимущество?» Вот что говорит IBM: «Драйвер MacVTap обеспечивает исключительную пропускную способность и количество операций в секунду (на 10-50% лучше, чем два программных моста). Кроме того, производительность MacVTap быстрее масштабируется с ростом нагрузки по сравнению с программным мостом. Это значит, что MacVTap более экономно расходует ресурсы CPU, выполняя одинаковую работу, но с меньшими затратами. Другими словами, MacVTap может выполнить больше работы на тех же CPU ресурсах. Однако, несмотря на лучшую производительность, у MacVTap есть несколько ограничений, которые могут ограничить области его применения. Первое — MacVTap не позволяет легко организовать сетевое взаимодействие между хостом KVM и гостями KVM, использующими MacVTap.»
Итак, macvtap — это драйвер ядра, который работает как tap, в отличие от программного маршрутизатора-моста, который использовался раньше (и активно используется до сих пор). Поверьте, документации по Macvtap в интернете довольно мало, но, по моим очень скромным тестам, он в целом работает как заявлено. Тем не менее, я считаю, что KVM уже довольно органично интегрируется с Macvtap. Например, вот конфигурация /etc/network/interfaces для KVM+Virt-Manager:
(к слову, я ещё не копался в причинах, но такой тип сетевой настройки плохо сочетается с некоторыми нестандартными systemd-конфигами, которые использует hypervisor Proxmox. ¯\_(ツ)_/¯ systemd жалуется, что не может перезапустить сеть, но она всё равно перезапускается и работает нормально... Я без понятия, почему. В общем, совсем неважно, просто решил упомянуть.)
Код:
auto lo
iface lo inet loopback
allow-hotplug enp1s0f0
auto enp1s0f0
iface enp1s0f0 inet static
address 10.8.0.30
netmask 255.255.240.0
gateway 10.8.0.1
dns-nameservers 10.80.0.5 10.10.10.10
auto enp1s0f0.4
iface enp1s0f0.4 inet manual
gateway 10.80.0.1
vlan-raw-device enp1s0f0
auto enp1s0f0.10
iface enp1s0f0.10 inet manual
gateway 10.10.10.1
vlan-raw-device enp1s0f0
auto enp1s0f0.24
iface enp1s0f0.24 inet manual
gateway 10.24.0.1
vlan-raw-device enp1s0f0
auto enp1s0f0.25
iface enp1s0f0.25 inet manual
gateway 10.25.0.1
vlan-raw-device enp1s0f0
Здесь я просто объявляю vlan-интерфейсы в сетевом конфиге, а если зайти в virt-manager и добавить новую виртуалку, то там можно выбрать эти vlan-интерфейсы как macvtap-мост, vepa, private или passthrough устройство.
И когда ВМ стартует, то вот как это выглядит в команде ip на хосте для любой ВМ с vlan-интерфейсом:
Код:
~# ip a
...
13: enp1s0f0.4@enp1s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500...
14: enp1s0f0.10@enp1s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500...
15: enp1s0f0.24@enp1s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500...
16: enp1s0f0.25@enp1s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500...
18: macvtap5@enp1s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500...
26: macvtap1@enp1s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500...
27: macvtap2@enp1s0f0.24: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500...
28: macvtap3@enp1s0f0.25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500...
Я думаю, что virt-manager просто вызывает `ip link add` для этих macvtap-интерфейсов, а после создания они просто управляются ядром, пока их вручную не удалят… Но могу ошибаться.
Что стоит учесть про Macvtap:
Как уже упоминалось, нельзя пинговать IP хоста из гостевых систем в той же подсети. Вот тут и появляется NAT hairpinning. Но если гость на отдельном VLAN или другой подсети с собственным именем, то они проходят через NAT, что выполняет ту же функцию, что и hairpinning в документации. Это позволяет организовать связь между гостями и хостом по IP. Тем не менее, хотя я не могу пинговать хост с гостя и наоборот, virt-manager всё равно может управлять этими машинами через vnc/spice, так что какая-то связь есть. Может, управление идёт через vlan-интерфейс в macvtap, или этот tap игнорируется с точки зрения управления? Не знаю. Думаю, здесь нет однозначного ответа, но было бы здорово иметь возможность воспользоваться тем, что уже встроено в ядро десятки лет.
Мой случай — реанимировать старое железо, запуская proxmox на старых процессорах. Когда CPU загружен, это отражается и на сети. Думаю, macvtap мог бы помочь снизить нагрузку. А может и нет, я не гений.
Вот мои две копейки, а вы продолжайте в том же духе, я, пожалуй, начну мигрировать всё на proxmox.
Джек
P.S. На мой взгляд, основные проблемы с документацией по Macvtap возникли примерно в тот же период, когда в ядро внедряли cgroup networking. Macvtap никогда не рассматривали как простое решение, и с тех пор документация не обновлялась. Похоже, что Docker взял Macvtap на вооружение, и все начали думать, что это только для контейнеров ¯\_(ツ)_/¯