Как я могу запустить машину VirtualBox в качестве службы в Windows XP?

13

У меня есть машина VirtualBox с Windows XP на хосте Windows XP.

Как я могу запустить VirtualBox как сервис, чтобы я мог получить виртуальную машину под капотом, и мне не нужно запускать VirtualBox для доступа к моей виртуальной машине (через VNC из сети)?

Я обнаружил, что VirtualBox Manage может быть способом, но так как я новичок в этом, я не знаю, с чего начать.

Есть идеи?

Джонни Д. Кано
источник

Ответы:

0

Создать ярлык для C:\Program Files\innotek VirtualBox\VBoxManage.exe

После кавычек введите: startvm <your virtual machine name>

Пример:

“C:\Program Files\innotek VirtualBox\VBoxManage.exe” startvm XP

Скопируйте / Переместите ярлык в папку автозагрузки.

PS: если вы хотите отложить виртуальную машину до полной загрузки вашей системы, вы можете сделать это в XP через Startup Delayer .


источник
Кажется, он работает нормально. Есть ли способ «скрыть» окно и для виртуальной машины, чтобы она работала больше как служба Windows?
Джонни Д. Кано - аппаратное обеспечение -
запуск VBox как сервиса не скроет окно. Вы можете свернуть его автоматически в системный трей с помощью AWM: eusing.com/WindowManager/WindowManager.htm
15
Оформить заказ "VBoxHeadless" для запуска виртуальных машин без пользовательского интерфейса. Вам нужно будет использовать RDP, если вы хотите видеть экран виртуальной машины.
Марк Портер
13
Это не услуга. Это запускает VBox только при входе в систему, а не при включении машины. VBoxHeadless - это способ запуска в качестве службы. Смотрите мой ответ ниже (который я собираюсь улучшить согласно комментарию Аарона Копли).
Джон Харт
Ответ не имеет ничего общего с работой в качестве службы. Запуск происходит после входа пользователя, полностью отличающийся от поведения сервисов.
Феличе Поллано
10

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

Для реальной службы, которая запускается при загрузке машины, я использую два сценария (изначально отсюда ) в сочетании с cygwin (cygrunsrv). Использует режим VBoxHeadless, как упомянуто в другом месте на этой странице.

Первый скрипт запускает вашу виртуальную машину через VBoxHeadless; он получает имя нужной виртуальной машины для запуска (и другую информацию, такую ​​как домашний каталог VBOX) из переменных среды. Второй сценарий устанавливает службу для конкретной виртуальной машины (используя cygrunsrv для вызова первого сценария с установленным правом env. Vars). Наконец, есть третий файл, который содержит общие функции. Если вы поместите все это в каталог вместе, вы можете установить новый vm следующим образом:

$ VBOX_USER_HOME="/path/to/.VirtualBox/" vboxd-install MyVMName 3333

А затем запустите службу с помощью «net start vboxd-MyVMName» или «cygrunsrv -S vboxd-MyVMName».

Вот скрипт для запуска виртуальной машины "vboxd":

#!/bin/bash
# from http://forums.virtualbox.org/viewtopic.php?f=1&t=23536

##
## Manages start / stop of VirtualBox virtual machines
##

## load common functions
basedir="$(readlink -f $(dirname $0))"
source "$basedir/.libcommon" || exit 1

## parse arguments
parseArg vmName "$1" "$VBOXD_VM_NAME"
parseArg vmPort "$2" "$VBOXD_VM_PORT"

VBOX_INSTALL_PATH="$(cygpath "$VBOX_MSI_INSTALL_PATH")"

## define signal handler
function onHalt {
    warn "Stopping virtual machine '$vmName'"
    "$VBOX_INSTALL_PATH/VBoxManage" controlvm "$vmName" savestate
    exit 0
}

## install signal handler; cygrunsrv uses SIGTERM by default
trap 'onHalt' TERM

## hardcode this path if you like; it's required for VBox* utils to
## find the correct VirtualBox.xml config file and is usually set
## during a call to vboxd-install.
#export VBOX_USER_HOME="$USERPROFILE\\.VirtualBox"

## default VBoxHeadless port specification
portSpec="-e \"TCP/Ports=$vmPort\""

## determine vm state
info "Querying virtual machine '$vmName' state"
vmState=$( \
    "$VBOX_INSTALL_PATH/VBoxManage" showvminfo "$vmName" \
    | grep '^State:' \
    | sed 's/State: *//' )
info "Virtual machine '$vmName' is $vmState"

## if vm state is saved, we can't specify port without an exception,
## as port spec requires modification of the (immutable) saved machine
## state. See http://www.virtualbox.de/ticket/3609
if  [ "${vmState##saved}" != "$vmState" ]; then
    ## state is saved; clear port specification
    warn "Port specification is not allowed for saved vms"
    portSpec=""
fi

## start the VM
info "Starting virtual machine '$vmName' on port $vmPort"
"$VBOX_INSTALL_PATH/VBoxHeadless" -s "$vmName" $portSpec &

## record pid of VBoxHeadless child process and wait on it
pid="$!"
info "Waiting on VBoxHeadless child process $pid"
wait "$pid"

А вот скрипт установщика "vboxd-install":

#!/bin/bash
# http://forums.virtualbox.org/viewtopic.php?f=1&t=23536

##
## Registers a VirtualBox virtual machine to start as a service via cygrunsrv
##

## load common functions
basedir="$(readlink -f $(dirname $0))"
source "$basedir/.libcommon" || exit 1

## test for presence of cygrunsrv utility
if [ ! -x "$(which cygrunsrv)" ]; then
    die "Utility 'cygrunsrv' is not in path"
fi

## test VirtualBox configuration
if [ -z "$VBOX_USER_HOME" ]; then
    die "Required environment variable 'VBOX_USER_HOME' is undefined. " \
     "Please ensure this variable is set to point to the directory " \
     "containing your VirtualBox.xml configuration file."
fi
configFile=$(cygpath -u "$VBOX_USER_HOME\\VirtualBox.xml")
if [ ! -e "$configFile" ]; then
    die "VirtualBox configuration file '$(cygpath -w $configFile)' not found"
fi

## parse arguments
parseArg vmName "$1"
parseArg vmPort "$2"
parseArg vmUser "$3" "SYSTEM"

## if vmUser is not SYSTEM, update userSpec
userSpec="--interactive"
if [ "$vmUser" != "SYSTEM" ]; then
    ## "interactive" option disallowed when user is specified
    userSpec="--user \"$vmUser\""
fi

## install the service
cygrunsrv \
    --install "vboxd-$vmName" \
    --path "$basedir/vboxd" \
    --env "VBOXD_VM_NAME=$vmName" \
    --env "VBOXD_VM_PORT=$vmPort" \
    --env "VBOX_USER_HOME=$VBOX_USER_HOME" \
    --desc "VirtualBox virtual machine '$vmName' on port $vmPort" \
    $userSpec \
    --type auto \
    --termsig TERM \
    --shutsig TERM \
    --neverexits \
    --preshutdown \
    || die "Failed to install service"

И, наконец, вот скрипт ".libcommon", на который ссылаются оба из них:

# -*-shell-script-*-
# from http://forums.virtualbox.org/viewtopic.php?f=1&t=23536

SCRIPT="$(basename $0)"
BASEDIR="$(readlink -f $(dirname $0))"
[ -z "$LOGLEVEL" ] && LOGLEVEL=2
[ -z "$LOGDATEFORMAT" ] && LOGDATEFORMAT="%Y-%m-%d %H:%M:%S "

function log {
    local now=""
    [ -n "$LOGDATEFORMAT" ] && now=$(date +"$LOGDATEFORMAT")
    echo "$SCRIPT $now$@" >&2
}

function debug {
    [ "$LOGLEVEL" -lt 3 ] && return
    log "[DEBUG] $@"
}

function info {
    [ "$LOGLEVEL" -lt 2 ] && return
    log "[INFO]  $@"
}

function warn {
    [ "$LOGLEVEL" -lt 1 ] && return
    log "[WARN]  $@"
}

function error {
    log "[ERROR] $@"
}

function die {
    error "$@"
    exit 1
}

function parseArg {
    local _name="$1"
    local _value="$2"
    local _default="$3"
    if [ -z "$_value" ]; then
        if [ -z "$_default" ]; then
            die "Required argument '$_name' is undefined"
        fi
     if [ "$_default" = "*EMPTY*" ]; then
         _value=""
     else
            _value="$_default"
     fi
    fi
    debug "$_name=\"$_value\""
    eval "$_name=\"$_value\""
}

Это решение прекрасно работает для меня; надеюсь, вам повезет.

Джон Харт
источник
4
+1 за "не услугу" ... -1 за ссылку на решение, а не за включение его в ответ. Голосование является нулевым. :) Подумайте о пересмотре, чтобы включить решение, так как гниль ссылок отрицательно сказывается на долговечности этого ответа.
Аарон Копли
8

Похоже, самый простой ответ на данный момент VBoxVMService . Я еще не пробовал, я постараюсь не забыть прийти сюда и обновить ответ, если / когда я это сделаю.

Tao
источник
1
это не работает с 4.2.x хотя
Архимед Траяно
2
@ArchimedesTrajano Я пробовал текущую версию (4.1) с VirtualBox 4.3.6, и она работает хорошо. Страница проекта утверждает, что она была «переписана практически с нуля» .
Мелебиус
1
Да, я только что проверил это прошлой ночью, и это работает! Просто не забудьте перезагрузить.
Архимед Траяно
4

Договорились на VBoxVMService. Это действительно легко настроить и, кажется, работает хорошо. Вы можете найти, как настроить это здесь:

http://www.windows-noob.com/forums/index.php?/topic/4931-have-virtualbox-vms-start-as-a-service-on-a-windows-host/

**** РЕДАКТИРОВАТЬ **** Согласно запросу ниже, резюме ссылки. Хотя решение сработало для меня, заслуга Питера Апфолда - http://peter.upfold.org.uk/

  • Установите Virtualbox и настройте виртуальную машину на прием сеансов RDP.
  • Загрузите и установите VBoxVmService в C: \ vms. Просто Google VBoxVmService для ссылки на скачивание (извините, не хватает представителя, чтобы опубликовать более 2 ссылок).
  • Отредактируйте ini-файл VBoxVmService в C: \ vms:

[Настройка]

ServiceName = VBoxVmService

VBOX_USER_HOME = C: \ Users \ Administrator.VirtualBox

RunAsUser =. \ Administrator

UserPassword = enteryourpasswordhere

RunWebService = нет

PauseShutdown = 5000

[Vm0] VmName = имя виртуальной машины в VirtualBox

ShutdownMethod = savestate

Автостарт = да

  • Замените в VBOX_USER_HOME на папку .VirtualBox в правильном домашнем каталоге пользователя, а также на директивы RunAsUser и UserPassword и задайте имя целевой виртуальной машины в приложении VirtualBox в VmName. Вы также можете добавить дополнительные секции [Vmx] после [Vm0] с другими виртуальными машинами, чтобы запускаться при загрузке машины.

  • Если вы довольны своей конфигурацией, в командной строке с включенным администратором выполните следующую команду, чтобы установить службу. После установки службы вы можете удалить свой пароль пользователя из INI-файла, так как он сохраняется в конфигурации службы:

C: \ vms \ VmServiceControl.exe -i

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

  • После перезагрузки служба должна запуститься (с задержкой «Автоматический (отложенный запуск)»), и ваши виртуальные машины будут запущены при загрузке.

RooiWillie
источник
1
Можете ли вы обобщить ссылку в вашем ответе на случай, если он умрет?
Йонска
Сообщение отредактировано по запросу.
RooiWillie
это работает на 4.2.x версии VirtualBox?
Архимед Траяно
Эти инструкции, вероятно, применимы к какой-то более старой версии, текущая версия VBoxVmService (4.1) проще в настройке, и она поможет вам в этом процессе.
Мелебиус
2

Просто предлагая это как еще один вариант:

Используйте встроенную команду Windows «sc» для создания службы. Объедините это с vboxheadless, и вы попадете туда, куда хотите.

Непроверенный с vboxheadless, но я создал тестовый сервис, который запускает calc.exe. Вы должны делать что-то вроде этого:

sc create servicenamehere start= auto binPath= "C:\path\to\vboxheadless.exe --startvm name"

Обратитесь к документации для sc для получения дополнительной информации. Примечание. Эти пробелы после знака равенства являются преднамеренными.

Аарон Копли
источник
Это правильно запустит службу, но приведет к сбою виртуальной машины при остановке службы - VBoxHeadless не сможет правильно интерпретировать управление остановкой службы, поэтому Windows будет ждать до истечения времени ожидания, а затем принудительно завершит процесс, что не идеально. Смотрите другие ответы для сценариев-оболочек, чтобы предотвратить это.
Аарон Миллер
Спасибо за комментарий. Надеемся, что это представлено разработчикам как запрос на исправление ошибки / запрос функции.
Аарон Копли
1

Если сценарии vboxd доставляют вам столько же проблем, сколько и мне, вы можете попробовать это; это довольно простое решение, реализованное в Perl, которое обеспечивает ту же функциональность. В частности, виртуальная машина запускается вместе с системой (при условии, что служба настроена на автоматический запуск (по умолчанию)) и полностью отключается при остановке службы.

Основными отличиями от решения vboxd, помимо того, что по моему опыту с ним значительно проще справиться, является то, что этот сценарий не передает настройку порта VRDE в VBoxHeadless и что завершение работы виртуальной машины обрабатывается с помощью «acpipowerbutton», а не «savestate» ,

Если это не соответствует вашим целям, это достаточно легко изменить; в первом случае добавьте '-e "TCP / Ports = [, port ...]"' в строку командной строки VBoxHeadless ($ cmd), а во втором случае просто измените "acpipowerbutton" на "savestate" в обработчик SIGTERM.

Вот скрипт Perl:

 #!/usr/bin/perl
 # Service wrapper for VirtualBox VM.

 use strict;


 # Windows-style path pointing to your VirtualBox home directory
 # (i.e., where your VirtualBox.xml lives)
 my $vboxhome = 'c:\\Documents and Settings\\Aaron\\.VirtualBox';

 # Cygwin path pointing to the VirtualBox install directory
 my $vboxpath = '/cygdrive/c/Program Files/Oracle/VirtualBox';

 # Name or UUID of your virtual machine
 my $vmname = '{83dfb4b1-4243-4a07-9d37-9df5573792d8}';

 $ENV{'VBOX_USER_HOME'} = $vboxhome;

 my $exit_handler = sub {
    print "Caught SIGTERM; shutting down VM.\n";
    exec("'$vboxpath/VBoxManage.exe' controlvm $vmname acpipowerbutton");
 };

 $SIG{TERM} = $exit_handler;

 print "[debug] pid $$\n";

 # Command line for VBoxHeadless - add your VRDE port here if you want one
 my $cmd = "'$vboxpath/VBoxHeadless.exe' --startvm $vmname 2>&1 1>/dev/null";
 print "[debug] $cmd\n";
 system($cmd);

 print "VM died unexpectedly; exiting.\n";

А вот командная строка cygrunsrv, которую я использовал для установки службы Windows:

 cygrunsrv --install '<service-name>' --desc '<description>' \
  --path '/usr/bin/perl' --args '<full-path-to-service-script>' \
  --chdir '<path-to-service-script-dir>' --termsig TERM --shutsig TERM \
  --preshutdown --interactive

Оттуда, это должно быть просто вопросом 'sc start <имя-службы>', и вы должны быть готовы - помните, что по умолчанию службы cygrunsrv записывают в / var / log / <имя-службы> .log, так что если что-то плохо себя ведет, это первое место, где нужно искать причину.

Следует иметь в виду, что когда вы запускаете виртуальную машину таким образом, она будет работать под встроенной учетной записью SYSTEM, а не под вашей собственной. В этом случае вы не сможете администрировать виртуальную машину через консоль VirtualBox, пока она работает как служба; он будет находиться в состоянии «Выключен», и вы не сможете перейти к его настройкам. (Попытка включить виртуальную машину, пока она работает как служба, не рекомендуется - я не знаю, что произойдет, но в лучшем случае это будет неработоспособность, а в худшем случае это приведет к повреждению вашей виртуальной машины.) Если вам нужно изменить настройки виртуальной машины или получить доступ к консоли, сначала остановите службу (и дождитесь выхода VBoxHeadless.exe), а затем настройте его / включите его в консоли VirtualBox, как обычно.

Возможно, вы могли бы решить эту проблему, установив второй интерактивный сервис для запуска консоли VirtualBox; так как это будет запускать консоль также под учетной записью SYSTEM, она, скорее всего, сможет видеть и управлять работающей виртуальной машиной. У меня не было необходимости делать это самому, поэтому я не уверен, что это сработает, но я не вижу причины, по которой это не сработает. (Если вы попробуете это, я буду признателен за комментарий к этому ответу, который даст мне знать, как это сработало для вас. Спасибо!)

Надеюсь это поможет!

Аарон Миллер
источник
Ваш сценарий проще, но требует Perl и жестких кодов нескольких свойств, которые сценарий vboxd принимает в качестве параметров. Согласно virtualbox.org/manual/ch07.html , не принимая порт VRDE, VBoxHeadless не будет запускать виртуальную машину (она просто блокируется на неопределенный срок), если виртуальная машина настроена на использование порта по умолчанию, используемого другим сервером RDP. vboxd-installполезно, потому что удобно скрывает детали аргумента cygrunsrv. Я согласен, однако, что acpipowerbuttonэто лучший вариант «остановки», чем savestate.
Дерек Махар
@DerekMahar Возьми это за то, что оно стоит, я полагаю. Поскольку он не работает на чем-то более новом, чем XP, я сомневаюсь, что в любом случае это очень много. ¯ \ _ (ツ) _ / ¯ Спасибо за отзыв!
Аарон Миллер
Аарон Миллер, ты имеешь в виду, что твой скрипт или vboxd не работает ни на одной Windows, новее XP? Я предполагаю, что вы имеете в виду ваш скрипт, потому что я заставил vboxd работать на Windows 10 с VirtualBox 5.1.6.
Дерек Махар
@DerekMahar Я имею в виду мой сценарий, а не vboxd.
Аарон Миллер