我想做的是从主机系统设置客户机的网络配置(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