Я должен был установить маленькое приложение для сервера, работающее в VM на одном из ПК этой компании. Оба компьютера выполняют Windows XP (с унаследованными программными обеспечениями, таким образом обновление не возможно), и покупка дополнительного ПК ограничена в данный момент. Так, я преобразовал Windows хоста на одном из них в VM и установил Lubuntu. Затем импортированный приложение для сервера и все хорошо работают; все почти очевидно для пользователя, за исключением запуска и подстрелило процессы.
Я задавался вопросом, как я мог запустить обоих VMs на запуске хоста, затем завершить работу ПК когда выстрелы Windows XP VM вниз? Прямо сейчас рабочие делают это вручную, но я хотел бы автоматизировать этот процесс.
Система работает на Lubuntu 14.04 с VirtualBox 4.3.x.
Вы могли настроить сценарий 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
Обратите внимание на то, что я получил тот сценарий отсюда: https://superuser.com/questions/789653/init-d-control-script-for-virtualbox-vm
проверьте команды в до установки сценария, затем протестируйте каждую функциональность. Необходимо будет поместить его в/etc/init.d каталог и работать chmod +x
на нем, чтобы заставить его работать. Тогда пройдите и протестируйте функциональность его. После того, как удовлетворенный, выполненный:
sudo update-rc.d vbox defaults 99 01
Это установит его для запуска с системы. Исходное сообщение имеет некоторые шаги для заданий крона, как к вашему сведению. Если кто-либо знает о более актуальном методе выполнения этого, не стесняйтесь редактировать это сообщение или отправлять другой ответ.
Я пошел бы с комбинацией крон задание и использование vboxmanage с помощью сценариев удара.
у меня был бы сценарий удара, который запустит виртуальные машины и разожжет задание крона для проверки состояния машин.
сценарий должен посмотреть что-то как:
#!/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 перед сохранением;)), Что делает этот файл, то, что он описывает задание крона, которое выполняется каждые 5 минут, и он выполняет сценарий удара.
Теперь, что такое этот 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
, и здесь мы также поместили файл в домашнюю папку пользователя.
Для удобства и лучшего использования на цели Вы могли бы также хотеть выполнить virtualboxes , бездисплейный и иметь их использование быть сделанными через удаленный дисплей.
Теперь добавляют start_vms_and_cronjob.sh
в Ваши приложения запуска, и Вы должны быть установлены.
Поэтому, что мы имеем, вот:
Hope это помогает Вам настроить, в чем Вы нуждаетесь.
Это шаги для достижения обрисованных в общих чертах задач. Гостя VM с серверным приложением назовут "ServerApp", машиной Windows "WindowsXP" ниже. Замените их их настоящими именами.
метод ниже включает создание пользовательский Xsession на хост-машине. Это имеет преимущество, что мы можем разделить вниз эту сессию, чтобы только загрузить приложения, в которых мы нуждаемся для выполнения наших виртуальных машин (нам, вероятно, не будет нужен полноценный рабочий стол для этого). Кроме того, использование эти ожидает, методы, встроенные к VirtualBox, не потребуют, чтобы любые дополнительные циклы были названы для контроля состояний VM.
Определяют пользовательскую сессию 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
Видят Руководство VirtualBox для ограничений, и для получения дальнейшей информации о том, как настроить это для учетной записи passwordless в 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 (состояние выключения питания) без взаимодействия с пользователем.