KVM / libvirt: comment configurer des adresses IP d'invités statiques sur l'hôte de virtualisation

31

Ce que je voudrais faire, c'est définir la configuration réseau des invités (adresse IP, sous-réseau, passerelle, adresse de diffusion) à partir du système hôte. La configuration réseau utilisée est en bridgemode. Comment puis-je configurer le réseau à partir de l'hôte plutôt que de configurer le client lui-même sur une configuration réseau statique?

Si j'exécute:

virsh edit vm1

il y a aussi un <network>bloc et j'ai essayé de configurer l'interface réseau à partir de là, mais malheureusement la machine virtuelle invitée ne semble pas l'utiliser et en tant que telle est hors ligne sur le réseau (car elle utilise uniquement la configuration automatique du réseau) ... Les machines virtuelles sont toutes deux basées sur Linux et Windows. Toute aide serait très appréciée.

bêta
la source
2
La remise d'adresses IP via des baux DHCP réservés n'est-elle pas une option?
MadHatter prend en charge Monica
Hm je suppose que c'est le cas, mais je voudrais attribuer VM # 1 à IP # 1, VM # 2 à IP # 2, etc. (plutôt que de leur donner une IP aléatoire de mon bail). Pensez-vous qu'il serait possible de le configurer comme ceci avec DHCP? Si c'est le cas, je serais heureux d'essayer cette approche.
beta
2
Je suggère de renommer la question en quelque chose comme " KVM / libvirt: Comment configurer des adresses IP d'invités statiques sur l'hôte de virtualisation "
Nils Toedtmann
1
D'accord avec @NilsToedtmann, tout détail supplémentaire sur l'hyperviseur utilisé comme le système d'exploitation de base, etc. serait bénéfique. Il peut y avoir des outils de gestion supplémentaires basés sur le système d'exploitation pour aider à la configuration de la mise en réseau pour les systèmes virtualisés. Il existe d'excellents guides sur KVM et LXC à utiliser avec les systèmes d'exploitation basés sur SUSE qui peuvent utiliser YaST.
Matt

Réponses:

52

Si vous ne voulez pas faire de configuration à l'intérieur de l'invité, la seule option est un serveur DHCP qui distribue des adresses IP statiques. Si vous utilisez le bridgemode, ce sera probablement un serveur DHCP externe. Consultez son manuel pour savoir comment servir les baux statiques.

Mais au moins dans les modes avancés natou route, vous pouvez utiliser la fonction intégrée de libvirt dnsmasqd(les versions plus récentes de libvirtd prennent en charge l'option "dhcp-hostsfile" du dnsmasq). Voici comment:

Tout d'abord, recherchez les adresses MAC des machines virtuelles auxquelles vous souhaitez attribuer des adresses IP statiques:

virsh  dumpxml  $VM_NAME | grep 'mac address'

Puis éditez le réseau

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

Recherchez la <dhcp>section, limitez la plage dynamique et ajoutez des entrées d'hôte pour vos machines virtuelles

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

Ensuite, redémarrez votre machine virtuelle (ou redémarrez son client DHCP, par exemple ifdown eth0; ifup eth0)


Mise à jour: je constate qu'il y a des rapports selon lesquels la modification pourrait ne pas entrer en vigueur après "virsh net-edit". Dans ce cas, essayez ceci après la modification:

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

... et redémarrez le client DHCP de la VM.

Si cela ne fonctionne toujours pas, vous devrez peut-être

  • arrêtez le service libvirtd
  • tuer tous les processus dnsmasq encore en vie
  • démarrer le service libvirtd

Remarque: Il n'y a aucun moyen que l'hôte KVM puisse forcer une machine virtuelle avec un système d'exploitation inconnu et une configuration inconnue à utiliser une certaine configuration réseau. Mais si vous savez que la machine virtuelle utilise un certain protocole de configuration réseau - par exemple DHCP - vous pouvez l'utiliser. C'est ce que suppose ce post.

Certains systèmes d'exploitation (par exemple, certaines distributions Linux) permettent également de passer des options de configuration réseau à l'invité, par exemple via la ligne de commande du noyau. Mais c'est très spécifique à l'OS, et je ne vois aucun avantage sur la méthode DHCP.

Nils Toedtmann
la source
Merci, je vais l'essayer et faire rapport si je le fais fonctionner de cette façon.
beta
Cool. Mais vous devrez changer le mode réseau.
Nils Toedtmann
1
Je suis venu ici parce que j'ai un besoin similaire et je pense que je peux expliquer l'avantage par rapport à DHCP, au moins pour mon cas d'utilisation. La situation est certes inhabituelle. J'ai un serveur qui va et vient entre deux réseaux toutes les deux semaines. Il a environ 10 invités. L'un des réseaux a un serveur DHCP (qui est difficile à contrôler pour moi), l'autre non. Cela exclut à peu près l'utilisation de DHCP. Je cherche un moyen de changer l'adresse IP de l'hôte et de mettre à jour automatiquement les adresses IP des invités, etc. en fonction de cela (j'utilise chef pour l'automatisation, donc une fois les adresses IP configurées, je suis prêt à partir).
Kevin Keane
2
Je peux confirmer que les modifications ne prennent pas effet sans détruire et redémarrer le réseau. J'ai également constaté, étrangement, que je devais arrêter, puis démarrer la machine virtuelle. Le redémarrage simple a laissé l'interface dans un état cassé.
orodbhen
Le redémarrage du réseau ne renouvelle pas les baux DHCP. Pour cela, vous devez supprimer le fichier d'état du réseau dans / var / lib / libvirtd / dnsmasq
orodbhen
3

J'ai pu faire dnsmasq«voir» le mappage IP-MAC nouvellement ajouté en envoyant simplement un -HUPsignal au dnsmasqprocessus. Après cela, le redémarrage du nouvel invité était suffisant pour lui attribuer la bonne IP, sans avoir besoin de redémarrer libvirtdni le réseau lui-même.

La documentation officielle de libvirt ( http://wiki.libvirt.org/page/Networking#Applying_modifications_to_the_network ) mentionne ce script Perl non officiel qui automatise l'ensemble du processus: https://gist.github.com/bendiken/032ea1bddb9ffafe98b4

Je n'ai pas essayé ce script moi-même, car j'ai compris que le fichier hosts était déjà mis à jour et l'envoi du signal -HUP suffisait.

L'hôte exécute Debian 7.8 et les versions des packages sont:

  • 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
la source