Acessando redes multicast do qemu (a partir de contêineres do Docker)

0

O QEMU permite que conecte diferentes VMs usando uma rede virtual baseada em um endereço multicast comum especificando -netdev socket,mcast=230.0.0.1:1234 na inicialização.

Dessa forma, posso facilmente conectar várias VMs e participar de novas VMs em tempo real.

É possível ingressar nessa rede sem usando o QEMU? Especialmente é possível conectar um contêiner docker a essa rede?

    
por michas 17.03.2018 / 06:22

1 resposta

0

Supondo que você esteja executando as VMs em um único host e não em vários hosts, a maneira mais simples de estabelecer uma rede entre as VMs do QEMU e outras VMs (ou hosts reais) é usar dispositivos de toque em vez de multicast. toque nos dispositivos e adicione suas interfaces de contêineres Docker (ou o que você quiser) à ponte.

BTW, a descrição da sintaxe e da rede no link que você forneceu é obsoleta e desaparecerá em algum estágio. Em particular, o conceito de vlans do QEMU desaparecerá. Na sintaxe atual, use algo como

-netdev tap,ifname=qemu0

e depois (como root)

ip link add br_qemu type bridge
ip link set br_qemu up
ip link set qemu0 master br_qemu
ip link set qemu1 master br_qemu

Se você criar a ponte antes de lançar as VMs, também poderá usar -netdev bridge,br=br_qemu para que o QEMU adicione as interfaces de toque à ponte.

Se você precisa especificamente de multicast porque suas VMs estão sendo executadas em hosts físicos diferentes, isso será mais complicado. O primeiro passo seria descobrir o formato no qual o QEMU envia os pacotes (não é o pacote bruto, mas eu não procurei mais), e o segundo para escrever um proxy que une o grupo multicast e encaminhar entre esse grupo. e uma interface de toque.

Como alternativa (mas com menos eficiência), você pode executar uma VM do QEMU dedicada com duas placas de rede, uma multicast e uma única, que é configurada para não fazer nada além de avançar entre elas.

Uma alternativa ainda melhor seria implementar a comunicação entre os diferentes hosts físicos de uma maneira diferente (túnel, VLANs na LAN física (VLANs reais 801.q, não QAVs)) e manter as interfaces de toque. / p>

Editar

Para adicionar uma VLAN à sua LAN, digamos, em eth0 no host, faça

ip link add link eth0 name eth0.5 type vlan id 5

onde 5 é a tag de VLAN que você escolheu. Em seguida, adicione essa interface à ponte

ip link set eth0.5 master br_qemu

e você está pronto para ir. Você pode colocar esses dois comandos em um script que você usa para iniciar as VMs. Alternativamente, coloque o equivalente a isto em /etc/network/interfaces (google ou leia manpage para detalhes). Sim, requer um pouco de configuração no host.

Editar

Ok, eu dei uma olhada no formato dos pacotes multicast que o QEMU envia, e é apenas o frame ethernet. Então você pode fazer algo parecido com

socat UDP4-DATAGRAM:230.0.0.1:1234,sourceport=1234,ip-add-membership=230.0.0.1:10.0.0.2 TUN:10.2.3.1/24,tun-type=tap,iff-no-pi,iff-up

no host que possui o contêiner docker, em que 10.0.0.2 é um endereço IP válido para o host em relação ao grupo multicast, por exemplo, o endereço IP de eth0 . Isto lhe dará uma interface tap (nível 2) onde você pode enviar pacotes Ethernet e recebê-los do grupo multicast. Agora você só precisa unir / rotear esses itens ao contêiner do Docker.

Em vez de socat , você também pode escrever seu próprio programa C curto, etc., se quiser e achar que é mais eficiente.

    
por 18.03.2018 / 18:48