Linux на сервер с Windows Server, или Vbox \ VmWare как сервис
Передо мной встала задача запускать при загрузке компьютера (как сервис), на Windows Server 2008R2 виртуальные машины, но обходя проблемы Hyper-V.
Данные советы подойдут для не серверных систем тоже.
Были проведены поиски в интернете, и результатов оказалось довольно много, но по-настоящему рабочих, как это бывает всегда — только один.
Мучения были долгими, но увенчались успехом, о чём и хотелось бы написать.
Этап первый, ошибочный, но интересный.
Первым, что было найдено — vboxctrl, для VirtualBox.
Данная утилита интересна, и функциональна, но при разных настройках и тестах она не запускала машину.
Для тех кто захочет попробовать любой вариант настроить хочу предупредить — имя машины должно быть строго слитно, латинскими символами, без специальных символов, иначе утилита её не увидит. А также путь к папке не должен содержать символов языка локали (не относящихся к латинке).
Мои параметры (Windows 2008 R2)
Параметры:
vboxctrl64.ini
[VBoxCtrl]
VboxInstallPath D:\Program Files\Oracle\VirtualBox\
VboxUserHome C:\Users\\ .VirtualBox
VmName ABC
ShutdownCommand savestate
ServiceName DEB1
Loglevel 1
Priority Normal
Если у вас нет желания, становится человеком, положившим сервер, то не ставьте Idle и Below Normal, даже с выключенной машиной, как приложение, страшно перегружает компьютер.
Для сервиса:
(Проще всего создать два ярлыка и прописать параметры добавить-удалить)
Запускать от Администратора!
Для установки службы выполните:
обязательно, т.к. конфигурацию из папки пользователя он видит, но не использует, а использует только системное (в чём проблема я так и не понял).
Неправильный этап для vmvare я опущу, т.к. он действительно неправильный, его работоспособность равно нулю.
Этап второй, правильно, работоспособно, VirtualBox
Для установки сервиса используется старая вещица — два файла из комплекта Windows Resource Kit для того чтобы создать пользовательский процесс, который будет стартовать нашу машину.
Файлы Srvany.exe и Instsrv.exe, которые есть в комплекте Windows Resource Kit, я брал отсюда. Оба файла нужно поместить в C:\Windows\system32
(DEB1 — пример, имя машины которая была у меня.)
Дальше надо запускаем консоль (пуск > cmd (от имени администратора)) и добавляем в нее запись, заменяя выделенное жирным шрифтом на название будущего сервиса, первое название по должно быть без пробела, второе — описание, какое понравится:
Если все прошло удачно, то, будет написано «успешно».
Чтобы убедится что процесс создался надо запустить services.msc, или просто посмотреть вкладку «Службы».
Дальше надо добавить параметры в реестр, создадим файл
Пути и имя машины задать те, что в вашей системе.
DEB1.reg
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DEB1\Parameters]
«Application»=»\»D:\\Program Files\\Oracle\\VirtualBox\\VBoxHeadless.exe\»»
«AppParameters»=»\»-s DEB1 -vrdp=off\»»
«AppDirectory»=»\»D:\\Program Files\\Oracle\\VirtualBox\\\»»
Далее, если хочется чтобы состояние машины сохранялось при завершении работы компьютера, то запускаем gpedit.msc и находим Computer Configuration/Windows Settings/Scripts/Shutdown (Конфигурация Компьютера\Конфигурация Windows\Сценарии (Запуск\Завершение)\Завершение\).
Создаем скрипт и называем его
DEB1 необходимо заменить на название вашей машины.
Копируем папку .VirtualBox из C:\Users\\ (где — имя вашей учетной записи) в C:\Windows\System32\config\systemprofile\ Это необходимо повторять после каждого изменения свойств машины, иначе она может не запуститься, или запустится с неправильными (неактуальными) изменениями в следующий раз.
Проверить запускается ли машина можно поискав процесс VBoxHeadless.exe, если он есть, значит машинка запущена.
Этап третий, VMware Player, как сервис
Новые версии виртуальных машин VMware позволяет автоматически масштабировать память RAM виртуальной машины с учетом имеющейся физической памяти, для этого требуется только добавить несколько параметров в Vmx файл.
В этом случае, виртуальная машина будет распоряжаться 2 ГБ оперативной памяти, если таковая имеется.
На машинах с менее чем 2 ГБ ОЗУ, плеер будет автоматически корректировать используемый объем с учетом имеющейся оперативной памяти.
Memsize 2048 это не предел.
Если у вас установлено более чем 2 ГБ памяти, можно просто увеличить это число.
На машине, на которой будет выполняться сервис, устанавливаем VMware Player.
Создание службы для VMWare Player аналогично VirtalBox’у.
Потребуется два файла: instsrv.exe и Srvany.exe, из Windows 2003 Resource Kit. Оба файла нужно поместить в C:\Windows\system32\
Добавьте поля в Vmx файл так, что VMware Player подавлял все «Ok»-сообщения, генерируемые пользовательским интерфейсом, и не показывал пользователю интерфейс.
DEB1r.vmx
Создайте службу VirtualServer на целевой машине с помощью instsrv.exe.
instsrv VirtualServer «%SYSTEMROOT%\System32\srvany.exe»
Добавьте ключи реестра для Srvany.exe так, чтобы она запускала vmplayer.exe с вашей виртуальной машиной.
DEB1.reg
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DEB1\Parameters]
«Application»=»\«C:\\Program Files\\VMware\\VMware Player\\vmplayer.exe\»»
«AppParameters»=»\«C:\\VM\\DEB1.vmx\»»
«AppDirectory»=»\«C:\\VM\\\»»
Чтобы использовать другой продукт Vmware, такой как ACE, измените значение ключа «Application». Чтобы использовать другую виртуальную машину, измените значение «AppParameters».
Создайте пакетный файл запуска виртуальной машины под названием start-vm.bat. Этот сценарий сначала проверяет, установлены ли файлы виртуальной машины, и что служба не запущена. Затем он убивает все старые VMware процессы и устраняет различные файлы состояния с последнего запуска виртуальной машины. По окончанию — стартует службу виртуальной машины.
:: :: start-vm.bat :: :: If the service is already running, then skip starting it net start | grep -q -i "DEB1" if %ERRORLEVEL% == 0 goto noServer :: To make sure that lingering processes are dead, force kill the process taskkill /F /IM vmplayer.exe taskkill /F /IM vmware-vmx.exe :: Remove *.lck, *.vmss from the grid directory del "C:\VM\*.lck" del "C:VM\*.vmss" del "C:\VM\*.vmem" :: Start the server service net start DEB1 :noServer
Создайте пакетный файл для остановки виртуальной машины под названием stop-vm.bat. Сценарий остановки виртуального сервиса убивает любые процессы VMware, связанные с запущенной виртуальной машиной.
:: :: stop-vm.bat :: :: Stop the service net stop DEB1 :: Force kill the processes taskkill /F /IM vmplayer.exe taskkill /F /IM vmware-vmx.exe :noServer
Уничтожение процесса виртуальной машины аналогично тому, как будто вы выдернули шнур из розетки на физическом компьютере. Если состояние виртуальной машины не имеет значения, то вы можете использовать функцию nonpersistent disk. Так как содержимое диска не изменяется во время работы виртуальной машины, такое завершение процесса не сможет повлиять на состояние виртуального диска.
Для запуска виртуальных машин при старте Windows надо поместить скрипт запуска в %SYSTEMROOT%\System32\GroupPolicy\Machine\Scripts\Startup. Для этого примера, скриптом запуска является файл start-vm.bat.
На компьютере надо сделать так, чтобы start-vm.bat запускался при старте системы, добавив его в перечень авто запуска групповой политики. Это можно сделать при помощи gpedit.msc — редактора групповых политик. В разделе Computer Configuration/Windows Settings/Scripts/Startup Properties (Конфигурация Компьютера\Конфигурация Windows\Сценарии (Запуск\Завершение)\Запуск\) редактора групповых политик, и открыть его. Нажмите кнопку «Добавить» и введите имя скрипта запуска виртуальной машины, аналогично предыдущему.
Выполнить тоже для для групповой политики Shutdown (Завершение), но используйте stop-vm.bat как скрипт завершения. Добавление групповой политики Shutdown (Завершение) не является строго обязательным, однако может быть важно, запускать stop-vm.bat, если в нем содержится больше команд, чем просто завершение процесса виртуальной машины.
Итог
По моему личному опыту, более простым оказался вариант с VirtualBox, но если нужно запускать BSD системы, то потребуется всё-таки VmWare, он с ними намного стабильнее работает, зато Linux’ы лучше работают под VirtualBox.