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!