Jak mogę uruchomić maszynę VirtualBox jako usługę w systemie Windows XP?

13

Mam maszynę VirtualBox z systemem Windows XP na hoście systemu Windows XP.

Jak mogę uruchomić VirtualBox jako usługę, aby uzyskać maszynę wirtualną pod maską i nie muszę uruchamiać VirtualBox, aby uzyskać dostęp do mojej maszyny wirtualnej (przez VNC z sieci)?

Przekonałem się, że VirtualBox Manage może być dobrą drogą, ale ponieważ jestem początkujący, nie wiem od czego zacząć.

Jakieś pomysły?

Jhonny D. Cano -Leftware-
źródło

Odpowiedzi:

0

Utwórz skrót do C:\Program Files\innotek VirtualBox\VBoxManage.exe

Po znakach cudzysłowu wpisz: startvm <your virtual machine name>

Przykład:

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

Skopiuj / przenieś skrót do folderu startowego.

ps: jeśli chcesz opóźnić maszynę wirtualną do momentu pełnego uruchomienia systemu, możesz to zrobić w XP za pomocą Opóźnienia uruchamiania .


źródło
Wygląda na to, że działa dobrze. Czy istnieje możliwość „ukrycia” okna maszyny wirtualnej, aby działała bardziej jak usługa systemu Windows?
Jhonny D. Cano-Lewica-
uruchomienie VBox jako usługi nie ukryje okna. możesz jednak zminimalizować go automatycznie do zasobnika systemowego za pomocą AWM: eusing.com/WindowManager/WindowManager.htm
15
kasa „VBoxHeadless” do uruchamiania maszyn wirtualnych bez interfejsu użytkownika. Musisz użyć RDP, jeśli chcesz zobaczyć ekran maszyny wirtualnej.
Mark Porter
13
To nie jest usługa. Uruchamia to VBox tylko po zalogowaniu - nie po włączeniu urządzenia. VBoxHeadless to sposób na uruchomienie jako usługa. Zobacz moją odpowiedź poniżej (którą zamierzam poprawić według komentarza Aarona Copleya).
John Hart,
Odpowiedź nie ma nic wspólnego z działaniem jako usługa. Uruchomienie następuje po zalogowaniu użytkownika, zupełnie inaczej niż zachowanie usług.
Felice Pollano
10

Zauważ, że aktualnie akceptowana odpowiedź (Molly7244) faktycznie uruchamia maszynę wirtualną podczas logowania - a nie podczas uruchamiania komputera. Innymi słowy, nie jest to usługa.

Do rzeczywistej usługi, która działa podczas uruchamiania komputera, używam dwóch skryptów (oryginalnie stąd ) w połączeniu z cygwin (cygrunsrv). Wykorzystuje tryb VBoxHeadless, jak wspomniano w innym miejscu na tej stronie.

Pierwszy skrypt uruchamia maszynę wirtualną za pośrednictwem VBoxHeadless; pobiera nazwę odpowiedniej maszyny wirtualnej do uruchomienia (i inne informacje, takie jak katalog domowy VBOX) ze zmiennych środowiskowych. Drugi skrypt instaluje usługę dla konkretnej maszyny wirtualnej (używając cygrunsrv do wywołania pierwszego skryptu z ustawionym właściwym ustawieniem środowiska env). Wreszcie jest trzeci plik, który zawiera typowe funkcje. Jeśli umieścisz je wszystkie w jednym katalogu, możesz zainstalować nowy vm w następujący sposób:

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

Następnie uruchom usługę za pomocą polecenia „net start vboxd-MyVMName” lub „cygrunsrv -S vboxd-MyVMName”.

Oto skrypt działający na maszynie wirtualnej „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"

A oto skrypt instalatora „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"

I na koniec, oto skrypt „.libcommon”, do którego odwołują się oba:

# -*-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\""
}

To rozwiązanie działa świetnie dla mnie; mam nadzieję, że będziesz miał podobne szczęście.

John Hart
źródło
4
+1 za „nie usługę” ... -1 za linkowanie do rozwiązania zamiast włączenia go w odpowiedzi. Głosowanie jest zerowe. :) Zastanów się nad zmianą w celu włączenia rozwiązania, ponieważ gnicie linków szkodzi długowieczności tej odpowiedzi.
Aaron Copley
8

Wygląda na to, że najprostszą odpowiedzią w tym momencie jest VBoxVMService . Jeszcze tego nie próbowałem, postaram się pamiętać, aby tu przyjechać i zaktualizować odpowiedź, jeśli / kiedy to zrobię.

Tao
źródło
1
nie działa jednak z 4.2.x
Archimedes Trajano
2
@ArchimedesTrajano Próbowałem bieżącej wersji (4.1) z VirtualBox 4.3.6 i działa dobrze. Strona projektu twierdzi, że została „przepisana prawie od zera” .
Melebius
1
Tak, właśnie przetestowałem to zeszłej nocy i działa! Pamiętaj tylko o ponownym uruchomieniu.
Archimedes Trajano,
4

Uzgodnione w sprawie VBoxVMService. Jest bardzo łatwy w konfiguracji i wydaje się, że działa dobrze. Tutaj znajdziesz informacje na temat konfiguracji:

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

**** EDYCJA **** Zgodnie z poniższym wnioskiem streszczenie linku. Chociaż rozwiązanie zadziałało dla mnie, uznanie należy się Peterowi Upfoldowi - http://peter.upfold.org.uk/

  • Zainstaluj Virtualbox i skonfiguruj maszynę wirtualną, aby akceptowała sesje RDP.
  • Pobierz i zainstaluj VBoxVmService w C: \ vms. Tylko Google VBoxVmService dla linku do pobrania (przepraszam, za mało rep, aby opublikować więcej niż 2 linki).
  • Edytuj plik ini VBoxVmService w C: \ vms:

[Ustawienia]

ServiceName = VBoxVmService

VBOX_USER_HOME = C: \ Users \ Administrator.VirtualBox

RunAsUser =. \ Administrator

UserPassword = entereryourpasswordhere

RunWebService = nie

PauseShutdown = 5000

[Vm0] VmName = nazwa maszyny wirtualnej w VirtualBox

ShutdownMethod = savestate

AutoStart = tak

  • Zastąp w VBOX_USER_HOME folderem .VirtualBox w odpowiednim katalogu domowym użytkownika, a także dyrektywami RunAsUser i UserPassword, i ustaw nazwę docelowej maszyny wirtualnej w aplikacji VirtualBox w VmName. Możesz także dodać dodatkowe sekcje [Vmx] po [Vm0] z innymi maszynami wirtualnymi, aby uruchomić po uruchomieniu komputera.

  • Gdy konfiguracja jest zadowalająca, z poziomu wiersza polecenia włączonego przez administratora uruchom następujące polecenie, aby zainstalować usługę. Po zainstalowaniu usługi możesz usunąć hasło użytkownika z pliku INI, ponieważ jest ono zapisywane w konfiguracji usługi:

C: \ vms \ VmServiceControl.exe -i

  • Teraz musisz ponownie uruchomić komputer przed próbą uruchomienia usługi po raz pierwszy, w przeciwnym razie nie będzie w stanie zlokalizować maszyn wirtualnych.

  • Po ponownym uruchomieniu usługa powinna zostać uruchomiona (z zastrzeżeniem opóźnienia „Automatyczny (opóźniony start)”), a maszyny wirtualne zostaną uruchomione podczas rozruchu.

RooiWillie
źródło
1
Czy możesz streścić link w swojej odpowiedzi na wypadek, gdyby padł?
jonsca
Wpis edytowany zgodnie z prośbą.
RooiWillie,
czy to działa w wersji VirtualBox 4.2.x?
Archimedes Trajano,
Te instrukcje prawdopodobnie dotyczą niektórych starszych wersji, obecna wersja VBoxVmService (4.1) jest łatwiejsza do skonfigurowania i poprowadzi cię przez cały proces.
Melebius
2

Po prostu oferuję to jako kolejną opcję:

Użyj wbudowanego polecenia systemu Windows „sc”, aby utworzyć usługę. Połącz to z „vboxheadless” przeniesie Cię tam, gdzie chcesz być.

Nie testowałem konkretnie z vboxheadless, ale stworzyłem usługę testową, która uruchamia calc.exe. Powinieneś robić coś takiego:

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

Aby uzyskać więcej informacji, zapoznaj się z dokumentacją sc. Uwaga: Te spacje po znaku równości są zamierzone.

Aaron Copley
źródło
Spowoduje to prawidłowe uruchomienie usługi, ale spowoduje awarię maszyny Wirtualnej po zatrzymaniu usługi - VBoxHeadless nie może poprawnie zinterpretować kontroli zatrzymania usługi, więc system Windows poczeka na przekroczenie limitu czasu, a następnie wymusi zabicie procesu, co nie jest idealne. Zobacz inne odpowiedzi na skrypty opakowania, aby temu zapobiec.
Aaron Miller
Dziękuję za komentarz. Mamy nadzieję, że zostanie to przesłane do programistów jako prośba o poprawienie błędu / dodanie funkcji.
Aaron Copley
1

Jeśli skrypty vboxd przysparzają Ci tyle samo kłopotów co mi, możesz spróbować tego; jest to raczej prostsze rozwiązanie, zaimplementowane w Perlu, które zapewnia tę samą funkcjonalność. W szczególności maszyna wirtualna uruchamia się z systemem (zakładając, że usługa jest ustawiona na automatyczne uruchamianie, co jest ustawieniem domyślnym) i spada automatycznie po zatrzymaniu usługi.

Główne różnice w stosunku do rozwiązania vboxd, poza tym, że z mojego doświadczenia jest znacznie prostszy, to to, że ten skrypt nie przekazuje ustawienia portu VRDE do VBoxHeadless, a zamknięcie maszyny wirtualnej jest obsługiwane za pomocą „acpipowerbutton” zamiast „savestate” .

Jeśli to nie pasuje do twoich celów, łatwo to zmienić; w pierwszym przypadku dodaj „-e” TCP / Ports = [, port ...] ”do ciągu wiersza poleceń VBoxHeadless ($ cmd), aw drugim przypadku po prostu zmień„ acpipowerbutton ”na„ savestate ”w moduł obsługi SIGTERM.

Oto skrypt Perla:

 #!/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";

A oto wiersz polecenia cygrunsrv, którego użyłem do zainstalowania usługi 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

Stamtąd powinno być po prostu kwestia wydania „sc start <nazwa-usługi>” i powinieneś zacząć - pamiętaj, że domyślnie dziennik usług cygrunsrv loguje się do / var / log / <nazwa-usługi> .log, więc jeśli coś źle się zachowuje, jest to pierwsze miejsce, w którym można znaleźć powód.

Należy pamiętać, że kiedy uruchomisz maszynę wirtualną w ten sposób, będzie ona działać pod wbudowanym kontem SYSTEM, a nie z własnym. W takim przypadku nie będzie można administrować maszyną wirtualną za pośrednictwem konsoli VirtualBox, gdy działa ona jako usługa; Wygląda na to, że jest w stanie „Wyłączony” i nie będzie można przejść do jego ustawień. (Próba włączenia maszyny wirtualnej, gdy jest uruchomiona jako usługa, nie jest zalecana - nie wiem, co się stanie, ale w najlepszym razie będzie to brak możliwości działania, aw najgorszym przypadku doprowadzi do jej połączenia z maszyną wirtualną.) Jeśli musisz zmienić ustawienia maszyny Wirtualnej lub uzyskać dostęp do konsoli, najpierw zatrzymaj usługę (i poczekaj na zamknięcie VBoxHeadless.exe), a następnie skonfiguruj ją / włącz w konsoli VirtualBox, jak zwykle.

Prawdopodobnie możesz rozwiązać ten problem, instalując drugą usługę interaktywną w celu uruchomienia konsoli VirtualBox; ponieważ uruchomiłoby to również konsolę na koncie SYSTEM, najprawdopodobniej byłby w stanie zobaczyć działającą maszynę wirtualną i nią zarządzać. Sam nie musiałem tego robić, więc nie jestem pewien, czy to zadziała, ale nie widzę powodu, dla którego by to nie działało. (Jeśli spróbujesz, byłbym wdzięczny za komentarz do tej odpowiedzi, informujący mnie, jak Ci się udało. Dzięki!)

Mam nadzieję że to pomoże!

Aaron Miller
źródło
Twój skrypt jest prostszy, ale wymaga Perla i twardego kodu kilku właściwości, które skrypt vboxd przyjmuje jako parametry. Według virtualbox.org/manual/ch07.html , nie akceptując portu VRDE, VBoxHeadless nie uruchomi maszyny wirtualnej (po prostu blokuje się na czas nieokreślony), jeśli maszyna wirtualna jest ustawiona na używanie domyślnego portu, z którego korzysta inny serwer RDP. vboxd-installjest pomocne, ponieważ wygodnie ukrywa szczegóły argumentów cygrunsrv. Zgadzam się jednak, że acpipowerbuttonjest to lepsza opcja „stop” niż savestate.
Derek Mahar
@DerekMahar Podejmij, że cokolwiek jest warte, jak sądzę. Ponieważ nie działa na niczym nowszym niż XP, wątpię, czy to w każdym razie o wiele więcej. ¯ \ _ (ツ) _ / ¯ Dziękujemy za opinię!
Aaron Miller,
Aaron Miller, czy masz na myśli, że twój skrypt lub vboxd nie działa na żadnym systemie Windows nowszym niż XP? Zakładam, że masz na myśli twój skrypt, ponieważ uruchomiłem vboxd do pracy w systemie Windows 10 z VirtualBox 5.1.6.
Derek Mahar
@DerekMahar Mam na myśli mój skrypt, a nie vboxd.
Aaron Miller,