KVM/libvirt:如何在虚拟化主机上配置静态客户机 IP 地址

KVM/libvirt:如何在虚拟化主机上配置静态客户机 IP 地址

我想做的是从主机系统设置客户机的网络配置(IP 地址、子网、网关、广播地址)。使用的网络设置处于bridge模式。如何从主机配置网络,而不是将客户端本身配置为静态网络配置?

如果我执行:

virsh edit vm1

还有一个<network>块,我尝试从那里配置网络接口,但不幸的是,客户虚拟机似乎没有使用它,因此处于离线状态(因为它只使用自动网络配置)... 客户虚拟机既基于 Linux,又基于 Windows。任何帮助都将不胜感激。

答案1

如果您不想在客户机内部进行任何配置,那么唯一的选择就是提供静态 IP 地址的 DHCP 服务器。如果您使用bridge模式,那可能是某个外部 DHCP 服务器。请参阅其手册以了解如何提供静态租约。

但至少在正向模式nat或 下route,您可以使用 libvirt 的内置功能dnsmasqd(较新版本的 libvirtd 支持 dnsmasq 的“dhcp-hostsfile”选项)。操作方法如下:

首先,找出要分配静态 IP 地址的虚拟机的 MAC 地址:

virsh  dumpxml  $VM_NAME | grep 'mac address'

然后编辑网络

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

找到该<dhcp>部分,限制动态范围并为您的虚拟机添加主机条目

<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.13"/>
</dhcp>

然后,重新启动虚拟机(或重新启动其 DHCP 客户端,例如ifdown eth0; ifup eth0


更新:我看到有报告称更改在“virsh net-edit”之后可能无法生效。在这种情况下,请在编辑后尝试以下操作:

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

...并重新启动 VM 的 DHCP 客户端。

如果这仍然不起作用,你可能需要

  • 停止 libvirtd 服务
  • 终止所有仍处于活动状态的 dnsmasq 进程
  • 启动 libvirtd 服务

注意:KVM 主机无法强制具有未知操作系统和未知配置的 VM 使用特定的网络配置。但如果知道 VM 使用特定的网络配置协议(例如 DHCP),您可以使用它。这是本文的假设。

一些操作系统(例如某些 Linux 发行版)还允许将网络配置选项传递到客户机,例如通过内核命令行。但这是特定于操作系统的,我认为它与 DHCP 方法相比并无优势。

答案2

virsh net-update对你来说是一个很好的命令(你不需要重新启动/破坏你的网络等)
请参阅: https://www.redhat.com/archives/libvir-list/2012-September/msg01380.html

答案3

dnsmasq我只需-HUP向进程发送信号,就能“看到”新添加的 IP-MAC 映射dnsmasq。之后,重新启动新客户机就足以为其分配正确的 IP,而无需重新启动libvirtd或重新启动网络本身。

官方 libvirt 文档(http://wiki.libvirt.org/page/Networking#Applying_modifications_to_the_network) 提到了这个可以自动执行整个过程的非官方 Perl 脚本: https://gist.github.com/bendiken/032ea1bddb9ffafe98b4

我自己还没有尝试过这个脚本,因为我发现 hostsfile 已经更新,只需发送 -HUP 信号就足够了。

主机运行的是 Debian 7.8,软件包版本如下:

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

相关内容