为什么我无法使用 virsh 保存网络更改?

为什么我无法使用 virsh 保存网络更改?

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

<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 时,情况似乎相同:配置文件中是我的更改,virsh我看到原始状态并且虚拟机获取了错误的 IP。

这里有什么问题?

编辑。在此处添加完整的 XML。下面是我看到的配置/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>

以下是我看到的配置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>

答案1

每次使用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

希望这对你有帮助:)

答案2

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

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

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

请注意,重新启动网络将终止使用此网络的任何虚拟机的网络连接。当您再次启动网络时,它们将无法重新获得连接;您必须重新启动域或使用以下命令手动将虚拟机接口移动到新网桥 控制寄存器

編輯:libvirt 维基百科描述了这种情况并指出了用于重新建立网络连接的脚本。

答案3

我没有找到“原因”,但我确实找到了让它工作的方法。所以,如果有人遇到同样的问题,解决方案如下:

  • 转储网络配置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!

答案4

我遇到了类似的问题,虚拟机实例的网络参数几个月前就发生了变化。今天我重新启动了整个 12 台虚拟机环境,但这个实例却无法启动。底层硬件已被重新定义,因此不可能恢复旧值。使用 virsh edit 没有帮助:旧参数一直被报告并用于启动。

我发现在重启过程中,/var/lib/libvirt/qemu/save/.save 下的暂停映像仍嵌入了错误的参数。删除该文件后,虚拟机便恢复运行。

唯一的副作用是虚拟机无法恢复(其余同类虚拟机都恢复了),但必须进行完全启动,而且这个过程可能不太干净;幸运的是,这是一台小型服务器,可以承受得起。此后,它又恢复了在线状态并正常工作。

相关内容