KVM / libvirt: como configurar endereços IP de convidado estáticos no host de virtualização

31

O que eu gostaria de fazer é definir a configuração de rede dos convidados (endereço IP, sub-rede, gateway, endereço de broadcast) do sistema host. A configuração de rede usada está no bridgemodo. Como posso configurar a rede do host em vez de configurar o próprio cliente para uma configuração de rede estática?

Se eu executar:

virsh edit vm1

também existe um <network>bloco e tentei configurar a interface de rede a partir daí, mas infelizmente a VM convidada não parece usá-la e, como tal, está offline na rede (já que usa apenas a configuração automática de rede) ... Guest As VMs são baseadas em Linux e Windows. Qualquer ajuda seria muito apreciada.

beta
fonte
2
A entrega de endereços IP por meio de concessões reservadas de DHCP não é uma opção?
MadHatter suporta Monica
Hum, acho que sim, mas gostaria de atribuir a VM nº 1 ao IP nº 1, a VM nº 2 ao IP nº 2, etc. (em vez de fornecer a eles um IP aleatório da minha concessão). Você acha que seria possível configurá-lo dessa maneira com o DHCP? Se for, ficaria feliz em tentar essa abordagem.
beta
2
Sugiro para renomear a questão para algo como " KVM / libvirt: Como configurar endereços IP estáticos convidado no host de virtualização "
Nils Toedtmann
11
Concorde com o @NilsToedtmann, quaisquer detalhes adicionais sobre o hypervisor sendo usado como sistema operacional base, etc, seriam benéficos. Pode haver ferramentas de gerenciamento adicionais baseadas no SO para ajudar na configuração da rede para sistemas virtualizados. Existem ótimos guias sobre KVM e LXC para uso com sistemas operacionais baseados em SUSE que podem usar o YaST.
Matt

Respostas:

52

Se você não deseja fazer nenhuma configuração dentro do convidado, a única opção é um servidor DHCP que entregue endereços IP estáticos. Se você usar o bridgemodo, provavelmente será um servidor DHCP externo. Consulte o manual para descobrir como atender a concessões estáticas.

Mas pelo menos nos modos de encaminhamento natou route, você pode usar o libvirt embutido dnsmasqd(versões mais recentes do libvirtd suportam a opção "dhcp-hostsfile" do dnsmasq). Aqui está como:

Primeiro, descubra os endereços MAC das VMs que você deseja atribuir endereços IP estáticos:

virsh  dumpxml  $VM_NAME | grep 'mac address'

Depois edite a rede

virsh  net-list
virsh  net-edit  $NETWORK_NAME    # Probably "default"

Encontre a <dhcp>seção, restrinja o intervalo dinâmico e adicione entradas de host para suas VMs

<dhcp>
  <range start='192.168.122.100' end='192.168.122.254'/>
  <host mac='52:54:00:6c:3c:01' name='vm1' ip='192.168.122.11'/>
  <host mac='52:54:00:6c:3c:02' name='vm2' ip='192.168.122.12'/>
  <host mac='52:54:00:6c:3c:03' name='vm3' ip='192.168.122.12'/>
</dhcp>

Em seguida, reinicie sua VM (ou reinicie o cliente DHCP, por exemplo ifdown eth0; ifup eth0)


Atualização: vejo que há relatos de que a alteração pode não entrar em vigor após o "virsh net-edit". Nesse caso, tente isso após a edição:

virsh  net-destroy  $NETWORK_NAME  
virsh  net-start    $NETWORK_NAME  

... e reinicie o cliente DHCP da VM.

Se isso ainda não funcionar, você pode precisar

  • interrompa o serviço libvirtd
  • matar todos os processos dnsmasq que ainda estão vivos
  • inicie o serviço libvirtd

Nota: Não há como o host KVM forçar uma VM com sistema operacional desconhecido e configuração desconhecida a usar uma determinada configuração de rede. Mas se você souber que a VM usa um determinado protocolo de configuração de rede - por exemplo, DHCP - você pode usá-lo. Isto é o que este post assume.

Alguns sistemas operacionais (por exemplo, algumas distribuições Linux) também permitem passar opções de configuração de rede para o convidado, por exemplo, através da linha de comando do kernel. Mas isso é muito específico para o sistema operacional e não vejo vantagem sobre o método DHCP.

Nils Toedtmann
fonte
Obrigado, vou tentar e informar se consegui funcionar dessa maneira.
beta
Legal. Mas você terá que mudar o modo de rede.
Nils Toedtmann 9/09/14
11
Eu vim aqui porque tenho uma necessidade semelhante e acho que posso explicar a vantagem de usar o DHCP, pelo menos para o meu caso de uso. A situação é reconhecidamente incomum. Eu tenho um servidor que se move para frente e para trás entre duas redes a cada duas semanas. Tem cerca de 10 convidados. Uma das redes possui um servidor DHCP (que é difícil de controlar para mim), a outra não. Isso praticamente exclui o uso do DHCP. Estou procurando uma maneira de alterar o IP do host e atualizar automaticamente os endereços IP de convidados etc. com base nisso (estou usando o chef para automação, portanto, uma vez que os endereços IP estejam configurados, eu estou pronto).
21415 Kevin Keane
2
Posso confirmar que as alterações não entram em vigor sem destruir e reiniciar a rede. Eu também descobri, estranhamente, que precisava desligar e iniciar a VM. Simplesmente reiniciar deixou a interface em um estado quebrado.
orodbhen 21/05
Reiniciar a rede não renova as concessões do DHCP. Para isso, você tem que excluir o arquivo de status da rede em / var / lib / libvirtd / dnsmasq
orodbhen
3

Consegui fazer dnsmasq'ver' o mapeamento IP-MAC recém-adicionado simplesmente enviando um -HUPsinal para o dnsmasqprocesso. Depois disso, a reinicialização do novo convidado foi suficiente para que o IP correto fosse atribuído a ele, sem a necessidade de reiniciar libvirtdnem a própria rede.

A documentação oficial da libvirt ( http://wiki.libvirt.org/page/Networking#Applying_modifications_to_the_network ) menciona esse script Perl não oficial que automatiza todo o processo: https://gist.github.com/bendiken/032ea1bddb9ffafe98b4

Eu mesmo não tentei esse script, porque descobri que o arquivo hosts já estava atualizado e apenas enviar o sinal -HUP era suficiente.

O host está executando o Debian 7.8 e as versões dos pacotes são:

  • kvm 1: 1.1.2 + dfsg-6 + deb7u8
  • qemu-kvm 1.1.2 + dfsg-6 + deb7u8
  • libvirt-bin 0.9.12.3-1 + deb7u1
Stefano Rago
fonte