Как запустить виртуальную машину при загрузке и завершить работу на остановке VM?

Если вы установите обновление ядра, вам придется перекомпилировать модули ядра Virtual Box, чтобы он работал после загрузки с новым ядром. Вы не могли установить какие-либо новые обновления ядра.

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

1
задан 10 November 2014 в 19:55

2 ответа

Я бы пошел с комбинацией задания cron и использования vboxmanage через скрипты bash.

У меня был бы скрипт bash, который запускал бы виртуальные машины и запускал cron-задание для проверки статус машин.

Скрипт должен выглядеть примерно так:

#!/bin/bash

vboxmanage startvm "Server App VM name"
vboxmanage startvm "Windows XP VM name"
crontab ~/check_vms_and_shutdown_job.txt

Предположим, мы сохраним его как start_vms_and_cronjob.sh. Запомните chmod +x, поэтому он может быть фактически выполнен.

Вы можете задаться вопросом о файле check_vms_and_shutdown_job.txt. Это текстовый файл, содержащий информацию о задании, которое должно выполняться через определенные промежутки времени. В этом примере мы поместили его в домашнюю папку пользователя, и он должен прочитать:

*/5 * * * * ~/check_vms_and_shutdown.sh

Этот файл должен иметь новую строку в конце строки (нажмите Enter перед сохранением;)) Какой этот файл что он описывает задание cron, которое запускается каждые 5 минут, и оно выполняет скрипт bash.

Теперь, что вы можете спросить? Ну, вот и все. Он должен сказать:

#!/bin/bash

if vboxmanage list runningvms | grep "Windows XP VM name"
then
    echo "Windows XP still running."
else
    echo "Windows XP shut down. Shutting down the rest."
    vboxmanage controlvm "Server App VM name" savestate
    crontab -r 
    shutdown -h now
fi

Теперь, что он делает, что он проверит, есть ли виртуальная машина XP. Если это не так, он затем прикажет виртуальной машине приложения сервера сохранить его состояние. После этого cronjob будет удален и система выключится. Не забудьте chmod +x, и здесь мы также разместили файл в домашней папке пользователя.

Для удобства и лучшего использования с этой целью вы также можете запускать виртуальные боксы cron и иметь

Теперь добавьте start_vms_and_cronjob.sh в свои приложения для запуска, и вы должны быть установлены.

Итак, что мы имеем здесь:

Когда система запускается, виртуальные машины запускаются сценарием оболочки, а новое задание cron (запуск сценария оболочки) создается из txt-файла правила работы cron. Через каждые 5 минут задание cron запускает скрипт, который проверяет, продолжает ли виртуальная машина XP, и если она не сохранит другую виртуальную машину, удалите задание cron и выключите систему.

Надеюсь, это поможет вам настроить именно то, что вам нужно.

3
ответ дан 24 May 2018 в 02:00
  • 1
    Интересен cronjob. Однако что, если что-то произойдет, и компьютер отключится до того, как запланирован сценарий check_vms_and_shutdown.sh? (т. е. сотрудник вручную отключает компьютер перед его выполнением). Затем он добавит check_vms_and_shutdown.sh снова при следующей загрузке? – Yanick Rochon 11 November 2014 в 18:29

Это шаги для достижения намеченных задач. Гость VM с серверным приложением будет называться «ServerApp», Windows-машина «WindowsXP» ниже. Замените их своими настоящими именами.

Метод ниже предусматривает создание пользовательского Xsession на главной машине. Это имеет то преимущество, что мы можем разделить этот сеанс только на загрузку приложений, которые нам нужны для запуска наших виртуальных машин (для этого нам, вероятно, не нужен полноценный рабочий стол). Кроме того, использование методов ожидания, встроенных в VirtualBox, не потребует дополнительных циклов для вызова состояний VM.

Создайте пользователя для запуска виртуальной машины. Установите гостевые дополнения в гостевой режим. Переключитесь на полноэкранный режим с помощью хоста + F во время работы виртуальной машины. Определите пользовательский сеанс Lubuntu на хосте: создайте файл в /usr/share/xsessions и назовите его, например. WindowsVM.desktop со следующим содержимым:
[Desktop Entry]
Name=WindowsXP # or any other sensible name
Comment=Custom Xsession running a VM 
Exec=/etc/X11/Xsession
Сделать этот файл исполняемым. Этот сеанс вызовет ~/.xsession при входе в систему. Создайте сценарий запуска исполняемого сеанса с именем ~/.xsession в домашнем ДОМЕ ДОМЕНА пользователя:
#! /bin/bash

/usr/bin/lxsession -s Lubuntu LXDE &
VBoxManage startvm "ServerApp" --type headless
VBoxManage startvm "WindowsXP"
VBoxManage guestproperty set RUNNING 1 --flags TRANSIENT
VBoxManage guestproperty wait "WindowsXP" RUNNING
VBoxManage controlvm "SeverApp" savestate
dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
Выберите пользовательский сеанс в 4. при входе в систему.

Сложный бит заключается в том, чтобы получить гостевую собственность RUNNING (или любое другое имя, которое мы выбираем), удаленное с виртуальной машины, поскольку оно не так кратковременно, как предлагают спецификации. К сожалению, он выживет при выключении / отключении виртуальной машины.

Поэтому мы должны добавить следующую команду, используя VBoxcontrol.exe (установленную с гостевыми дополнениями) в гостевую Windows в конце своей процедуры отключения (или из сценария выключения, который мы там помещаем):

VBoxControl.exe guestproperty set RUNNING

Это приведет к завершению состояния wait, чтобы продолжить сохранение «ServerAPP», а затем отключить хост.

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

VBoxManage --nologo guestcontrol "WindowsXP" execute --image "C:\\full\\path\\to\\program.exe" --username <windowsuser> --password <password> --wait-exit --wait-stdout

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

Команды скрипта на шаге 5. объяснили:

/usr/bin/lxsession -s Lubuntu LXDE запускает сеанс Lubuntu (замените любым другим настроенным Xsession, если применимо) VBoxManage startvm "ServerApp --type headless" запускает виртуальную машину, на которой запущено серверное приложение в режиме безглавых (т.е. нет отображения). VBoxManage startvm "WindowsXP" запускает виртуальную машину под управлением Windows (полноэкранный режим или любое другое разрешение, определенное в последнем прогоне) VBoxManage guestproperty set "WindowsXP" RUNNING 1 --flags TRANSIENT устанавливает свойство RUNNING для машины Windows, которая может управляться с гостевой ОС VBoxManage guestproperty wait "WindowsXP" RUNNING, ожидает, что свойство RUNNING будет удалено из гостевой Windows VBoxManage controlvm "SeverApp" savestate, завершает работу виртуальной машины приложения VM в savestate dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" \ /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop завершает хост Lubuntu (состояние выключения) без взаимодействия с пользователем.
3
ответ дан 24 May 2018 в 02:00
  • 1
    Очень подробный ответ! Спасибо, я начну оттуда! Но, из того, что я могу читать, это выглядит хорошо для меня. Я добавлю VBoxControl.exe guestproperty set RUNNING в качестве запланированной задачи Windows (при выключении) в качестве администратора. Что касается шага 5, я не очень много играл с LXDE, и машина уже настроена для автоматического входа в систему. Кроме этого, спасибо! – Yanick Rochon 2 March 2015 в 22:54
  • 2
    @YanickRochon: по крайней мере кто-то заметил;) Я был бы рад услышать о вашем прогрессе в этом. – Takkat 2 March 2015 в 23:13

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

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