Jika skrip vboxd memberi Anda banyak masalah seperti yang saya lakukan, Anda mungkin ingin mencoba ini; ini adalah solusi yang lebih sederhana, diimplementasikan dalam Perl, yang menyediakan fungsionalitas yang sama. Secara khusus, VM memulai dengan sistem (dengan asumsi layanan diatur untuk memulai secara otomatis, yang merupakan default), dan turun dengan bersih ketika layanan dihentikan.
Perbedaan utama dari solusi vboxd, selain menjadi jauh lebih mudah untuk ditangani dalam pengalaman saya, adalah bahwa skrip ini tidak meneruskan pengaturan port VRDE ke VBoxHeadless, dan bahwa penutupan VM ditangani melalui "acpipowerbutton" daripada "savestate" .
Jika ini tidak sesuai dengan tujuan Anda, cukup mudah untuk berubah; dalam kasus pertama, tambahkan '-e "TCP / Ports = [, port ...]"' ke string baris perintah VBoxHeadless ($ cmd), dan dalam kasus kedua, cukup ubah "acpipowerbutton" menjadi "savestate" di pengendali SIGTERM.
Berikut skrip 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";
Dan inilah baris perintah cygrunsrv yang saya gunakan untuk menginstal layanan 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
Dari sana, seharusnya hanya masalah mengeluarkan 'sc start <service-name>', dan Anda harus melakukannya dengan baik - ingat bahwa, secara default, layanan cygrunsrv masuk ke / var / log / <service-name> .log, jadi jika ada yang tidak pantas, itulah tempat pertama untuk mencari alasan mengapa.
Satu hal yang perlu diingat adalah bahwa, ketika Anda menjalankan VM dengan cara ini, itu akan berjalan di bawah akun SISTEM bawaan, bukan milik Anda. Karena itu, Anda tidak akan dapat mengelola VM melalui konsol VirtualBox saat sedang berjalan sebagai layanan; itu akan tampak dalam keadaan "dimatikan", dan Anda tidak akan bisa mendapatkan pengaturannya. (Mencoba untuk menyalakan VM saat sedang berjalan sebagai layanan tidak dianjurkan - Saya tidak tahu apa yang akan terjadi, tetapi yang terbaik itu akan menjadi no-op, dan paling buruk itu akan menyemprotkan VM Anda.) Jika Anda perlu mengubah pengaturan VM atau mengakses konsol, hentikan layanan terlebih dahulu (dan tunggu VBoxHeadless.exe untuk keluar), lalu konfigurasikan / nyalakan di konsol VirtualBox seperti biasanya.
Anda mungkin dapat mengatasi masalah ini dengan menginstal layanan interaktif kedua untuk menjalankan konsol VirtualBox; karena itu akan menjalankan konsol di bawah akun SISTEM juga, itu kemungkinan besar akan dapat melihat dan mengelola VM yang berjalan. Saya belum memiliki kebutuhan untuk melakukan itu sendiri, jadi saya tidak yakin itu akan berhasil, tetapi saya tidak melihat alasan mengapa itu tidak berhasil. (Jika Anda mencobanya, saya akan menghargai komentar untuk jawaban ini, membiarkan saya tahu bagaimana cara kerjanya untuk Anda. Terima kasih!)
Semoga ini membantu!