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


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

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

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


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.
— Аарон Миллер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.