Come posso eseguire una macchina VirtualBox come servizio su Windows XP?


13

Ho una macchina VirtualBox con Windows XP su un host Windows XP.

Come posso avviare VirtualBox come servizio, in modo da avere una macchina virtuale nascosta e non devo avviare VirtualBox per accedere alla mia macchina virtuale (tramite VNC dalla rete)?

Ho scoperto che VirtualBox Manage potrebbe essere la strada da percorrere, ma dato che sono un principiante con questo, non so da dove cominciare.

Qualche idea?

Risposte:


0

Crea un collegamento a C:\Program Files\innotek VirtualBox\VBoxManage.exe

Dopo le virgolette inserire: startvm <your virtual machine name>

Esempio:

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

Copia / sposta il collegamento nella cartella di avvio.

ps: se vuoi ritardare la Macchina Virtuale fino al completo avvio del tuo sistema, puoi farlo in XP tramite Startup Delayer .


Sembra funzionare bene, c'è comunque un modo per "nascondere" la finestra anche per la macchina virtuale, quindi funziona più come un servizio Windows?
Jhonny D. Cano -Leftware-

l'esecuzione di VBox come servizio non nasconderà la finestra. puoi minimizzarlo automaticamente sulla barra delle applicazioni con AWM: eusing.com/WindowManager/WindowManager.htm

15
checkout "VBoxHeadless" per l'avvio di VM senza interfaccia utente. Sarà necessario utilizzare RDP se si desidera visualizzare la schermata della VM.
Mark Porter,

13
Questo non è un servizio Questo esegue VBox solo quando si accede, non quando la macchina è accesa. VBoxHeadless è la strada da percorrere per l'esecuzione come servizio. Vedi la mia risposta di seguito (che sto per migliorare secondo il commento di Aaron Copley).
John Hart,

La risposta non ha nulla a che fare con l'esecuzione come servizio. L'avvio avviene dopo l'accesso dell'utente, completamente diverso dal comportamento dei servizi.
Felice Pollano,

10

Si noti che la risposta attualmente accettata (Molly7244) avvia effettivamente la macchina virtuale quando si accede, non quando si avvia la macchina. In altre parole, non è un servizio.

Per un servizio effettivo che viene eseguito all'avvio della macchina, utilizzo due script (originariamente da qui ) in combinazione con cygwin (cygrunsrv). Utilizza la modalità VBoxHeadless come menzionato altrove in questa pagina.

Il primo script esegue la VM tramite VBoxHeadless; ottiene il nome della VM giusta da eseguire (e altre informazioni come la home directory della VBOX) dalle variabili di ambiente. Il secondo script installa un servizio per una particolare macchina virtuale (usando cygrunsrv per chiamare il primo script con il set di variabili corretto). Infine c'è un terzo file che contiene funzioni comuni. Se metti insieme tutti questi in una directory, puoi installare una nuova vm in questo modo:

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

E quindi avviare il servizio con "net start vboxd-MyVMName" o "cygrunsrv -S vboxd-MyVMName".

Ecco lo script con 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"

Ed ecco lo script di installazione, "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"

E, infine, ecco lo script ".libcommon" a cui fanno riferimento entrambi:

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

Questa soluzione funziona alla grande per me; spero che avrai fortuna simile.


4
+1 per "non un servizio" ... -1 per il collegamento alla soluzione anziché includerla nella risposta. Il voto è nullo. :) Prendi in considerazione la possibilità di rivedere per includere la soluzione poiché il marciume del collegamento è dannoso per la longevità di questa risposta.
Aaron Copley,

8

Sembra che la risposta più semplice a questo punto sia VBoxVMService . Non l'ho ancora provato, cercherò di ricordare di venire qui e aggiornare la risposta se / quando lo faccio.


1
tuttavia non funziona con 4.2.x
Archimede Trajano,

2
@ArchimedesTrajano Ho provato la versione corrente (4.1) con VirtualBox 4.3.6 e funziona bene. La pagina del progetto afferma che è stato "riscritto quasi da zero" .
Melebio

1
Sì, l'ho appena provato ieri sera e funziona! Ricorda solo di riavviare.
Archimede Trajano,

4

Concordato su VBoxVMService. È davvero facile da configurare e sembra funzionare bene. Puoi trovare un come impostarlo qui:

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

**** MODIFICA **** Secondo la richiesta di seguito, un riepilogo del collegamento. Sebbene la soluzione abbia funzionato per me, il merito va a Peter Upfold - http://peter.upfold.org.uk/

  • Installa Virtualbox e configura la VM per accettare le sessioni RDP.
  • Scarica e installa VBoxVmService in C: \ vms. Solo Google VBoxVmService per un link per il download (scusate, non abbastanza rappresentante per pubblicare più di 2 link).
  • Modifica il file ini di VBoxVmService in C: \ vms:

[Impostazioni]

ServiceName = VBoxVmService

VBOX_USER_HOME = C: \ Users \ Administrator.VirtualBox

RunAsUser =. \ Administrator

UserPassword = enteryourpasswordhere

RunWebService = no

PauseShutdown = 5000

[Vm0] VmName = nome della VM in VirtualBox

ShutdownMethod = SaveState

Avvio automatico = yes

  • Sostituire in VBOX_USER_HOME con la cartella .VirtualBox nella directory home dell'utente corretta, nonché le direttive RunAsUser e UserPassword e impostare il nome della macchina virtuale di destinazione nell'app VirtualBox in VmName. È inoltre possibile aggiungere ulteriori sezioni [Vmx] dopo [Vm0] con altre macchine virtuali per l'avvio all'avvio della macchina.

  • Quando si è soddisfatti della propria configurazione, da un prompt dei comandi abilitato dall'amministratore, eseguire il comando seguente per installare il servizio. Una volta installato il servizio, è possibile rimuovere la password dell'utente dal file INI, poiché viene salvata nella configurazione del servizio:

C: \ vms \ VmServiceControl.exe -i

  • Ora è necessario riavviare il computer prima di tentare di avviare il servizio per la prima volta, altrimenti non sarà possibile individuare le macchine virtuali.

  • Al riavvio, il servizio dovrebbe avviarsi (soggetto al ritardo "Automatico (avvio ritardato)" e le macchine virtuali verranno avviate all'avvio.


1
Puoi riassumere il link all'interno della tua risposta nel caso in cui scompaia?
jonsca,

Post modificato come richiesto.
RooiWillie,

funziona sulla versione 4.2.x di VirtualBox?
Archimede Trajano,

Queste istruzioni probabilmente si applicano ad alcune versioni precedenti, la versione corrente di VBoxVmService (4.1) è più facile da configurare e ti guiderà attraverso il processo.
Melebio

2

Offrendo questo come un'altra opzione:

Utilizzare il comando incorporato di Windows 'sc' per creare un servizio. Combinalo con 'vboxheadless' ti porterà dove vuoi essere.

Non testato specificamente con vboxheadless, ma ho creato un servizio di test che esegue calc.exe. Dovresti fare qualcosa del genere:

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

Per ulteriori informazioni, consultare la documentazione di sc. Nota: quegli spazi dopo il segno di uguale sono intenzionali.


Questo avvierà il servizio correttamente, ma arresterà in modo anomalo la VM quando il servizio viene arrestato: VBoxHeadless non è in grado di interpretare correttamente il controllo di arresto del servizio, quindi Windows attenderà il timeout e quindi ucciderà forzatamente il processo, che è tutt'altro che ideale. Vedi altre risposte per gli script wrapper per evitare che ciò accada.
Aaron Miller,

Grazie per il commento. Eventualmente, questo viene inviato agli sviluppatori come una correzione di bug / richiesta di funzionalità.
Aaron Copley,

1

Se gli script vboxd ti stanno dando tanti problemi come me, potresti provare questo; è una soluzione piuttosto semplice, implementata in Perl, che offre le stesse funzionalità. In particolare, la VM si avvia con il sistema (presupponendo che il servizio sia impostato per l'avvio automatico, che è l'impostazione predefinita) e si arresta in modo pulito quando il servizio viene arrestato.

Le principali differenze rispetto alla soluzione vboxd, oltre ad essere notevolmente più semplice da gestire nella mia esperienza, sono che questo script non passa un'impostazione della porta VRDE a VBoxHeadless e che l'arresto della VM viene gestito tramite "acpipowerbutton" anziché "savestate" .

Se questo non soddisfa i tuoi scopi, è abbastanza facile cambiare; nel primo caso, aggiungi '-e "TCP / Ports = [, port ...]"' alla stringa della riga di comando VBoxHeadless ($ cmd), e nel secondo caso, cambia semplicemente "acpipowerbutton" in "savestate" in il gestore SIGTERM.

Ecco lo script 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";

Ed ecco la riga di comando di cygrunsrv che ho usato per installare il servizio 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

Da lì, dovrebbe essere solo una questione di 'sc start <nome-servizio>', e dovresti essere bravo ad andare - ricorda che, per impostazione predefinita, i servizi cygrunsrv accedono a / var / log / <nome-servizio> .log, quindi se qualcosa si comporta male, questo è il primo posto in cui cercare un motivo.

Una cosa da tenere a mente è che, quando si esegue la VM in questo modo, verrà eseguita con l'account SYSTEM integrato, anziché con il proprio. In questo caso, non sarai in grado di amministrare la VM tramite la console di VirtualBox mentre è in esecuzione come servizio; sembrerà essere nello stato "Spento" e non sarai in grado di accedere alle sue impostazioni. (Cercando di accendere il VM mentre è in esecuzione come un servizio è sconsigliato - Non so cosa accadrà, ma nella migliore delle ipotesi sarà un no-op, e nel peggiore dei casi che sarà hose vostro VM.) Se è necessario modificare le impostazioni della VM o accedere alla console, interrompere prima il servizio (e attendere l'uscita di VBoxHeadless.exe), quindi configurarlo / accenderlo nella console VirtualBox come si farebbe normalmente.

Probabilmente potresti risolvere questo problema installando un secondo servizio interattivo per eseguire la console di VirtualBox; dato che avrebbe eseguito anche la console con l'account SYSTEM, molto probabilmente sarebbe in grado di vedere e gestire la VM in esecuzione. Non ho avuto bisogno di farlo da solo, quindi non sono sicuro che avrebbe funzionato, ma non vedo un motivo per cui non lo farebbe. (Se lo provi, apprezzerei un commento a questa risposta, facendomi sapere come ha funzionato per te. Grazie!)

Spero che sia di aiuto!


Il tuo script è più semplice, ma richiede Perl e hard-code diverse proprietà che lo script vboxd accetta come parametri. Secondo virtualbox.org/manual/ch07.html , non accettando la porta VRDE, VBoxHeadless non eseguirà la VM (si blocca solo indefinitamente) se la VM è impostata per utilizzare la porta predefinita utilizzata da un altro server RDP. vboxd-installè utile perché nasconde convenientemente i dettagli dell'argomento di cygrunsrv. Sono d'accordo, tuttavia, che acpipowerbuttonè un'opzione "stop" migliore di savestate.
Derek Mahar,

@DerekMahar Prendilo per quello che vale, suppongo. Dal momento che non funziona su nulla di più recente di XP, dubito che sia comunque molto. ¯ \ _ (ツ) _ / ¯ Grazie per il feedback!
Aaron Miller,

Aaron Miller, vuoi dire che il tuo script o vboxd non funziona su Windows più recente di XP? Suppongo che intendi il tuo script perché ho fatto funzionare vboxd su Windows 10 con VirtualBox 5.1.6.
Derek Mahar,

@DerekMahar Intendo il mio script, non vboxd.
Aaron Miller,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.