Se os scripts do vboxd estiverem lhe causando tantos problemas quanto eles, talvez você queira tentar isso; é uma solução bastante mais simples, implementada no Perl, que fornece a mesma funcionalidade. Especificamente, a VM inicia com o sistema (supondo que o serviço esteja configurado para iniciar automaticamente, que é o padrão) e fica inoperante quando o serviço é parado.
As principais diferenças em relação à solução vboxd, além de serem consideravelmente mais simples de lidar na minha experiência, são que esse script não passa uma configuração de porta VRDE para o VBoxHeadless e que o desligamento da VM é tratado pelo "botão acpipower" em vez de "savestate" .
Se isso não se adequar aos seus objetivos, é fácil mudar; no primeiro caso, adicione '-e "TCP / Ports = [, port ...]"' à string de linha de comando VBoxHeadless ($ cmd) e, no segundo caso, basta alterar "acpipowerbutton" para "savestate" em o manipulador SIGTERM.
Aqui está o 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";
E aqui está a linha de comando cygrunsrv que usei para instalar o serviço 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 daí, deve ser apenas uma questão de emitir 'sc start <nome do serviço>' e você deve estar pronto - lembre-se de que, por padrão, os serviços cygrunsrv registram-se em / var / log / <nome do serviço> .log, se algo se comportar mal, esse é o primeiro lugar para procurar um motivo.
Um aspecto a ter em mente é que, quando você executa a VM dessa maneira, ela será executada na conta SYSTEM interna, e não na sua. Sendo esse o caso, você não poderá administrar a VM pelo console do VirtualBox enquanto estiver sendo executado como um serviço; ele parecerá estar no estado "Desligado" e você não poderá acessar as configurações. ( Não é recomendável tentar ligar a VM enquanto ela estiver sendo executada como um serviço - não sei o que acontecerá, mas, na melhor das hipóteses, não será uma operação e, na pior das hipóteses, mangará sua VM.) Se você precisar alterar as configurações da VM ou acessar o console, pare o serviço primeiro (e aguarde a saída do VBoxHeadless.exe) e, em seguida, configure-o / ligue-o no console do VirtualBox como faria normalmente.
Você provavelmente poderia resolver esse problema instalando um segundo serviço interativo para executar o console do VirtualBox; uma vez que iria executar o console sob a conta SYSTEM assim, seria mais provável ser capaz de ver e gerenciar a máquina virtual em execução. Eu não precisei fazer isso sozinho, por isso não tenho certeza de que funcionaria, mas não vejo uma razão para isso não acontecer. (Se você tentar, agradeceria um comentário a esta resposta, informando como funcionou para você. Obrigado!)
Espero que isto ajude!