![主机关闭时 libvirt 虚拟机的正常关闭](https://linux22.com/image/1051123/%E4%B8%BB%E6%9C%BA%E5%85%B3%E9%97%AD%E6%97%B6%20libvirt%20%E8%99%9A%E6%8B%9F%E6%9C%BA%E7%9A%84%E6%AD%A3%E5%B8%B8%E5%85%B3%E9%97%AD.png)
我在 KVM 虚拟机上安装了 Windows 8,运行在我的 Ubuntu 15.04 主机上。当我在 virt-manager 中发出关机选项时,virsh shutdown windows
虚拟机会按预期正常关闭。
按理说,当我关闭或重启主机时,虚拟机应该可以正常关闭。然而事实并非如此,虚拟机突然停止了。
答案1
根据建议进行更新:
根据博客/维基作者的说法:
但是,存在一个问题,即每个虚拟机只会收到一个关机请求。对于 Linux 虚拟机来说,这通常没问题,但 Windows 虚拟机有时不会对第一个请求做出反应,导致虚拟机在超时后被强制终止。解决这个问题的唯一方法是修改关机脚本,使其不断发送关机请求,直到虚拟机关闭或达到超时。
因此解决方案是在 Ubuntu 16.04 LTS(Xenial Xerus)中打补丁/usr/lib/libvirt/libvirt-guests.sh
(感谢 wiki 作者:塞巴斯蒂安·马兴):
--- /usr/lib/libvirt/libvirt-guests.sh 2016-10-10 09:33:38.000000000 +0200
+++ /usr/local/lib/libvirt/libvirt-guests.sh 2016-11-08 11:58:33.000000000 +0100
@@ -339,6 +339,19 @@
retval run_virsh "$uri" shutdown "$guest" > /dev/null
}
+# shutdown_guest_retry URI GUEST
+# Start a ACPI shutdown of GUEST on URI. This function returns after the command
+# was issued to libvirt to allow parallel shutdown.
+# This command does the same as shutdown_guest_async, but does not print a
+# message.
+shutdown_guest_retry()
+{
+ uri=$1
+ guest=$2
+
+ retval run_virsh "$uri" shutdown "$guest" > /dev/null
+}
+
# guest_count GUEST_LIST
# Returns number of guests in GUEST_LIST
guest_count()
@@ -407,6 +420,14 @@
format=$(eval_gettext "Waiting for %d guests to shut down\n")
fi
while [ -n "$on_shutdown" ] || [ -n "$guests" ]; do
+ guests_retry=$on_shutdown
+ while [ -n "$guests_retry" ]; do
+ set -- $guests_retry
+ guest=$1
+ shift
+ guests_retry=$*
+ shutdown_guest_retry "$uri" "$guest"
+ done
while [ -n "$guests" ] &&
[ $(guest_count "$on_shutdown") -lt "$PARALLEL_SHUTDOWN" ]; do
set -- $guests
但是,当我检查 Ubuntu 20.04 的相同代码时,发现类似的逻辑已经存在。所以这不再是问题。
虽然答案有点晚了,但对于记录很有用:
这个帖子为 Ubuntu 提供了解决方案。