KVM / libvirt: cómo configurar las direcciones IP de invitado estáticas en el host de virtualización

31

Lo que me gustaría hacer es establecer la configuración de red de los invitados (dirección IP, subred, puerta de enlace, dirección de transmisión) desde el sistema host. La configuración de red utilizada está en bridgemodo. ¿Cómo puedo configurar la red desde el host en lugar de configurar el propio cliente a una configuración de red estática?

Si ejecuto:

virsh edit vm1

también hay un <network>bloque e intenté configurar la interfaz de red desde allí, pero desafortunadamente la máquina virtual invitada no parece usarla y, como tal, está desconectada de la red (ya que solo usa la configuración de red automática) ... Invitado Las máquinas virtuales están basadas en Linux y Windows. Cualquier ayuda sería muy apreciada.

beta
fuente
2
¿Distribuir direcciones IP a través de arrendamientos DHCP reservados no es una opción?
MadHatter apoya a Monica el
Hm, supongo que sí, pero me gustaría asignar VM # 1 a IP # 1, VM # 2 a IP # 2, etc. (en lugar de darles una IP aleatoria de mi contrato de arrendamiento). ¿Crees que sería posible configurarlo así con DHCP? Si es así, me gustaría probar este enfoque.
beta
2
Sugiero cambiar el nombre de la pregunta a algo como " KVM / libvirt: Cómo configurar las direcciones IP de invitado estáticas en el host de virtualización "
Nils Toedtmann
1
De acuerdo con @NilsToedtmann, cualquier detalle adicional sobre el hipervisor utilizado como sistema operativo base, etc. sería beneficioso. Puede haber herramientas de administración adicionales basadas en el sistema operativo para ayudar con la configuración de redes para sistemas virtualizados. Hay excelentes guías sobre KVM y LXC para usar con sistemas operativos basados ​​en SUSE que pueden hacer uso de YaST.
Matt

Respuestas:

52

Si no desea realizar ninguna configuración dentro del invitado, entonces la única opción es un servidor DHCP que distribuye direcciones IP estáticas. Si usa el bridgemodo, probablemente será un servidor DHCP externo. Consulte su manual para saber cómo servir arrendamientos estáticos.

Pero al menos en los modos de reenvío nato route, podría usar el libvirt incorporado dnsmasqd(las versiones más recientes de libvirtd admiten la opción "dhcp-hostsfile" de dnsmasq). Aquí es cómo:

Primero, descubra las direcciones MAC de las máquinas virtuales a las que desea asignar direcciones IP estáticas:

virsh  dumpxml  $VM_NAME | grep 'mac address'

Luego edite la red

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

Encuentre la <dhcp>sección, restrinja el rango dinámico y agregue entradas de host para sus máquinas virtuales

<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>

Luego, reinicie su VM (o reinicie su cliente DHCP, por ejemplo ifdown eth0; ifup eth0)


Actualización: veo que hay informes de que el cambio podría no tener efecto después de "virsh net-edit". En ese caso, intente esto después de la edición:

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

... y reinicie el cliente DHCP de la VM.

Si eso todavía no funciona, es posible que deba

  • detener el servicio libvirtd
  • matar cualquier proceso dnsmasq que aún esté vivo
  • iniciar el servicio libvirtd

Nota: No hay forma de que el host KVM pueda forzar a una VM con SO desconocido y configuración desconocida a usar una determinada configuración de red. Pero si sabe que la VM usa un cierto protocolo de configuración de red, digamos DHCP, puede usar eso. Esto es lo que supone esta publicación.

Algunos sistemas operativos (por ejemplo, algunas distribuciones de Linux) también permiten pasar opciones de configuración de red al invitado, por ejemplo, a través de la línea de comandos del núcleo. Pero eso es muy específico para el sistema operativo, y no veo ninguna ventaja sobre el método DHCP.

Nils Toedtmann
fuente
Gracias, lo intentaré e informaré si lo tengo funcionando de esa manera.
beta
Guay. Pero tendrá que cambiar el modo de red.
Nils Toedtmann
1
Vine aquí porque tengo una necesidad similar, y creo que puedo explicar la ventaja sobre el uso de DHCP, al menos para mi caso de uso. La situación es ciertamente inusual. Tengo un servidor que se mueve de un lado a otro entre dos redes cada dos semanas. Tiene unos 10 invitados. Una de las redes tiene un servidor DHCP (que es difícil de controlar para mí), la otra no. Eso prácticamente descarta el uso de DHCP. Estoy buscando una manera de cambiar la IP del host y actualizar automáticamente las direcciones IP de los invitados, etc., según eso (estoy usando chef para la automatización, así que una vez que se configuran las direcciones IP, estoy listo).
Kevin Keane
2
Puedo confirmar que los cambios no surten efecto sin destruir y reiniciar la red. También descubrí, curiosamente, que tenía que apagar y luego iniciar la VM. Simplemente reiniciar dejó la interfaz en un estado roto.
orodbhen
Reiniciar la red no renueva los arrendamientos DHCP. Para esto, debe eliminar el archivo de estado de la red en / var / lib / libvirtd / dnsmasq
orodbhen
3

He podido hacer dnsmasq'ver' el mapeo IP-MAC recién agregado simplemente enviando una -HUPseñal al dnsmasqproceso. Después de eso, reiniciar el nuevo invitado fue suficiente para tener asignada la IP correcta, sin la necesidad de reiniciar libvirtdni la propia red.

La documentación oficial de libvirt ( http://wiki.libvirt.org/page/Networking#Applying_modifications_to_the_network ) menciona este script no oficial de Perl que automatiza todo el proceso: https://gist.github.com/bendiken/032ea1bddb9ffafe98b4

No he probado este script yo mismo, porque descubrí que el archivo hosts ya estaba actualizado y que solo enviaba la señal -HUP era suficiente.

El host ejecuta Debian 7.8 y las versiones de los paquetes son:

  • 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
fuente