12

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

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

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

Есть идеи?

6 ответов6

9

Обратите внимание, что принятый в настоящее время ответ (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\""
}

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

8

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

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

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

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

2

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

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

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

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

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

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, она, скорее всего, сможет видеть и управлять работающей виртуальной машиной. У меня не было необходимости делать это самому, поэтому я не уверен, что это сработает, но я не вижу причины, по которой это не сработает. (Если вы попробуете это, я буду благодарен за комментарий к этому ответу, который даст мне знать, как это сработало для вас. Спасибо!)

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

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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .