Если сценарии vboxd доставляют вам столько же хлопот, сколько и мне, вы можете попробовать это; это довольно простое решение, реализованное в Perl, которое обеспечивает ту же функциональность. В частности, виртуальная машина запускается вместе с системой (при условии, что служба настроена на автоматический запуск (по умолчанию)) и полностью отключается при остановке службы.
Основными отличиями от решения vboxd, помимо того, что по моему опыту с ним значительно проще справиться, является то, что этот сценарий не передает настройку порта VRDE в VBoxHeadless и что завершение работы виртуальной машины обрабатывается с помощью "acpipowerbutton", а не "savestate" ,
Если это не соответствует вашим целям, это достаточно легко изменить; в первом случае добавьте '-e "TCP/Ports = [, port ...]"' к строке командной строки VBoxHeadless ($ cmd), а во втором случае просто измените "acpipowerbutton" на "savestate" в обработчик SIGTERM.
Вот скрипт 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";
А вот командная строка cygrunsrv, которую я использовал для установки службы 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
Оттуда, это должно быть просто вопросом 'sc start <имя-службы>', и вы должны быть готовы - помните, что по умолчанию службы cygrunsrv записывают в /var /log /<имя-службы> .log, так что если что-то плохо себя ведет, это первое место, где нужно искать причину.
Следует помнить одну вещь: когда вы запускаете виртуальную машину таким образом, она будет работать под встроенной учетной записью SYSTEM, а не под вашей собственной. В этом случае вы не сможете администрировать виртуальную машину через консоль VirtualBox, пока она работает как служба; он будет находиться в состоянии "Выключен", и вы не сможете перейти к его настройкам. (Попытка включить виртуальную машину, пока она работает в качестве службы, не рекомендуется - я не знаю, что произойдет, но в лучшем случае это будет неработоспособность, а в худшем случае это приведет к повреждению вашей виртуальной машины.) Если вам нужно изменить настройки виртуальной машины или получить доступ к консоли, сначала остановите службу (и дождитесь выхода VBoxHeadless.exe), а затем настройте его / включите его в консоли VirtualBox, как обычно.
Вероятно, вы могли бы решить эту проблему, установив второй интерактивный сервис для запуска консоли VirtualBox; так как это также будет запускать консоль под учетной записью SYSTEM, она, скорее всего, сможет видеть и управлять работающей виртуальной машиной. У меня не было необходимости делать это самому, поэтому я не уверен, что это сработает, но я не вижу причины, по которой это не сработает. (Если вы попробуете это, я буду благодарен за комментарий к этому ответу, который даст мне знать, как это сработало для вас. Спасибо!)
Надеюсь это поможет!