Я хочу узнать, есть ли другой способ, кроме использования мостов Linux, соединить интерфейсы двух виртуальных машин?
Поскольку я пытаюсь запустить реализацию частного связующего дерева на виртуальных машинах... базовый мост Linux, который соединяет обе виртуальные машины, отбрасывает BPDU.
VirtualBox решает эту проблему, предоставляя возможность использования внутренней сети.
Есть ли аналогичная опция, если я использую KVM?
Обновление-01:Включение STP приведет к созданию топологии, содержащей 3 моста (2 виртуальные машины и 1 мост Linux, соединяющий обе виртуальные машины) вместо 2 мостов (2 виртуальные машины).
решение1
Похоже, здесь можно использовать -netdev socket
вариант QEMU, возможно, версия UDP подойдет лучше.
Также -netdev vde
может работать, хотя это сложнее и требует настройки демона коммутатора VDE.
Но я бы все равно попытался преодолеть проблему с мостом Linux, включив опцию STP, как предложил @Martin. Это простая и очень распространенная настройка.
решение2
Вы можете попробовать использовать драйвер macvtap. Обратите внимание, что он имеет некоторые ограничения — обязательно прочтите документацию libvirt об этом.
решение3
QEmu/KVM предоставляет возможность использоватьКРАНинтерфейс на вашем хосте:
когда ваш хост отправляет Ethernet-кадр на этот интерфейс, он отправляется на интерфейс вашего гостя;
Когда ваш гость отправляет Ethernet-кадр на свой интерфейс, он отправляется на TAP-интерфейс вашего хоста.
Вы можете создать обе VMS с интерфейсами TAP. Теперь вам нужно обменять кадры между двумя интерфейсами TAP: вы можете сделать это, написав программу, которая пересылает кадры Ethernet между интерфейсами (используя AF_PACKET
сокеты SOCK_RAW
)получение кадровиз одного интерфейса иотправкаих к другому.
решение4
Люди, предлагающие устройство TAP, были на правильном пути, но вам нужно еще кое-что:
Сначала создайтепара ветеринаров. Это пара виртуальных интерфейсов, каждый из которых просто передает любой получаемый трафик другому.
Затем подключите одну из двух виртуальных машин через macvtap к одному из интерфейсов veth в паре, а другую виртуальную машину — к другому интерфейсу veth.
Наконец, отправьте немного трафика.