Под капотом · Виртуализация · Сеть

Прямое подключение macvtap

Пользователь подключает ВМ к физической карте напрямую, без моста. Для этого он вводит несколько команд:

Команда
virsh net-define macvtap-net.xml
virsh net-start macvtap-net
virsh attach-interface vm1 --type network --source macvtap-net \
    --model virtio --config
libvirt API virNetworkCreate(), virDomainAttachDeviceFlags()

После выполнения команд ВМ получает адрес в ЛВС, но хост и гость перестают видеть друг друга.

  • Команда net-define описывает сеть типа bridge с указанием физического интерфейса;
  • Команда net-start разрешает подключение, но мост не создаётся;
  • Команда attach-interface добавляет ВМ интерфейс этой сети;
  • Libvirt создаёт macvtap-устройство поверх eno1 - по одному на интерфейс ВМ.
  • пользователь 1. Пользователь описывает сеть без моста
    <network>
      <name>direct-macvtap</name>
      <forward mode='bridge'>
        <interface dev='eno1'/>
      </forward>
    </network>

    Режим bridge в forward означает «macvtap в режиме bridge»: элемента <bridge> здесь нет, потому что моста не будет. Режим должен совпадать с возможностями физического коммутатора: vepa требует VEPA-совместимого коммутатора, passthrough отдаёт карту целиком.

  • libvirt 2. Демон запоминает список физических портов
    forward mode='bridge'
    candidates: eno1

    В списке может быть несколько карт - тогда демон выбирает наименее занятую в момент подключения.

  • libvirt 3. Демон создаёт macvtap и отдаёт его QEMU
    ip link add link eno1 name macvtap0 type macvtap mode bridge
    /dev/tapN -> QEMU

    macvtap - не мост, а отдельный интерфейс поверх карты: у него свой MAC и своё место в таблице коммутатора.

  • QEMU 4. QEMU подключает карту гостя к этому интерфейсу
    -netdev tap,id=hostnet0,ifname=macvtap0
    -device virtio-net-pci,netdev=hostnet0,mac=52:54:00:…

    Для QEMU это обычный tap: разница только в том, куда устройство смотрит на хосте.

  • сеть 5. Кадры уходят прямо в коммутатор
    гость -> macvtap0 -> eno1 -> коммутатор ЛВС

    Мост в этом пути не участвует, поэтому нет ни программной коммутации, ни общей точки отказа.

  • гость 6. Гость получает адрес в ЛВС
    DHCPDISCOVER -> 192.168.10.88

    Адрес выдаёт DHCP-сервер сети: гость выглядит как ещё одна машина на порту коммутатора.