Wenn Sie mit den vboxd-Skripten genauso Probleme haben wie mit mir, können Sie dies versuchen. Es ist eine einfachere Lösung, die in Perl implementiert ist und die gleiche Funktionalität bietet. Insbesondere startet die VM mit dem System (vorausgesetzt, der Dienst wird automatisch gestartet, was die Standardeinstellung ist) und geht sauber aus, wenn der Dienst beendet wird.
Die Hauptunterschiede zur vboxd-Lösung bestehen darin, dass dieses Skript meiner Erfahrung nach keine VRDE-Porteinstellung an VBoxHeadless übergibt und das Herunterfahren der VM über "acpipowerbutton" und nicht über "savestate" erfolgt. .
Wenn dies nicht zu Ihren Zwecken passt, können Sie es leicht ändern. Fügen Sie im ersten Fall der VBoxHeadless-Befehlszeilenzeichenfolge ($ cmd) '-e "TCP / Ports = [, port ...]" hinzu, und ändern Sie im zweiten Fall "acpipowerbutton" in "savestate" der SIGTERM-Handler.
Hier ist das Perl-Skript:
#!/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";
Und hier ist die cygrunsrv-Befehlszeile, mit der ich den Windows-Dienst installiert habe:
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
Von da an sollte es nur noch darum gehen, 'sc start <Dienstname>' auszugeben, und Sie sollten bereit sein - denken Sie daran, dass sich cygrunsrv-Dienste standardmäßig in / var / log / <Dienstname> anmelden .log. Wenn sich also etwas schlecht verhält, ist dies der erste Ort, an dem Sie nach einem Grund suchen.
Beachten Sie, dass die VM auf diese Weise unter dem integrierten SYSTEM-Konto und nicht unter Ihrem eigenen Konto ausgeführt wird. In diesem Fall können Sie die VM nicht über die VirtualBox-Konsole verwalten, während sie als Dienst ausgeführt wird. Es scheint sich im Status "Ausgeschaltet" zu befinden, und Sie können nicht zu den Einstellungen gelangen. (Der Versuch, die VM einzuschalten, während sie als Dienst ausgeführt wird, wird nicht empfohlen. Ich weiß nicht, was passieren wird, aber im besten Fall ist es ein No-Op, und im schlimmsten Fall wird Ihre VM damit überlastet.) Wenn Sie die Einstellungen der VM ändern oder auf die Konsole zugreifen müssen, beenden Sie zuerst den Dienst (und warten Sie, bis VBoxHeadless.exe beendet ist) und konfigurieren Sie ihn / schalten Sie ihn in der VirtualBox-Konsole wie gewohnt ein.
Sie könnten dieses Problem wahrscheinlich lösen, indem Sie einen zweiten interaktiven Dienst installieren, um die VirtualBox-Konsole auszuführen. Da die Konsole dann auch unter dem SYSTEM-Konto ausgeführt wird, kann sie die ausgeführte VM höchstwahrscheinlich sehen und verwalten. Ich musste das nicht selbst tun, also bin ich mir nicht sicher, ob es funktionieren würde, aber ich sehe keinen Grund, warum es nicht funktionieren würde. (Wenn du es versuchst, würde ich mich über einen Kommentar zu dieser Antwort freuen und mich wissen lassen, wie es für dich funktioniert hat. Danke!)
Hoffe das hilft!