Изящно отключил QEMU / KVM при отключении хоста

Я запускаю виртуальную машину QEMU / KVM Ubuntu 15.10 при загрузке и позволяю ей работать в фоновом режиме (как веб-сервер).

Что произойдет, если я закрою хост (также 15.10)? Убьет ли она виртуальную машину и приведет к виртуальному отключению питания или даже к худшему? Или это вызовет событие «нажатие кнопки с нажатой кнопкой» в виртуальной машине и дождитесь, когда оно будет отключено чисто?

Система гостевой системы настроена на правильное закрытие, когда такая кнопка включения питания, нажатие ". Обычно он выключается через 5-10 секунд.

Если поведение по умолчанию при завершении хоста - это убить виртуальную машину, как я могу изменить ее на чистое завершение работы гостевой системы и ждать, пока она не выключится?

1
задан 3 February 2016 в 18:19

1 ответ

Ниже представлен небольшой скрипт, который должен запускаться как запись автозапуска или вручную (если пользователь этого предпочитает). Основная идея заключается в следующем: сохранить сессионную шину dbus, и если мы получим перезагрузку или завершение работы или выйти из системы, то мы сможем проверить, работает ли QEMU; если это так, закройте диалоговое окно завершения работы, запустите команду для выключения виртуальных машин, а затем вызовите dbus для выключения или даже вызовите отдельный скрипт с помощью script-name.sh &

. Пример, приведенный ниже, был протестирован с помощью firefox для примера (поскольку у меня нет QEMU), но его можно легко адаптировать. Комментарии включены для руководства

#!/bin/bash

# You will need the DISPLAY variable, if you
# are running the script as an autostart entry
# DISPLAY=:0
dbus-monitor --session "interface='com.canonical.Unity.Session'" | \
  while read LINE;do \
  if grep -qi 'reboot\|shutdown\|logout' <<< "$LINE" ;then \
    # This part could be either pgrep , or 
    # VAR="$(virsh list --state-running --name)"
    # And then you can test whether or not variable is empty to see
    # if there are running processes
    PID="$(pgrep firefox)"
    if [ ! -z $PID  ]; then
      # This is where you can take action
      # For instance the qdbus lengthy command closes the End Session dialog
      # which effectively prevents user from clicking shutdown
      # You can append another command, such as
      # virsh shutdown VMNAME or run an external script that does it.
      # Since this script is constantly polling dbus-monitor, we need to avoid
      # it's better to call external , in my opinion.

      notify-send "GOTCHA $PID";
      qdbus com.canonical.Unity /org/gnome/SessionManager/EndSessionDialog \
      org.gnome.SessionManager.EndSessionDialog.Close
    # After the action part is done, one could call
    # dbus to shutdown
    # qdbus  com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.Shutdown 
    fi
  fi ;done
0
ответ дан 23 May 2018 в 13:47

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

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