Управление сеансами виртуализации Oracle VM VirtualBox с помощью «ссылочных» файлов

OSzone.net » Microsoft » ИТ-инфраструктура » Виртуализация » Oracle VirtualBox » Управление сеансами виртуализации Oracle VM VirtualBox с помощью «ссылочных» файлов
Автор: Виктор Краснухин aka Deepred
Иcточник: www.oszone.net
Опубликована: 07.09.2010

Введение

В данной статье рассматривается оригинальная методика управления запуском и сеансом виртуализации гостевой операционной системы в программе Oracle VM VirtualBox.

Более подробно познакомиться с платформой Oracle VM VirtualBox Вы можете в статьях Установка и настройка платформы виртуализации Oracle VM VirtualBox и Настройка сети на платформе виртуализации Oracle VM VirtualBox, а также на сайте разработчика Welcome to VirtualBox.org!.

Помимо указанной цели, в статье рассматривается нетривиальный способ создания, а также настройки собственного типа ярлыков – «ссылочных» файлов. Хочу сразу заострить внимание читателя на том, что создавать и настраивать мы будем ярлыки именно «собственного», нового типа.

Но для начала небольшая справка по ярлыкам из «Wikipedia»:

Ярлык (англ. shortcut) — файл-указатель или файл-ссылка на объект, которым может являться файл, программа или определенная команда. Ярлыки, привязанные к объекту файловой системы (как локального ПК, так и сетевого ресурса  имеют расширение «.lnk» (англ. link — связь).

«Ссылочные» файлы, которые мы будем создавать в данной статье, отличны от стандартных ярлыков и уникальны тем, что они не являются указателем на объект файловой системы. Объекты, на которые ссылаются наши ярлыки, недоступны через «Проводник» Windows или файловый менеджер. Эти объекты создаются, настраиваются и управляются только из того, приложения в котором они были созданы. В данной статье мы рассмотрим способ взаимодействия с такими объектами с помощью я ярлыков «собственного» типа – «ссылочных» файлов.

Основные элементы

Для того, чтобы воплотить все это в жизнь нам нужны три элемента – «объект», сценарий и сам «ссылочный» файл.

«Объект» - элемент приложения, созданный этим приложением и доступный для управления из этого же приложения. Это и есть то, с чем мы взаимодействовать, и чем мы будем управлять. В данной статье «объектом» является непосредственно виртуальная машина, установленная на платформе виртуализации Oracle VM VirtualBox. Как и в моих предыдущих статьях, рассматривать мы будем виртуальную машину с именем WinXP.

Примечание. Обратите внимание на имя нашей виртуальной машины, т.е. нашего объекта – это самое важное и критичное свойство. Ошибка в регистре символов при написании имени объекта приведет к ошибке в работе нашей системы.

Сценарий. Та система взаимодействия или, если хотите - драйвер, который мы создаем в рамках данной статьи, не является частью операционной системы, хотя все операции, производимые в ней, выполняются средствами Windows (в данном случае, Windows Vista< Home Premium SP2). И именно поэтому, мы самостоятельно подготовим и применим этот драйвер, который будет обрабатывать и перенаправлять наши инструкции (команды), выполняемые над объектом, к приложению, этот объект контролирующему.

«Ссылочный» файл – ярлык, и уже элемент файловой системы, созданный нами и зарегистрированный в системе. Именно этот элемент нашей системы взаимодействия содержит команды и свойства, необходимые нам для работы.

Примечание. В рамках данной статьи «ссылочный» файл содержит только одно нужное нам свойство – имя целевого объекта, которое должно совпадать с его собственным.

Объект и сценарий

Шаг первый: Определение объекта и методов обращения

В качестве объекта, как и было указано выше, я выбираю виртуальную машину с именем WinXP, установленную в платформе виртуализации  Oracle VM VirtualBox. В качестве методов обращения к виртуальной машине выберем следующие команды и определим название этих команд в контекстном меню, создаваемого «ссылочного» файла:

Примечание. Все указанные выше команды, выбранные мной, являются стандартными командами встроенных утилит управления платформой «Vboxmanage.exe» и «Vboxheadless.exe», поддерживающих работу с интерпретатором командных строк Windows – «Cmd.exe».  Создаваемый пункт контекстного меню «Скрытый запуск» определяет команду, доступную к исполнению только из командной строки. Единственное используемое в данном методе свойство объекта – это его имя и поэтому имя «ссылочного» файла (ярлыка) должно совпадать с именем объекта.

Шаг второй: сценарий обработки вызовов

В качестве сценария обработки вызов я использую собственный скрипт, написанный на языке Visual Basic и исполняемый сервером сценариев «Windows script host» – «wscript.exe». Поскольку скрипт обрабатывает несколько инструкций, он  должен поддерживать вызов с параметрами и осуществлять применение всех параметров и аргументов.

'Author        : Krasnukhin Viktor aka DEEPRED

'Date          : 30.08.2010

'--------------------------------------------------------------------------

Args1 = "": Args2 = "": Args3 = "": Args4 = ""

strApp_1 = "VirtualBox.exe"

strApp_2 = "VBoxHeadless.exe"

Set objShellApp = CreateObject("Shell.Application")

Set FSO   =  CreateObject("Scripting.FileSystemObject")

Args1 =  FSO.GetBaseName(Wscript.Arguments.Item(0))

Args2 =  Wscript.Arguments.Item(1)

Args3 =  Wscript.Arguments.Item(2)

Args4 =  Replace(WScript.scriptFullname, WScript.ScriptName, "")

'--------------------------------------------------------------------------

Set objWMIService = GetObject("winmgmts:" _

& "{impersonationLevel=impersonate}!\\" _

& "." & "\root\cimv2")

Set colProcesses = objWMIService.ExecQuery( _

"Select * from Win32_Process Where " & _

"commandline Like '% " & Args1 & "%'")

'--------------------------------------------------------------------------

IF lcase(Args2) = "virtualbox" Then

'Wscript.Echo "[ " & Args2 & " ]"

objShellApp.ShellExecute "VirtualBox.exe", "", Args4, "", 1

Wscript.Quit (0)

ElseIF lcase(Args3) = "headless" Then

'Wscript.Echo "HeadLess [ " & StrComLine & " ]"

objShellApp.ShellExecute "VBoxHeadless.exe", "-s "& Args1, Args4, "", 0

Wscript.Quit (0)

ElseIF lcase(Args2) = "startvm" Then

strComLine = Args2 &" "& Args1

'Wscript.Echo "Input [ " & StrComLine & " ]"

Call control(strComLine)

Wscript.Quit (0)

ElseIF lcase(Args2) = "controlvm" Then

Wscript.Echo colProcesses.count

IF colProcesses.count = 0 Then

Wscript.Echo "Нет открытых сеансов виртуализации!"

Wscript.Quit 1

End IF

strComLine = Args2 &" "& Args1 &" "& Args3

'Wscript.Echo "Control [ " & StrComLine & " ]"

Call control(strComLine)

Wscript.Quit (0)

ElseIF lcase(Args2) = "isnotgui" Then

Call ChangeState("str")

End IF

Wscript.Quit (0)

'--------------------------------------------------------------------------------------

Function control(strComLine)

StrComLine = StrComLine

'Wscript.Echo "Action [ " & StrComLine & " ]"

objShellApp.ShellExecute "VBoxmanage.exe", StrComLine, Args4, "", 0

End function

'--------------------------------------------------------------------------------------

Function ChangeState(str)

For Each objProcess in colProcesses

IF objProcess.name = strApp_1 Then

strAppExec = strApp_2

Call Restart(1, strAppExec, "")

strComLinePst = "-s " & Args1 & " –vrdp off"

Call Restart(2, strAppExec, strComLinePst)

'Wscript.Echo objProcess.commandline _

'& Vbcrlf & strAppExec

ElseIF objProcess.name = strApp_2 Then

strAppExec = strApp_1

Call Restart(1, strAppExec, "")

strComLinePst = "startvm " & Args1 & " --type gui"

Call Restart(2, strAppExec, strComLinePst)

'Wscript.Echo objProcess.commandline _

'& Vbcrlf & "strAppExec : " & strAppExec

Exit For

End IF

Next

End function

'--------------------------------------------------------------------------------------

Function Restart(Step, AppExec, ComLine)

strStepNum = step

strAppExec = AppExec

strComLine = ComLine

'Wscript.Echo  "Restart [ " & strStepNum &" : "& strAppExec &" : "& strComLine & " ]"

IF strStepNum = 1 Then

strComLinePre = "controlvm " & Args1 & " savestate"

objShellApp.ShellExecute "VBoxmanage.exe", strComLinePre, Args4, "", 1

'Wscript.Echo "SAVESTATE" & " : " & strComLinePre

Wscript.Sleep 10000

ElseIF strStepNum = 2 Then

objShellApp.ShellExecute strAppExec, strComLine, Args4, "", 1

End If

End function

'...

Скачать скрипт

Рассмотрим работу данного скрипта. Параметры, обрабатываемые данным сценарием, представляют собой имя ярлыка, которое является и именем виртуальной машины, а также параметры и аргументы командной строки утилит «vboxmanage.exe» и «vboxheadless.exe».  Каждый второй параметр, передаваемый скрипту, сравнивается с названием определенного действия, заложенного в сценарий. После этого одной из указанных утилит, передается команда и параметры на выполнение этого действия. Теперь давайте рассмотрим непосредственно команды, которые нам необходимы для управления виртуальной машиной:

Примечание. Тут я попрошу Вас обратить внимание на следующую строку в нашем сценарии:

strComLinePst = "-s " & Args1 & " --vrdp off"

Эта строка, в которой формируется команда для скрытого запуска сеанса виртуализации с помощью утилиты «vboxheadless.exe». Ключ " --vrdp off" я применяю сразу же при вызове виртуальной машины, т.к. все сеансы виртуализации, инициализируемые с помощью указанной утилиты, автоматически запускаются с уже включенным RDP-сервером (независимо от существования удаленных мониторов). Казалось бы, зачем же его выключать, если нет подключенных мониторов, а разрешение на подключение выдается только вручную пользователем?  Все дело в том, что при переводе сеанса из одного режима в другой, нам требуется сохранить состояние виртуальной машины, но произвести это невозможно при включенном RDP-сервере. В том случае, если Вам все же нужен сервер удаленных мониторов, то запуск сеансов следует проводить следующим образом:

VboxHeadless –s WinXP

Vboxmanage startvm WinXP vrdp off

Если же Вам потребуется включить (или выключить) RDP-сервер уже во время сеанса виртуализации Вы можете воспользоваться следующей командой:

Vboxmanage controlvm WinXP vrdp on

Vboxmanage controlvm WinXP vrdp off

Шаг третий: настройка контекстного меню и регистрация «ссылочного» файла

Перейдем к следующему этапу – созданию нового типа файла, настройке для него контекстного меню и регистрации его в системе. Все эти операции мы будем производить через реестр Windows, но не вручную, а через «твик» реестра. Сам файл реестра мы будем формировать поэтапно, чтобы Вы могли разобраться в каждом шаге.

Для нашего создаваемого типа файла я использую расширение «.cvb», означающее control virtualbox, т.е. управление виртуальной машиной. Итак, все зарегистрированные типы файлов в системе описаны в разделе реестра «HKEY_CLASSES_ROOT» (сокращенно – HKCR), причем для каждого из них присутствуют два раздела. Мы не будем отходить от этой системы и создадим в реестре два новых раздела – «.cvb» и «cvbfile». В первом разделе описано расширение файла и его тип, во втором опишем принадлежность файла к тому или иному приложению, пункты контекстного меню и значок. Таким образом мы получили первые строки нашего «твика»:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.cvb]

@="cvbfile"

[HKEY_CLASSES_ROOT\cvbfile]

@="VirtualBox.run"

Так как мы создаем ярлык, хоть и собственного типа, следует описать данный файл в реестре именно как ярлык. При этом обратим внимание, что для файлов ярлыков расширение не отображается. Отсюда появляются следующие две строчки:

"NeverShowExt"=""

"Ishorсut"=""

Так, давайте укажем иконку, которая будет соответствовать нашему «ссылочному» файлу. Как и моих предыдущих статьях, мы будет использовать иконку по умолчанию из файла WinFXDocObj.exe. Чтобы указать системе, какой значок использовать, добавим в наш «твик» реестра следующие строки:

[HKEY_CLASSES_ROOT\cvbfile\DefaultIcon]

@="C:\\WINDOWS\\System32\\WinFXDocObj.exe, 0"

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

Описание процесса создания пунктов контекстного меню

Для начала нужно создать в уже существующем разделе «HKCR\cvbfile» новый раздел с именем «Shell», т.е в «твик» добавляем строчку:

[HKEY_CLASSES_ROOT\cvbfile\shell]

Далее, теперь в этом разделе создаем еще один подраздел с именем пункта контекстного меню, значение же ключа для данного пункта оставляем пустым:

[HKEY_CLASSES_ROOT\cvbfile\shell\• 3апуск]

Примечание. Символ «•» Я ставлю только для большей заметности этих пунктов в контекстном меню.

Теперь в этой же ветви создаем новый подраздел с именем «command», в нем как раз и будет находиться ключ реестра, отвечающий за запуск команды, соответствующей данному пункту контекстного меню.

[HKEY_CLASSES_ROOT\cvbfile\shell\• 3апуск\command]

И теперь внесем нужную нам команду в ключ реестра, находящийся в разделе «command».

@="wscript \"C:\\Program Files\\Oracle\\VirtualBox\\inter.vbs\" \"%1\" \"virtualbox\" \"\""

Давайте рассмотрим записанную команду:

Wscript – cервер сценариев, отвечающий за выполнение скриптов, написанных на языке VBScript.

"C:\\Program Files\\Oracle\\VirtualBox\\inter.vbs\" – наш сценарий, с указанным для него полным путем.

"%1" – первый аргумент, передаваемый скрипту, он и содержит имя нашей виртуальной машины.

"startvm" – второй параметр, передаваемый сценарию. Для нашего скрипта он является одновременно, и контрольным названием для определенного действия (запуска виртуальной машины), и, как было сказано выше, параметром для командной строки утилиты «vboxmanage.exe».

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

Сформированный файл

Теперь, когда проработали все пункты контекстного меню, для создаваемого нами файла, описали все параметры и определили принадлежность данного «ссылочного» к нашему сценарию – можно сформировать наш «твик». Таким образом, наш файл реестра приобрел следующий вид:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.cvb]

@="cvbfile"

[HKEY_CLASSES_ROOT\cvbfile]

@="VirtualBox.run"

"NeverShowExt"=""

"Ishorсut"=""

[HKEY_CLASSES_ROOT\cvbfile\DefaultIcon]

@="C:\\WINDOWS\\System32\\WinFXDocObj.exe, 0"

[HKEY_CLASSES_ROOT\cvbfile\shell]

@=""

[HKEY_CLASSES_ROOT\cvbfile\shell\VirtualBox панель управления]

[HKEY_CLASSES_ROOT\cvbfile\shell\VirtualBox панель управления\command]

@="wscript \"C:\\Program Files\\Oracle\\VirtualBox\\inter.vbs\" \"%1\" \"virtualbox\" \"\""

[HKEY_CLASSES_ROOT\cvbfile\shell\• 3апуск]

[HKEY_CLASSES_ROOT\cvbfile\shell\• 3апуск\command]

@="wscript \"C:\\Program Files\\Oracle\\VirtualBox\\inter.vbs\" \"%1\" \"startvm\" \"\""

[HKEY_CLASSES_ROOT\cvbfile\shell\• Cкрытый запуск]

[HKEY_CLASSES_ROOT\cvbfile\shell\• Cкрытый запуск\command]

@="wscript \"C:\\Program Files\\Oracle\\VirtualBox\\inter.vbs\" \"%1\" \"\" \"headless\""

[HKEY_CLASSES_ROOT\cvbfile\shell\• Завершение]

[HKEY_CLASSES_ROOT\cvbfile\shell\• Завершение\command]

@="wscript \"C:\\Program Files\\Oracle\\VirtualBox\\inter.vbs\" \"%1\" \"controlvm\" \"poweroff\""

[HKEY_CLASSES_ROOT\cvbfile\shell\• Завершение через ACPI]

[HKEY_CLASSES_ROOT\cvbfile\shell\• Завершение через ACPI\command]

@="wscript \"C:\\Program Files\\Oracle\\VirtualBox\\inter.vbs\" \"%1\" \"controlvm\" \"acpipowerbutton\""

[HKEY_CLASSES_ROOT\cvbfile\shell\• Отключить/Включить GUI]

[HKEY_CLASSES_ROOT\cvbfile\shell\• Отключить/Включить GUI\command]

@="wscript \"C:\\Program Files\\Oracle\\VirtualBox\\inter.vbs\" \"%1\" \"isnotgui\" \"\""

[HKEY_CLASSES_ROOT\cvbfile\shell\• Пауза]

[HKEY_CLASSES_ROOT\cvbfile\shell\• Пауза\command]

@="wscript \"C:\\Program Files\\Oracle\\VirtualBox\\inter.vbs\" \"%1\" \"controlvm\" \"pause\""

[HKEY_CLASSES_ROOT\cvbfile\shell\• Продолжить]

[HKEY_CLASSES_ROOT\cvbfile\shell\• Продолжить\command]

@="wscript \"C:\\Program Files\\Oracle\\VirtualBox\\inter.vbs\" \"%1\" \"controlvm\" \"resume\""

[HKEY_CLASSES_ROOT\cvbfile\shell\• Сброс]

[HKEY_CLASSES_ROOT\cvbfile\shell\• Сброс\command]

@="wscript \"C:\\Program Files\\Oracle\\VirtualBox\\inter.vbs\" \"%1\" \"controlvm\" \"reset\""

Скачать «твик»

Шаг четвертый: Подготовка к работе

Теперь, когда у нас уже готовы и «твик» реестра, и сценарий обработки запросов, нужно задействовать и разместить их нужным образом.  Для этого Вам нужно провести следующие действия:

Рис. 1: Созданный раздел в реестре

Примечание. Обратите внимание, что «твик» реестра подразумевает установку Вашей операционной системы на диск «С:\». Если же у Вас операционная система установлена на диск с другой литерой, то в созданном файле реестра следует изменить путь к файлу сценария.


Рис. 2: Вид «ссылочного» файла

Использование

После того, как Вы создали «ссылочный» файл, остается только проверить – все ли работает, а затем начинать пользоваться данным нововведением. Для того, чтобы удостовериться, что все заданные нами команды были правильно прописаны в системы и доступны для использования щелкнем правой мыши кнопкой на нашем «ярлыке» для вызова контекстного меню. Если Вы видите следующую картину, то значит все в порядке:

Рис. 3: Вид контекстного меню ссылочного файла

Разместить подобные «ссылочные» файлы Вы можете в любой папке, «Панели быстрого запуска» или в меню. Также Вы можете использовать подготовленный нами сценарий для перевода сеанса виртуализации из интерактивного режима в скрытый вызвав его с параметрами из командной строки. В данном случае командная строка будет иметь следующий вид:

wscript "C:\Program Files\Oracle\VirtualBox\inter.vbs WinXP "isnotgui" ""

Также Вы можете создать задание в «Планировщике заданий» с точно такими же параметрами, например, для перевода сеанса виртуализации из одного режима в другой.

Заключение

В рамках данной статьи были рассмотрены для основные задачи:

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

Вторая задача является методом настройки Вашей операционной системы «под ключ», т.е. именно под Вас. С помощью создания подобных «ссылочных файлов» и сценариев Вы можете создавать собственные процедуры обработки не только для объектов файловой системы, но и объектов установленных на Вашем ПК приложений, недоступных напрямую через «Проводник» Windows или файловый менеджер. В данном случае, основным инструментом будет являться Ваша фантазия и желание поработать. Более того, использую приведенный выше метод настройки контекстного меню для конкретного типа, Вы можете настроить любые связи между объектами Вашей файловой системы и установленными программами.


Ссылка: http://www.oszone.net/13134/VBoxmanage_links