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

4

Короче говоря ...

Мне пришлось установить небольшое серверное приложение, работающее в виртуальной машине на одном из компьютеров этой компании. Оба компьютера работают под управлением Windows XP (с устаревшим программным обеспечением, поэтому обновление невозможно), а покупка дополнительного ПК на данный момент ограничена. Итак, я конвертировал Windows на одном из них в виртуальную машину и установил Lubuntu. Затем импортируется серверное приложение, и все работает нормально; все почти прозрачно для пользователя, за исключением процессов запуска и снятия.

Проблема

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

Требования

  1. Lubuntu должен настроить пользователя для входа в систему при запуске - > сделано!
  2. Виртуальная виртуальная машина сервера должна начинаться с входа в систему - > неуверены
  3. Виртуальная машина Windows XP должна запускаться при входе в систему - > неуверены
  4. Виртуальная виртуальная машина сервера должна сохранять состояние и автоматически закрываться при завершении работы машины Windows XP - > не знаю
  5. Lubuntu должен завершить работу, когда все виртуальные машины приостановлены / закрыты. - > не знаю

Система работает на Lubuntu 14.04 с VirtualBox 4.3.x.

    
задан Yanick Rochon 10.11.2014 в 15:27
источник

3 ответа

3

Вы можете настроить сценарий Init.d / Systemd, подобный этому:

#! /bin/sh
# /etc/init.d/vbox

#Edit these variables! VMUSER=VMAdmin VMNAME="cdb62186-7c30-4c25-a0b0-e4a32cfb0504" BASEFOLDER=/home/VMAdmin/path/to/backups/

case "$1" in
    start)
        echo "Starting VirtualBox VM..."
        sudo -H -u $VMUSER VBoxManage startvm "$VMNAME" --type headless
        ;;
    reset)
        echo "Resetting VirtualBox VM..."
        sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" reset
        ;;
    stop)
        echo "Saving state of Virtualbox VM..."
        sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" savestate
        ;;
    shutdown)
        echo "Shutting down Virtualbox VM..."
        sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" acpipowerbutton
        ;;
    status)
        sudo -H -u $VMUSER VBoxManage list vms -l | grep -e ^"$VMNAME": -e ^State | sed s/\ \ //g | cut -d: -f2-
        ;;
    backup)
        echo ""
        sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" acpipowerbutton

        echo "Waiting for VM "$VMNAME" to poweroff..."
        until $(sudo -H -u $VMUSER VBoxManage showvminfo --machinereadable "$VMNAME" | grep -q ^VMState=.poweroff.)
        do
          sleep 1
        done

        FILENAME=$(date +"%Y_%m_%d-%T")
        echo "Backing up Virtualbox VM to '$BASEFOLDER$FILENAME'..."
        sudo -H -u $VMUSER VBoxManage clonevm "$VMNAME" --options keepallmacs --name $FILENAME --basefolder $BASEFOLDER

        echo "Restarting VirtualBox VM..."
        sudo -H -u $VMUSER VBoxManage startvm "$VMNAME" --type headless
        echo ""
        ;;
    *)
        echo "Usage: sudo service vbox {start|stop|status|shutdown|reset|backup}"
        exit 1
        ;; esac

exit 0

Обратите внимание, что я получил этот скрипт отсюда: Ссылка

Пожалуйста, проверьте команды до установки скрипта, а затем проверьте каждую функциональность. Вам нужно будет поместить его в каталог /etc/init.d и запустить chmod +x для его запуска. Затем пройдите и проверьте его функциональность. После выполнения выполните:

sudo update-rc.d vbox defaults 99 01

Это приведет к запуску системы. У исходного сообщения есть несколько шагов для работы cron, как FYI. Если кто-то знает более современный способ сделать это, не стесняйтесь редактировать этот пост или публиковать другой ответ.     

ответ дан Geary Shull 11.11.2014 в 20:36
источник
3

Я бы пошел с комбинацией задания 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 it, поэтому его можно выполнить на самом деле.

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

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

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

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

#!/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 , и здесь мы также разместили файл в домашней папке пользователя.

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

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

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

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

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

ответ дан Ahti Komu 11.11.2014 в 03:28
3

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

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

  1. Создайте пользователя для запуска виртуальной машины.
  2. Установите гостевые дополнения к гостю
  3. Переключитесь на полноэкранный режим с помощью Host + F во время работы виртуальной машины.
  4. Определите пользовательский сеанс 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 при входе в систему.

  5. Создайте сценарий запуска исполняемого сеанса с именем ~/.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
    
  6. Выберите пользовательский сеанс в 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

Обратитесь к Руководству по VirtualBox за ограничениями и более подробную информацию о том, как настроить это для учетной записи без пароля в 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 (состояние выключения) без взаимодействия с пользователем.

ответ дан Takkat 11.11.2014 в 20:20