Vboxd komut dosyaları size yaptıkları kadar sorun veriyorsa, bunu denemek isteyebilirsiniz; aynı işlevselliği sağlayan Perl'de uygulanan oldukça basit bir çözümdür. Özellikle, VM sistemle başlar (servisin otomatik olarak başlayacak şekilde ayarlandığı varsayılır, bu varsayılan değerdir) ve servis durdurulduğunda temiz bir şekilde kapanır.
Deneyimlerimle başa çıkmak için oldukça basit olmasının yanı sıra, vboxd çözümünün önemli farklılıkları, bu komut dosyasının VBoxHeadless'a bir VRDE bağlantı noktası ayarı geçirmemesi ve VM'nin kapatılmasının "savestate" yerine "acpipowerbutton" aracılığıyla ele alınmasıdır. .
Bu amaçlarınıza uygun değilse, değiştirmek yeterince kolaydır; ilk durumda, VBoxHeadless komut satırı dizesine ($ cmd) '-e "TCP / Ports = [, port ...]"' ekleyin ve ikinci durumda "acpipowerbutton" ifadesini "savestate" olarak değiştirin. SIGTERM işleyici.
İşte Perl betiği:
#!/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";
İşte Windows hizmetini yüklemek için kullandığım cygrunsrv komut satırı:
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
Oradan, sadece 'sc start <service-name>' yayınlamak gerekir ve gitmek için iyi olmalısınız - varsayılan olarak cygrunsrv hizmetlerinin / var / log / <service-name> .log, eğer bir şey yanlış davranırsa, bunun bir sebebini aramak için ilk yer burasıdır.
Akılda tutulması gereken bir şey, VM'yi bu şekilde çalıştırdığınızda, kendiniz yerine yerleşik SYSTEM hesabı altında çalışacağıdır. Bu durumda, bir hizmet olarak çalışırken VM'yi VirtualBox konsolu üzerinden yönetemezsiniz; "Güç kapalı" durumundaymış gibi görünür ve ayarlarına erişemezsiniz. (Bir hizmet olarak çalışırken VM'yi açmaya çalışmak önerilmez - ne olacağını bilmiyorum, ama en iyisi bir operasyon olmayacak ve en kötüsü VM'nizi hortumlayacaktır.) VM ayarlarını değiştirmeniz veya konsola erişmeniz gerekiyorsa, önce hizmeti durdurun (ve VBoxHeadless.exe dosyasının çıkmasını bekleyin) ve ardından yapılandırın / VirtualBox konsolunda normalde olduğu gibi açın.
Bu sorunu muhtemelen, VirtualBox konsolunu çalıştırmak için ikinci bir etkileşimli hizmet yükleyerek çözebilirsiniz; Konsolu SYSTEM hesabı altında da çalıştıracağından, büyük olasılıkla çalışan VM'yi görebilir ve yönetebilir. Bunu kendim yapmaya ihtiyacım olmadı, bu yüzden işe yarayacağından emin değilim, ama neden olmasın. (Eğer denerseniz, bu cevaba yapılan bir yorum için minnettar olurum, sizin için nasıl çalıştığını bana bildiririm. Teşekkürler!)
Bu yardımcı olur umarım!