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

wk.*_*wk. 3 libvirt qemu

我正在尝试向特定的虚拟主机添加固定地址,因此我关闭了虚拟机并使用了sudo virsh net-edit somenet. 添加行后

<host mac='52:54:00:26:61:22' name='virt.example.com' ip='192.168.111.111' />
Run Code Online (Sandbox Code Playgroud)

我保存并退出。然后我用相同的命令再次检查并恢复了以前的状态,我的更改消失了。

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

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

当我在更改后重新启动 libvirt-service 时,情况似乎相同:在配置文件中是我的更改,virsh我看到 vanilla 状态和虚拟机获取错误的 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>
Run Code Online (Sandbox Code Playgroud)

这是我看到的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>
Run Code Online (Sandbox Code Playgroud)

sci*_*rus 13

对网络所做的更改会在下次启动网络时发生。您需要执行这一系列操作。

virsh net-edit somenet
virsh net-destroy somenet
virsh net-start somenet
Run Code Online (Sandbox Code Playgroud)

要确认这一点,请参阅virsh net-edit 的功能

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

编辑:libvirt wiki描述了这种情况,还指出了一个用于重新建立网络连接的脚本。


wk.*_*wk. 9

我没有找到“为什么”,但我确实找到了让它工作的方法。所以,如果有人有同样的问题,解决方案是这样的:

  • 转储网络配置 virsh net-dumpxml /tmp/somenet.xml
  • 停止网络 virsh net-destroy somenet
  • 失活的网络 virsh net-undefine somenet
  • 做出了必要的改变 /tmp/somenet.xml
  • 再次创建网络 virsh net-create /tmp/somenet.xml
  • 尝试设置网络自动启动virsh net-autostart somenet,但失败error: Requested operation is not valid: cannot set autostart for transient network
  • 在 Thomas Schulte 的博客上找到帮助(德语)
  • 解决方案是再次编辑 conf 并进行一些无关紧要的更改virsh net-edit somenet,我只是添加了另一个空行。
  • 现在也virsh net-autostart somenet工作了

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

  • 哇,这奏效了。太疯狂了,这在 2019 年仍然是一个问题,应该报告为错误。 (2认同)

小智 4

任何时候使用virsh net-edit {{network}}它都需要您重新启动网络。因此,您必须执行以下命令:

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

然而

值得一提的是,每次执行此操作时,当前在其 VMS 上使用该虚拟网络的任何人都会在您重新启动网络时失去连接。

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

所以:

我建议使用virsh net-update. (来源)这可用于更新网络配置,而无需重新启动网络。具体来说,您似乎正在寻找该ip-dhcp-host功能。

例子:

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

希望这有帮助:)