Якщо сценарії vboxd доставлять вам стільки проблем, як і мені, ви можете спробувати це; це досить просте рішення, реалізоване в Perl, яке забезпечує однаковий функціонал. Зокрема, VM запускається з системою (якщо припустити, що послуга встановлена для запуску автоматично, що є за замовчуванням), і опускається чисто при зупинці служби.
Основні відмінності від рішення vboxd, окрім того, що значно простіше розібратися в моєму досвіді, полягають у тому, що цей скрипт не передає налаштування порту VRDE VBoxHeadless, і що відключення VM обробляється через "acpipowerbutton", а не "savestate" .
Якщо це не відповідає вашим цілям, це досить просто змінити; у першому випадку додайте '-e "TCP / Ports = [, порт ...]"' в рядок командного рядка 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 / <service-name> .log, тож якщо щось погано поводиться, це в першу чергу шукати причину.
Слід пам’ятати, що коли ви запускаєте VM таким чином, він буде працювати під вбудованим обліковим записом SYSTEM, а не вашим власним. У цьому випадку ви не зможете керувати VM через консоль VirtualBox, поки він працює як послуга; воно, здається, перебуває у стані "Вимкнено", і ви не зможете дістатися до його налаштувань. (Не намагаються ввімкнути VM, поки він працює як послуга, не рекомендується. Я не знаю, що станеться, але в кращому випадку це буде неоперація, а в гіршому випадку - шланг вашого VM.) Якщо вам потрібно змінити налаштування VM або отримати доступ до консолі, спочатку зупиніть службу (і дочекайтеся виходу VBoxHeadless.exe), а потім налаштуйте її / увімкніть її в консолі VirtualBox як зазвичай.
Можливо, ви могли б вирішити цю проблему, встановивши другий інтерактивний сервіс для запуску консолі VirtualBox; оскільки це також запустило б консоль під обліковим записом SYSTEM, вона, швидше за все, зможе побачити та керувати працюючою машиною управління. У мене не було потреби робити це самостійно, тому я не впевнений, що це спрацює, але я не бачу причини, чому б цього не було. (Якщо ви спробуєте це, я буду вдячний за коментар до цієї відповіді, давши мені знати, як це склалося для вас. Дякую!)
Сподіваюся, це допомагає!