Si les scripts de vboxd vous posent autant de problèmes qu'à moi, vous pouvez essayer ceci ; c'est une solution plutôt simple, implémentée en Perl, qui fournit la même fonctionnalité. Plus précisément, la VM démarre avec le système (en supposant que le service est configuré pour démarrer automatiquement, ce qui est le cas par défaut), et s'arrête proprement lorsque le service est arrêté.
Les principales différences par rapport à la solution vboxd, outre le fait qu'elle est considérablement plus simple à gérer selon mon expérience, sont que ce script ne passe pas un paramètre de port VRDE à VBoxHeadless, et que l'arrêt de la VM est géré via "acpipowerbutton" plutôt que "savestate".
Si cela ne vous convient pas, il est assez facile de le modifier ; dans le premier cas, ajoutez '-e "TCP/Ports=[,port...]"' à la chaîne de la ligne de commande VBoxHeadless ($cmd), et dans le second cas, remplacez simplement "acpipowerbutton" par "savestate" dans le gestionnaire SIGTERM.
Voici le script en 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";
Et voici la ligne de commande cygrunsrv que j'ai utilisée pour installer le service 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 là, il devrait juste être question de lancer 'sc start <service-name>', et vous devriez être prêt à partir -- rappelez-vous que, par défaut, les services cygrunsrv enregistrent dans /var/log/<service-name>.log, donc si quelque chose se comporte mal, c'est le premier endroit où chercher la raison.
Une chose à garder à l'esprit est que, lorsque vous exécutez la VM de cette façon, elle sera exécutée sous le compte SYSTEM intégré, plutôt que sous votre propre compte. Ceci étant, vous ne pourrez pas administrer la VM via la console VirtualBox pendant qu'elle fonctionne comme un service ; elle semblera être dans l'état "Powered off", et vous ne pourrez pas accéder à ses paramètres. (Essayer de mettre en marche la VM alors qu'elle fonctionne comme un service est non recommandé -- Je ne sais pas ce qui se passera, mais au mieux, ce sera un no-op, et au pire, ça hose votre VM). Si vous avez besoin de modifier les paramètres de la VM ou d'accéder à la console, arrêtez d'abord le service (et attendez que VBoxHeadless.exe se termine), puis configurez-le ou allumez-le dans la console VirtualBox comme vous le feriez normalement.
Vous pourriez probablement résoudre ce problème en installant un deuxième service interactif pour exécuter la console VirtualBox ; puisque cela exécuterait la console sous le compte SYSTEM également, il serait très probablement en mesure de voir et de gérer la VM en cours d'exécution. Je n'ai pas eu besoin de faire cela moi-même, donc je ne suis pas sûr que cela fonctionnerait, mais je ne vois pas pourquoi cela ne fonctionnerait pas. (Si vous essayez, j'apprécierais un commentaire à cette réponse, me faisant savoir comment cela a fonctionné pour vous. Merci)
J'espère que cela vous aidera !