VirtualBox Windows мягкое выключение гостей на выключение хоста

Я пытаюсь найти решение для корректного завершения работы любых гостевых виртуальных машин, работающих под VirtualBox Windows, когда главный компьютер выключен или перезапущен.

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

есть ли у кого-нибудь надежное решение этой (казалось бы, основной) проблемы?

2
задан Matt Jenkins
31.01.2023 11:08 Количество просмотров материала 3385
Распечатать страницу

6 ответов

У меня была похожая проблема и я решил ее, запустив VirtualBox как сервис:

http://vboxvmservice.sourceforge.net/

с VBoxVMService вы можете выбрать, как вы хотите, чтобы машина для выключения (сохранить состояние, выключение питания) и запуска. Так как он работает как служба, Windows будет автоматически ждать его завершения работы, в процессе завершения работы системы.

6
отвечен Bill Westrup 2023-02-01 18:56

к сожалению, это не представляется возможным для виртуальных машин, запущенных через VirtualBox GUI. Хотя интерфейс может перехватить событие завершения работы узла и реагировать, служба в VirtualBox увольняют: https://forums.virtualbox.org/viewtopic.php?p=278668#p278668

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

VirtualBox 5.0 вводит "съемный интерфейс" режим запуска. Этот режим запускает виртуальную машину без головы с отдельным процессом пользовательского интерфейса. Графическая производительность страдает, хотя и 3D ускорение не поддерживается. Но, возможно, это может быть объединено с VBoxHeadlessTray в будущем (VBoxHeadlessTray еще не поддерживает 5.0.) Ссылки на VBoxHeadlessTray репозиторий GitHub и тегом GitHub запрос на добавление VirtualBox 5 поддержка.

Edit: VBoxVmService также не поддерживает новый съемный режим с версии 5.0. Только безголовый до сих пор. Я добавил запрос для этого.

3
отвечен Leo B 2023-02-01 21:13

Извините, я опоздал на вечеринку. Существует точный ответ на это, хотя он требует некоторой командной строки-foo. Смотри эту ветку пост для получения дополнительной информации: https://forums.virtualbox.org/viewtopic.php?f=6&t=53684#p285540

команда, которую вы ищете:

"C:\Program Файлы\Оракул\В VirtualBox VBoxManage\.exe "setextradata" имя виртуальной машины " GUI / DefaultCloseAction Shutdown

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

3
отвечен Kris Bahnsen 2023-02-01 23:30

у меня есть 3 пакетных скрипта, которые я использую вместо кнопок питания startmenu.

do_shutdown.летучая мышь (выключение ПК с 10 периода ожидания сек, чтобы не дать 10 ВМ сек время сэйва, но позвольте мне отменить выключение в течение 10 секунд. Отсчет времени начинается после выключения виртуальной машины)

"C:\VirtualBox\VBoxManage.exe" controlvm "Ubuntu Server" savestate
"C:\VirtualBox\VBoxManage.exe" controlvm "Ubuntu Minimal" savestate
shutdown /s /t 10

do_reboot.летучая мышь (перезагружается сразу после закрытия виртуальной машины вниз)

"C:\VirtualBox\VBoxManage.exe" controlvm "Ubuntu Server" savestate
"C:\VirtualBox\VBoxManage.exe" controlvm "Ubuntu Minimal" savestate
shutdown /r /t 0

do_cancel.летучая мышь (позволяет мне отменить выключение ПК в течение 10-секундного периода ожидания. Это перезагрузит виртуальную машину снова, так как они закрыли с do_shutdown.летучая мышь)

shutdown /a
C:\VirtualBox\VBoxManage.exe startvm "Ubuntu Minimal" --type headless
C:\VirtualBox\VBoxManage.exe startvm "Ubuntu Server" --type headless

вместо savestate вы также можете использовать один из следующих

poweroff        - pulls the plug
                  (probably not a good idea...)

acpipowerbutton - presses the power off button for a clean shutdown
                  ("The system is going down for power off NOW!" to all consoles)

acpisleepbutton - tells the os to go to sleep
                  (probably just as bad as poweroff)
1
отвечен Daniel F 2023-02-02 01:47

у меня был подобный вопрос и нашел эту страницу. Я не хочу запускать VirtualBox как службу, потому что у меня много виртуальных машин для тестирования и обычно выбираю разные для запуска в пользовательском интерфейсе VirtualBox. Когда я выключаю компьютер, раздражает вручную сохранять состояние каждой виртуальной машины. Использование скриптов для сохранения всех запущенных виртуальных машин в данном случае представляется практичным решением. Чтобы сделать ответ Daniel F более общим, я написал эти сценарии, которые автоматически сохраняют состояние всех работающих виртуальных машин без называя их явно.

saveRunningVMs.летучая мышь для Windows:

set VBoxManageEXE="%ProgramFiles%\Oracle\VirtualBox\VBoxManage.exe"
set ListRunningVMS=%VboxManageEXE% list runningvms
for /f tokens^=2^,4^ delims^=^" %%p in ('%ListRunningVMS%') do %VBoxManageEXE% controlvm %%p savestate

echo all vms saved, you can shutdown now.

rem shutdown /s /t 10

saveRunningVMs.sh для Linux:

#!/bin/bash
vboxmanage list runningvms | while read line; do
  #echo "VBoxManage controlvm $uuid savestate;"
  echo $line
  if [[ $line =~ \{(.*)\} ]]
  then
    vboxmanage controlvm ${BASH_REMATCH[1]} savestate
  fi
done
1
отвечен Karl Wolfram 2023-02-02 04:04

Я создал скрипт python, который приостанавливает работу всех виртуальных машин VirtualBox, а затем настраивает систему на запуск сценария при выходе из системы в качестве запланированной задачи.

Я не знаю, насколько надежен этот метод точно. как отметили другие существуют ограничения на то, как долго система будет ждать завершения задачи Winlogon 7002. Но я лично не было никаких проблем с этим давая полезная спасти Штаты даже с несколькими запущенными виртуальными машинами по 4+ ГБ общей ВМ ОПЕРАТИВНАЯ ПАМЯТЬ.

вот шаги, чтобы установить его:

  1. скачать и установить Python 2.7.X от python.org
  2. создайте файл сценария python где-нибудь в вашей системе с помощью блокнота или любого другого текстового редактора (см. ниже)
  3. Открыть Планировщик Задач
  4. выберите действие - > создать основную задачу... и с помощью мастера создайте задачу со следующими параметрами
    • имя вашего выбор
    • запуск задачи при регистрации определенного события
    • Log: System
    • Источник: Winlogon
    • идентификатор события: 7002
    • запустить программу
    • рядом с Программы/Скрипта введите полный путь к вашей python.exe, например c:\Python27\python.exe
    • рядом с добавить аргументы, введите полный путь, где вы положили файл сценария python, например, я положил шахту в подпапке Моих документов папка, значит это C:\Users\rakslice\Documents\vboxsuspend\vboxsuspend.py
    • Выбрать Закончить.

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

скрипт python, чтобы сделать выключение ниже:

# A script to suspend all running VirtualBox VMs

import os

import subprocess

import sys


class VM(object):
    def __init__(self, name, uuid):
        self.name = name
        self.uuid = uuid

    def __repr__(self):
        return "VM(%r,%r)" % (self.name, self.uuid)


class VBoxRunner(object):
    def __init__(self):
        program_files = os.environ["ProgramW6432"]
        vbox_dir = os.path.join(program_files, "Oracle", "VirtualBox")
        self.vboxmanage_filename = os.path.join(vbox_dir, "VBoxManage.exe")

    def vbox_run(self, *args):
        subprocess.check_call([self.vboxmanage_filename] + list(args))

    def vbox_run_output(self, *args):
        return subprocess.check_output([self.vboxmanage_filename] + list(args))

    def list(self, running=True):
        if running:
            list_cmd = "runningvms"
        else:
            list_cmd = "vms"

        return [self.parse_vm_list_entry(x) for x in self.vbox_run_output("list", list_cmd).strip().split("\n")]

    def suspend_all(self):
        success = True
        stopped_some_vms = False
        vms = self.list(running=True)
        for vm in vms:
            if vm is None:
                continue
            # noinspection PyBroadException
            try:
                self.suspend_vm(vm)
            except:
                success = False
            else:
                stopped_some_vms = True
        if not stopped_some_vms:
            self.message("No running vms")
        return success

    @staticmethod
    def parse_vm_list_entry(x):
        """:type x: str"""
        if not x.startswith('"'):
            return None
        end_pos = x.find('"', 1)
        if end_pos == -1:
            return None
        name = x[1:end_pos]
        assert x[end_pos + 1: end_pos + 3] == " {"
        assert x.endswith("}")
        uuid = x[end_pos + 2:]

        return VM(name, uuid)

    @staticmethod
    def message(msg):
        print >>sys.stderr, msg

    def suspend_vm(self, vm):
        assert isinstance(vm, VM)
        self.vbox_run("controlvm", vm.uuid, "savestate")


def main():
    vr = VBoxRunner()
    success = vr.suspend_all()
    if not success:
        sys.exit(1)


if __name__ == "__main__":
    main()
0
отвечен rakslice 2023-02-02 06:21

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя

Похожие вопросы про тегам:

shutdown
virtual-machine
virtualbox
virtualization
windows
Вверх