Як я можу запустити машину 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?
Jhonny D. Cano -Laftware-

запуск VBox як сервісу не приховає вікно. ви можете мінімізувати його автоматично в системному треї за допомогою AWM, хоча: eusing.com/WindowManager/WindowManager.htm

15
замовлення "VBoxHeadless" для запуску VM без користувальницького інтерфейсу. Якщо ви хочете побачити екран VM, вам потрібно буде використовувати RDP.
Марк Портер

13
Це не послуга. Це запускає VBox лише під час входу в систему - не тоді, коли машина включена. VBoxHeadless - це шлях для запуску як служби. Дивіться мою відповідь нижче (яку я збираюся вдосконалити на коментар Аарона Коплі).
Джон Харт

Відповідь не має нічого спільного із запуском як служби. Запуск відбувається після входу користувача, абсолютно іншого, ніж поведінка служб.
Феліче Поллано

10

Зауважте, що прийнята на даний момент відповідь (Molly7244) насправді запускає VM під час входу в систему - не під час завантаження машини. Іншими словами, це не послуга.

Для фактичної послуги, яка працює під час завантаження машини, я використовую два сценарії (спочатку звідси ) спільно з cygwin (cygrunsrv). Використовує режим VBoxHeadless, як зазначено в інших місцях на цій сторінці.

Перший скрипт запускає ваш VM через VBoxHeadless; він отримує назву потрібного VM для запуску (та іншої інформації, наприклад вашого домашнього каталогу VBOX) від змінних середовища. Другий скрипт встановлює службу для певного VM (використовуючи cygrunsrv для виклику першого сценарію із встановленим правильним env. Vars). Нарешті, є третій файл, який містить загальні функції. Якщо ви помістите все це в каталог разом, ви можете встановити новий vm на зразок такого:

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

А потім запустіть послугу з "net start vboxd-MyVMName" або "cygrunsrv -S vboxd-MyVMName".

Ось сценарій, запущений VM, "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/

**** EDIT **** Відповідно до запиту нижче, коротка інформація про посилання. Хоча рішення для мене спрацювало, кредит належить Пітеру Upfold - http://peter.upfold.org.uk/

  • Встановіть Virtualbox і встановіть VM для прийняття сеансів RDP.
  • Завантажте та встановіть VBoxVmService в C: \ vms. Просто Google VBoxVmService для посилання на завантаження (вибачте, недостатньо репліку, щоб розмістити більше 2 посилань).
  • Відредагуйте файл ini VBoxVmService у розділі C: \ vms:

[Налаштування]

ServiceName = VBoxVmService

VBOX_USER_HOME = C: \ Користувачі \ Адміністратор.VirtualBox

RunAsUser =. \ Адміністратор

UserPassword = введітьсвоє слово

RunWebService = ні

PauseShutdown = 5000

[Vm0] VmName = ім'я vm у VirtualBox

ShutdownMethod = savestate

AutoStart = так

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

  • Коли ви задоволені своєю конфігурацією, запустіть таку команду, щоб встановити службу. Після встановлення послуги ви можете видалити пароль користувача з файла INI, оскільки він зберігається в конфігурації Сервісу:

C: \ vms \ VmServiceControl.exe -i

  • Тепер ви повинні перезавантажити комп'ютер, перш ніж спробувати запустити службу вперше, інакше він не зможе знайти VM.

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


1
Чи можете ви узагальнити посилання у своїй відповіді, якщо воно загине?
jonsca

Пост редагується відповідно до запиту.
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. Примітка. Ці пробіли після знака рівності є навмисними.


Це запустить сервіс правильно, але при збої служби вийде з ладу VM - VBoxHeadless не зможе правильно інтерпретувати контроль зупинки служби, тому Windows буде чекати до часу очікування, а потім насильно вбивати процес, що є менш ніж ідеальним. Див. Інші відповіді для скриптів обгортки, щоб не допустити цього.
Аарон Міллер

Дякуємо за коментар Сподіваємось, це надсилається розробникам у вигляді запиту на виправлення помилок / функції.
Аарон Коплі

1

Якщо сценарії vboxd доставлять вам стільки проблем, як і мені, ви можете спробувати це; це досить просте рішення, реалізоване в Perl, яке забезпечує однаковий функціонал. Зокрема, VM запускається з системою (якщо припустити, що послуга встановлена ​​для запуску автоматично, що є за замовчуванням), і опускається чисто при зупинці служби.

Основні відмінності від рішення vboxd, окрім того, що значно простіше розібратися в моєму досвіді, полягають у тому, що цей скрипт не передає налаштування порту VRDE VBoxHeadless, і що відключення VM обробляється через "acpipowerbutton", а не "savestate" .

Якщо це не відповідає вашим цілям, це досить просто змінити; у першому випадку додайте '-e "TCP / Ports = [, порт ...]"' в рядок командного рядка 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 / <service-name> .log, тож якщо щось погано поводиться, це в першу чергу шукати причину.

Слід пам’ятати, що коли ви запускаєте VM таким чином, він буде працювати під вбудованим обліковим записом SYSTEM, а не вашим власним. У цьому випадку ви не зможете керувати VM через консоль VirtualBox, поки він працює як послуга; воно, здається, перебуває у стані "Вимкнено", і ви не зможете дістатися до його налаштувань. (Не намагаються ввімкнути VM, поки він працює як послуга, не рекомендується. Я не знаю, що станеться, але в кращому випадку це буде неоперація, а в гіршому випадку - шланг вашого VM.) Якщо вам потрібно змінити налаштування VM або отримати доступ до консолі, спочатку зупиніть службу (і дочекайтеся виходу VBoxHeadless.exe), а потім налаштуйте її / увімкніть її в консолі VirtualBox як зазвичай.

Можливо, ви могли б вирішити цю проблему, встановивши другий інтерактивний сервіс для запуску консолі VirtualBox; оскільки це також запустило б консоль під обліковим записом SYSTEM, вона, швидше за все, зможе побачити та керувати працюючою машиною управління. У мене не було потреби робити це самостійно, тому я не впевнений, що це спрацює, але я не бачу причини, чому б цього не було. (Якщо ви спробуєте це, я буду вдячний за коментар до цієї відповіді, давши мені знати, як це склалося для вас. Дякую!)

Сподіваюся, це допомагає!


Ваш сценарій простіший, але вимагає Perl і жорстких кодів декількох властивостей, які сценарій vboxd приймає як параметри. Відповідно до virtualbox.org/manual/ch07.html , не приймаючи порт VRDE, VBoxHeadless не запустить VM (він просто блокується невизначено), якщо VM встановлений для використання порту за замовчуванням, який використовує інший сервер 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.