为什么我不能用virsh保存networking更改?

我想添加固定地址到特定的虚拟主机,因此我closures了虚拟机,并使用sudo virsh net-edit somenet 。 join行后

 <host mac='52:54:00:26:61:22' name='virt.example.com' ip='192.168.111.111' /> 

我保存并退出。 然后我用同样的命令再次检查,之前的状态恢复了,我的更改没有了。

同时,当我查看/etc/libvirt/qemu/networks/somenet.xml ,我的更改已被应用。

如果我再次启动我的虚拟机,它将从DHCP池( 192.168.111.170 )获得IP,但不是我上面定义的地址。

当我改变后重新启动libvirt-service,情况似乎是一样的:在configuration文件中是我的变化,与virsh我看到香草状态和虚拟机得到错误的IP。

这里有什么问题?

编辑。 在这里添加完整的XML。 这里是conf我看到/etc下面:

 <network> <name>somenet</name> <uuid>80d85710-23bb-1ab6-79e6-cd65c6739714</uuid> <bridge name='virbr1' stp='on' delay='0' /> <mac address='52:54:00:90:75:1A'/> <domain name='example.com'/> <ip address='192.168.111.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.111.100' end='192.168.111.254' /> <host mac='52:54:00:26:61:22' name='virt.example.com' ip='192.168.111.111' /> </dhcp> </ip> </network> 

这里是conf我看到与virsh

 <network> <name>somenet</name> <uuid>80d85710-23bb-1ab6-79e6-cd65c6739714</uuid> <bridge name='virbr1' stp='on' delay='0' /> <mac address='52:54:00:90:75:1A'/> <ip address='192.168.111.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.111.128' end='192.168.111.254' /> </dhcp> </ip> </network> 

在networking下次启动时,对networking进行更改。 你需要执行这一系列的操作。

 virsh net-edit somenet virsh net-destroy somenet virsh net-start somenet 

为了确认这一点,请参阅virsh net-edit的function

请注意,像这样重新启动networking将终止使用此networking的任何虚拟机的networking连接。 当您再次启动networking时,他们不会重新获得连接; 您必须重新启动域或手动将虚拟机接口移动到brctl的新桥

编辑: libvirt维基描述了这种情况,也指向一个脚本来重新build立networking连接。

我没有find“为什么”,但我find了解决问题的方法。 所以,如果有人有同样的问题,解决scheme是这样的:

  • 使用virsh net-dumpxml /tmp/somenet.xml转储networkingconfiguration
  • 停止networkingvirsh net-destroy somenet
  • 未激活的networkingvirsh net-undefine somenet
  • /tmp/somenet.xml做了必要的修改
  • 再次创buildnetworkingvirsh net-create /tmp/somenet.xml
  • 尝试设置networkingautostarting virsh net-autostart somenet ,但失败, error: Requested operation is not valid: cannot set autostart for transient network
  • 在Thomas Schulte 博客上find帮助(德文)
  • 解决scheme是再次编辑conf,并做出一些virsh net-edit somenet更改virsh net-edit somenet ,我刚刚添加了另一个空行。
  • 现在virsh net-autostart somenet也是如此

最后,我的虚拟主机得到正确的IP!

问题是要创build一个持久的networking,你需要:

  1. 用你喜欢的编辑器创build你的networking的XML定义
  2. sudo virsh net-define <XML file>
  3. sudo virsh net-start <net name>
  4. sudo virsh net-autostart <net name>

错误是使用net-create而不是net-define。

任何时候你使用virsh net-edit {{network}}它将需要你重新启动networking。 因此你将不得不执行命令:

virsh net-edit {{network}} virsh net-destroy {{network}} virsh net-start {{network}}

然而

重要的是要提到,每当你这样做时,任何当前在其VMS上使用该虚拟networking的人都将在重新启动networking时松动连接。

这不会超过几秒钟,但取决于您通过DHCP主机添加静态IP的频率,这可能会给您的用户带来不便。

因此:

我会build议使用virsh net-update 。 ( 来源 )这可以用来更新networkingconfiguration,而不必重新启动networking。 具体来说,看来你正在寻找ip-dhcp-hostfunction。

例:

virsh net-update default add ip-dhcp-host \ "<host mac='52:54:00:00:00:01' \ name='bob' ip='192.168.122.45' />" \ --live --config

希望这是有帮助的:)

我有一个类似的问题,一个虚拟机实例的networking参数在几个月前已经改变。 今天我重新启动了整个12-VMs环境,这个实例不想启动。 底层的硬件已经被重新定义,因此恢复旧的价值是没有问题的。 使用virsh编辑没有帮助:旧的参数不断报告和用于启动。

我发现在重启过程中,/var/lib/libvirt/qemu/save/.save下的挂起的映像仍然embedded了错误的参数。 删除文件允许虚拟机恢复生机。

唯一的副作用是虚拟机没有恢复(就像其余的兄弟姐妹一样),但必须做一个完整的启动,可能这个过程不是很干净, 幸运的是,这是一个servlets器,可以负担得起。 在此之后,它重新上线并正常工作。