Я пытаюсь создать виртуальные машины, которые могут видеть друг друга и хост. Они размещаются в qemu/kvm и управляются через libvirt. Сетевой адаптер виртуальных машин создается с помощью macvtap(режим VEPA) для повышения производительности.
После включения функции « hairpin
через коммутатор» с потоком одноадресной рассылки все в порядке, независимо от того, находятся ли они между виртуальными машинами или между виртуальной машиной и хостом.
Однако, когда дело доходит до многоадресной рассылки, я сталкиваюсь с проблемой. Я считаю, что хост не может ping6 каждой виртуальной машины. С tcpdump я наблюдаю, что пакет запроса соседей на адрес многоадресной рассылки ff02::1:ff00:212
от хоста не получен моей виртуальной машиной , чей адрес ipv6 - 2001:da8:a0:600::212/64
. Очевидно, этот многоадресный пакет должен был быть передан в виртуальную машину macvtap.
В результате проблемы многоадресной рассылки все пакеты ipv6 теряются, так как Neighbor Discovery не может работать должным образом.
Я уверен, что с коммутатором ничего не происходит, потому что когда я запускаю tcpdump через физический сетевой адаптер, я могу видеть запрос соседей два раза в секунду, один выход, один вход.
После того, как я установил интерфейс macvtap на хосте в случайный режим, виртуальная машина получает пакет запроса соседей вместе с некоторым другим многоадресным пакетом, который должен быть отфильтрован по macvtap, но не одноадресным пакетом для другой виртуальной машины, даже когда я отправляю ping6 другим виртуальным машинам на хозяин одновременно.
Так что я думаю, что включение беспорядочного режима на всех интерфейсах Macvtap - приемлемый обходной путь, но не изящный.
Весь мой хост и виртуальная машина - CentOS 7.0. Я пытался установить kernel-ml(linux 4.1.3) от elrepo на моем хосте, но это не имеет значения.
Так:
- Как я могу установить все интерфейсы Macvtap в случайный режим каждый раз, когда он запускается libvirt?
- Я не знаком с сетевым драйвером. Но, согласно http://www.makelinux.net/ldd3/chp-17-sect-14, я подозреваю, что в драйвере macvlan есть некоторые ошибки, из-за которых ядро не может правильно настроить список многоадресной рассылки интерфейса , Однако в linux/driver/net/{macvlan.c, macvtap.c} нет set_multicast_list. Где найти правильное место для поиска помощи?
Смотрите также: https://bugzilla.redhat.com/show_bug.cgi?id=1035253