корректное завершение работы libvirt виртуальных машин на завершении работы хоста

У меня есть установка Windows 8 на виртуальной машине KVM, работающей на моем хосте Ubuntu 15.04. Когда я выпускаю опцию завершения работы в virt-менеджере, или virsh shutdown windows, виртуальная машина чисто закрывается как ожидалось.

Предположительно, VM нужно позволить чисто закрыться, когда я закрыл или перезагружаю хост. Однако дело обстоит не так, и виртуальная машина резко останавливается.

1
задан 28 June 2015 в 11:50

1 ответ

Обновление по предложению:

По словам автора блога/вики:

Однако существует проблема, заключающаяся в том, что каждая виртуальная машина получает только один запрос на завершение работы. Для виртуальных машин Linux это обычно нормально, но виртуальные машины Windows иногда не реагируют на первый запрос, что приводит к принудительному уничтожению виртуальной машины по истечении времени ожидания. Единственный способ решить эту проблему — изменить сценарий выключения так, чтобы он снова и снова отправлял запросы на выключение, пока виртуальная машина не выключится или не истечет время ожидания.

Таким образом, решение состоит в том, чтобы исправить /usr/lib/libvirt/libvirt-guests.sh в Ubuntu 16.04 LTS (Xenial Xerus) (спасибо автору вики: Sebastian Marsching ):

--- /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.

0
ответ дан 1 September 2020 в 21:45

Другие вопросы по тегам:

Похожие вопросы: