我正在使用 libvirt 和 kvm 来虚拟化我的服务器。我配置了 libvirt 在 bridge-network-interface 上启动一个 dhcp-server,以便为虚拟机提供它们的 ip。每个虚拟机都会根据其 mac 获得相同的 ip,配置如下:
<dhcp>
<range start='10.1.1.2' end='10.1.1.254' />
<host mac='54:52:00:21:01:ba' name='virstvm' ip='10.1.1.10' />
<host mac='00:16:36:2d:71:f9' name='secvm' ip='10.1.1.20' />
</dhcp>
问题:每当我向 dhcp 部分添加新主机时,我都必须重新启动 libvirt-bin,从而重新启动我的所有虚拟机。这不可能是解决方案,因为这意味着每次添加新服务器时都会停机。有解决方案吗?
答案1
添加的网络更新virsh 中的命令应该允许 dhcp-host 更新而无需重新启动虚拟网络(我还没有测试过)。
人 virsh:
net-update 网络命令部分 xml [--parent-index index] [[--live] [--config] | [--current]]
更新现有网络定义的给定部分,更改可选择立即生效,而无需破坏并重新启动网络。
命令是“add-first”、“add-last”、“add”(add-last 的同义词)、“delete”或“modify”之一。
section 是“bridge”、“domain”、“ip”、“ip-dhcp-host”、“ip-dhcp-range”、“forward”、“forward-interface”、“forward-pf”、“portgroup”、“dns-host”、“dns-txt”或“dns-srv”之一,每个部分都由导致元素被更改的 xml 元素层次结构的串联命名。例如,“ip-dhcp-host”将更改网络元素内的元素
<host>
中包含的元素。<dhcp>
<ip>
xml 是被更改类型的完整 xml 元素的文本(例如“<host mac="00:11:22:33:44:55' ip='1.2.3.4'/>”,或者是包含完整 xml 元素的文件的名称。通过查看所提供文本的第一个字符来消除歧义 - 如果第一个字符是“<”,则它就是 xml 文本,如果第一个字符不是“<”,则它就是包含要使用的 xml 文本的文件的名称。
--parent-index 选项用于指定请求的元素位于多个父元素中的哪一个(从 0 开始)。例如,dhcp
<host>
元素可能位于<ip>
网络中的多个元素中的任何一个中;如果没有提供父索引,<ip>
则将选择“最合适”的元素(通常是唯一一个已经拥有<dhcp>
元素的元素),但如果给出了 --parent-index,则该特定实例<ip>
将获得修改。如果指定了 --live,则会影响正在运行的网络。如果指定了 --config,则会影响持久网络的下一次启动。如果指定了 --current,则会影响当前网络状态。可以同时指定 --live 和 --config 标志,但 --current 是独有的。不指定任何标志与指定 --current 相同。
答案2
以下步骤对我而言适用于 Ubuntu 10.04.4 LTS 主机上的 libvirt 版本:0.7.5-5ubuntu27:
virsh net-dumpxml default > default.xml
$EDITOR default.xml
virsh net-destroy default
virsh net-define default.xml
virsh net-start default
这也适用于默认网络之外的其他网络。只需将示例中的单词 default 替换为网络名称即可。
答案3
@pefu 的解决方案也适用于 CentOS 6.4!
使用net-edit
不会virsh
更新 XML 文件,/var/lib/libvirt/network/default.xml
也不会改变正在运行的网络配置的状态。
即使重新启动后,重新运行net-edit
仍会显示编辑后的版本,但它只是没有加载!
将其导出为真正的 XML 文件,编辑并重新加载即可!
答案4
在邮件列表上讨论后我发现:目前这根本是不可能的!