有一个运行 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":{}}