主机关闭时 libvirt 虚拟机的正常关闭

主机关闭时 libvirt 虚拟机的正常关闭

我在 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 提供了解决方案。

相关内容