Como obter o bridging do tipo Virtualbox no KVM?

1

Eu precisava mover algumas VMs de um sistema de teste do VirtualBox para um host de produção do KVM. Os hosts são duas cópias do mesmo sistema de hardware e software (Ubuntu Server de 64 bits v16.04, pelo que importa).

Não é tudo muito complexo, mas a parte de rede.

Para convidados do 'virtualbox', tenho um único adaptador ethernet virtio ligado a um dos dispositivos de ligação do host. O convidado é facilmente acessível a partir da rede à qual o host está conectado e do próprio host. Desta forma, o convidado é como "apenas outro servidor na rede". Durante as operações, não vejo nada além da ponte virbr0.

AFAIU, essa configuração simples não pode ser replicada no KVM. Se eu usar bridging, não posso me comunicar de convidado para host. A solução sugerida é adicionar uma segunda interface ao convidado para tal uso.

Essa é a única opção que eu tenho?

Então, se algum detalhe técnico estiver disponível, eu gostaria de saber como o Virtualbox pode fazer algo que o KVM não pode fazer.

    
por EnzoR 08.12.2016 / 10:05

4 respostas

2

O que você descreve é uma configuração em ponte KVM absolutamente padrão documentada praticamente em qualquer lugar que você queira. A idéia é ter a ligação no host sob uma ponte (a ponte consegue manter a configuração IP do host, não o vínculo), e a VM poderá usar a bridge exatamente como você está acostumado no vbox.

Depois que você tiver uma ponte disponível no host, o virt-manager permitirá que você escolha um dispositivo de rede compartilhado para se conectar (por exemplo, a nova ponte) ou simplesmente atualize o domxml para o convidado usar a ponte e não é a rede NAT padrão

    
por 08.12.2016 / 16:21
0

Não foi tão fácil quanto esperado. A dica geral de @dyasny é verdadeira: é factível, de fato. Os principais objetivos aqui são:

  1. Não use ferramentas de terceiros (como virsh , virtinst ou libvirt ) para aprender e entender.

  2. Execute VMs sem ser root com o usuário sem privilégios de administração normal.

Veja como eu fiz isso.

  1. Desative a interface principal do host em /etc/network/interfaces , comentando as linhas da rede principal.

  2. Crie uma ponte de rede contendo essa interface no mesmo arquivo. A interface original irá perder o IP que irá para a bridge. O arquivo de configuração ficaria assim:


    auto eth0 # no iface and IP stuff
    auto br0
    iface br0 inet static
        bridge_ports    eth0
        bridge_stp      off
        bridge_maxwait  0
        bridge_fd       0
        address 192.168.255.253/24
        gateway 192.168.255.254
  1. Crie uma ACL para o QEMU para permitir o tráfego para a ponte em /etc/quemu/bridge.conf , a propriedade para root:kvm end permissions 0640 . O diretório /etc/quemu/ precisa ser root:kvm e 0770 :

sudo mkdir -v /etc/qemu
# 'br0' is the same name as used in the previous step
echo allow br0 | sudo tee -a /etc/quemu/bridge.conf > /dev/null
sudo chown -R -vc root:kvm /etc/qemu
sudo chmod -vc 0770 /etc/qemu
sudo chmod -vc 0640 /etc/qemu/*
  1. Corrija o script auxiliar de ponte. Isso é realmente obrigatório como a instalação padrão, se efetivo apenas com root .

sudo chmod -vc u+s /usr/lib/qemu/qemu-bridge-helper
  1. Adicione seu usuário não privilegiado ao grupo kvm . Você precisará fazer logout e login (ou abrir uma nova sessão) para tornar isso efetivo.

sudo usermod -a -G kvm 'id -un'
  1. Reinicie a rede.

sudo service networking restart
  1. Agora, quando você iniciar sua VM por linha de comando, poderá usar para o dispositivo de rede uma lista de argumentos como esta:

... \
-netdev bridge,id=net0,br=br0

onde net0 é o dispositivo de rede enumerado (o primeiro neste caso) e br0 é o nome da interface de ponte como definido anteriormente. Então, por exemplo, um exemplo de linha de comando completa pode ser este:


kvm -cpu host -machine q35 -boot order=dc -vga virtio -vnc 127.255.255.1:0 -name qemutest,process=qemutest -uuid 901f83ce-b999-459b-b1b6-a9ba94cac382 -smp cpus=4 -m size=8192 -cdrom /home/user/image.iso -drive file=/home/user/Desktop/QEMU/qemutest/qemutest-D0.qcow2,if=virtio -device virtio-net-pci,mac=02:19:3e:39:a5:de,netdev=net0 -netdev bridge,id=net0,br=br0
    
por 10.12.2016 / 08:28
0

Eu também passei vários dias pela resposta, ainda não entendi completamente, então não consigo explicar os detalhes técnicos, mas parece que a forma como o VirtualBox (host bridge) fez não tem um bom desempenho se comparado ao macvtap.

Uma evidência:

link

    
por 13.07.2018 / 19:15
-1

Você pode usar o iptables para natar os IPs convidados internos com o (s) seu (s) público (s) e, em seguida, usar IPs internos para se conectar aos convidados do host KVM

    
por 08.12.2016 / 10:29