Linux KVM 如果客户机重新启动,它将无法启动,必须​​手动启动

Linux KVM 如果客户机重新启动,它将无法启动,必须​​手动启动

有一个运行 KVM 的 Ubuntu 服务器:

Linux hyperv 4.4.0-109-generic #132-Ubuntu SMP Tue Jan 9 19:52:39 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

它正在运行几个 Linux VM 和一个 Windows VM。在安装 Windows 2016 Server 的新 VM 后,出现问题。可以通过执行以下操作来启动 VM(称为 winstore):

virsh start winstore

一切正常。如果此特定虚拟机重新启动从虚拟机内部,它将干净地关闭,但是不是回来。跑步

virsh list

确认已不是已启动。要启动虚拟机,必须执行

virsh start winstore 

再次。这不是期望的行为,也不是其他 Windows VM 的行为方式(它们具有期望的行为,即在重新启动时它们会重新启动)。

VM 的创建方式与常规方式略有不同。以下是最初创建 VM 时使用的步骤:

创建磁盘映像

qemu-img create -f qcow2 -o preallocation=metadata /mnt/vmstorage/images/winstore.qcow2 1300G

获取我们要执行的操作的 xml 输出,以便我们可以修改 cdrom 属性

virt-install --name winstore --ram 8192 --vcpus=2 --graphics=vnc --network=bridge=br731,model=virtio --disk path=/mnt/vmstorage/images/winstore.qcow2,format=qcow2,bus=virtio,cache=none --disk path=/mnt/backups/isos/virtio-win-0.1.126.iso,device=cdrom --cdrom /mnt/backups/isos/SW_DVD9_Win_Server_STD_CORE_2016_64Bit_English_-4_DC_STD_MLF_X21-70526.ISO --os-type=windows --noautoconsole --accelerate --noapic --print-xml > winstore.xml

更改 xml 文件中 cdrom 的顺序:

<disk type="file" device="cdrom">
  <driver name="qemu" type="raw"/>
  <source file="/mnt/backups/isos/virtio-win-0.1.126.iso"/>
  <target dev="hda" bus="ide"/>
  <readonly/>
</disk>
<disk type="file" device="cdrom">
  <driver name="qemu" type="raw"/>
  <source file="/mnt/backups/isos/SW_DVD9_Win_Server_STD_CORE_2016_64Bit_English_-4_DC_STD_MLF_X21-70526.ISO"/>
  <target dev="hdb" bus="ide"/>
  <readonly/>

然后通过执行以下操作来安装并启动它:

virsh create ./winstore.xml 
virsh start winstore

安装后,编辑了 xml,并交换了两个驱动器 (hda/hdb),以便它将从磁盘而不是 cdrom 启动。然后在 virsh 中使用以下内容定义 VM:

virsh define ./winstore.xml

再次,虚拟机现在似乎工作正常,但它只启动

virsh start winstore

再次,如果VM 从客户机内部重新启动,它不会重新启动,只会关闭。查看 /var/log/libvirt/qemu/winstore.log 中的日志,似乎没有任何异常。

请注意,VM 出现在

virsh list --all

是的,我绝对、肯定地确定我没有单击 Windows VM 中的“关机”。:)

答案1

根据上述 Michael Hampton 的评论,xml 中的<on_reboot>节点为“destroy”而不是“restart”。

答案2

正如 @Michael Hampton 和 @number9 所建议的,关键在于virsh edit your_VM以下内容:

  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>

附注:需要重新启动虚拟机才能使更改生效。

使用时virt-install,您可以通过添加到 virt-install 命令来指定事件--events=on_reboot=restart,on_poweroff=restart,on_crash=restart。请记住,首次启动时,on_reboot仍将被销毁。

更一般地讲,您可以使用 libvirt-guest 配置您的机器,以便与主机一起正确启动和关闭。在 CentOS 上,您可以进行/etc/sysconfig/libvirt-guests如下配置:

ON_BOOT=start # Start the machines with the host
ON_SHUTDOWN=shutdown # Properly shutdown machines with host
PARALLEL_SHUTDOWN=2 # Don't shutdown all machines at the same time, do it 2 by 2 (or else depending on your host and the number of VM)
SHUTDOWN_TIMEOUT=600 # Allow a 10 minutes grace period for machines to shutdown properly before destroying them
SYNC_TIME=1 # Sync time with host (useful for suspended machines)

配置完成后,你可以使用以下命令启用 libvirt-guests

systemctl enable --now libvirt-guests

SYNC_TIME=1需要安装来宾工具。您可以检查同步是否正常工作,virsh qemu-agent-command vm_name'{"execute":"guest-set-time"}'然后应该返回{"return":{}}

相关内容