Si las secuencias de comandos de vboxd le causan tantos problemas como a mí, puede intentar esto; Es una solución bastante simple, implementada en Perl, que proporciona la misma funcionalidad. Específicamente, la VM se inicia con el sistema (suponiendo que el servicio está configurado para iniciarse automáticamente, que es el predeterminado), y se desactiva limpiamente cuando se detiene el servicio.
Las principales diferencias con respecto a la solución vboxd, además de ser considerablemente más simple de tratar en mi experiencia, son que este script no pasa una configuración de puerto VRDE a VBoxHeadless, y que el apagado de VM se maneja a través de "acpipowerbutton" en lugar de "savestate" .
Si esto no se ajusta a sus propósitos, es bastante fácil cambiarlo; en el primer caso, agregue '-e "TCP / Ports = [, port ...]"' a la cadena de línea de comando VBoxHeadless ($ cmd), y en el segundo caso, simplemente cambie "acpipowerbutton" a "savestate" en el manejador SIGTERM.
Aquí está el script de 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";
Y aquí está la línea de comando cygrunsrv que utilicé para instalar el servicio de 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
A partir de ahí, solo debería ser cuestión de emitir 'sc start <service-name>', y debería ser bueno para ir; recuerde que, de forma predeterminada, los servicios de cygrunsrv inician sesión en / var / log / <service-name> .log, así que si algo se comporta mal, ese es el primer lugar para buscar una razón.
Una cosa a tener en cuenta es que, cuando ejecuta la VM de esta manera, se ejecutará bajo la cuenta del SISTEMA incorporado, en lugar de la suya. Siendo este el caso, no podrá administrar la VM a través de la consola VirtualBox mientras se ejecuta como un servicio; parecerá estar en el estado "Apagado" y no podrá acceder a su configuración. ( No se recomienda intentar encender la VM mientras se está ejecutando como servicio ; no sé qué sucederá, pero en el mejor de los casos será un no-op, y en el peor de los casos, controlará su VM). Si necesita cambiar la configuración de la VM o acceder a la consola, primero detenga el servicio (y espere a que salga VBoxHeadless.exe) y luego configúrelo / enciéndalo en la consola VirtualBox como lo haría normalmente.
Probablemente podría resolver este problema instalando un segundo servicio interactivo para ejecutar la consola VirtualBox; dado que eso también ejecutaría la consola con la cuenta SYSTEM, lo más probable es que pueda ver y administrar la VM en ejecución. No he tenido la necesidad de hacerlo yo mismo, así que no estoy seguro de que funcione, pero no veo una razón por la que no lo haría. (Si lo intentas, agradecería un comentario a esta respuesta, que me haga saber cómo te fue. ¡Gracias!)
¡Espero que esto ayude!