Nếu các tập lệnh vboxd mang lại cho bạn nhiều rắc rối như họ đã làm cho tôi, bạn có thể muốn thử điều này; đó là một giải pháp khá đơn giản, được triển khai trong Perl, cung cấp chức năng tương tự. Cụ thể, VM khởi động cùng hệ thống (giả sử dịch vụ được đặt để tự động khởi động, là mặc định) và sẽ tắt hoàn toàn khi dịch vụ bị dừng.
Sự khác biệt chính từ giải pháp vboxd, ngoài việc đơn giản hơn đáng kể để giải quyết theo kinh nghiệm của tôi, là tập lệnh này không chuyển cài đặt cổng VRDE sang VBoxHeadless và việc tắt máy VM được xử lý thông qua "acpipowerbutton" thay vì "savestate" .
Nếu điều này không phù hợp với mục đích của bạn, thì đủ dễ để thay đổi; trong trường hợp đầu tiên, hãy thêm '-e "TCP / Cổng = [, cổng ...]"' vào chuỗi dòng lệnh VBoxHeadless ($ cmd) và trong trường hợp thứ hai, chỉ cần thay đổi "acpipowerbutton" thành "savestate" trong " xử lý SIGTERM.
Đây là kịch bản 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";
Và đây là dòng lệnh cygrunsrv mà tôi đã sử dụng để cài đặt dịch vụ 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
Từ đó, vấn đề chỉ là phát hành 'sc start <tên dịch vụ>' và bạn nên đi - hãy nhớ rằng, theo mặc định, các dịch vụ cygrunrv đăng nhập vào / var / log / <tên dịch vụ> .log, vì vậy nếu có bất cứ điều gì sai trái, đó là nơi đầu tiên để tìm lý do tại sao.
Một lưu ý là, khi bạn chạy VM theo cách này, nó sẽ chạy dưới tài khoản HỆ THỐNG tích hợp, chứ không phải của riêng bạn. Trong trường hợp này, bạn sẽ không thể quản trị VM thông qua bảng điều khiển VirtualBox trong khi nó chạy như một dịch vụ; nó sẽ xuất hiện ở trạng thái "Tắt nguồn" và bạn sẽ không thể vào cài đặt của nó. (Cố gắng bật máy VM trong khi nó không hoạt động vì dịch vụ không được khuyến khích - Tôi không biết điều gì sẽ xảy ra, nhưng tốt nhất nó sẽ là không hoạt động, và tệ nhất là nó sẽ làm hỏng VM của bạn.) Nếu bạn cần thay đổi cài đặt của VM hoặc truy cập bảng điều khiển, trước tiên hãy dừng dịch vụ (và đợi VBoxHeadless.exe thoát), sau đó định cấu hình / bật nguồn trong bảng điều khiển VirtualBox như bình thường.
Bạn có thể giải quyết vấn đề này bằng cách cài đặt dịch vụ tương tác thứ hai để chạy bảng điều khiển VirtualBox; vì điều đó cũng sẽ chạy giao diện điều khiển trong tài khoản HỆ THỐNG, rất có thể nó sẽ có thể nhìn thấy và quản lý VM đang chạy. Tôi không có nhu cầu tự làm điều đó, vì vậy tôi không chắc nó sẽ hoạt động, nhưng tôi không thấy lý do tại sao nó lại không. (Nếu bạn thử nó, tôi sẽ đánh giá cao một nhận xét cho câu trả lời này, cho tôi biết làm thế nào nó hoạt động cho bạn. Cảm ơn!)
Hi vọng điêu nay co ich!