Làm cách nào tôi có thể chạy máy VirtualBox như một dịch vụ trên Windows XP?


13

Tôi có máy VirtualBox với Windows XP trên Máy chủ Windows XP.

Làm cách nào tôi có thể khởi động VirtualBox như một dịch vụ, vì vậy tôi có thể có được một máy ảo dưới mui xe và tôi không phải khởi động VirtualBox để truy cập vào máy ảo của mình (thông qua VNC từ mạng)?

Tôi thấy rằng VirtualBox Manage có thể là hướng đi, nhưng vì tôi là người mới bắt đầu với điều này, tôi không biết bắt đầu từ đâu.

Có ý kiến ​​gì không?

Câu trả lời:


0

Tạo một lối tắt để C:\Program Files\innotek VirtualBox\VBoxManage.exe

Sau khi dấu ngoặc kép nhập: startvm <your virtual machine name>

Thí dụ:

“C:\Program Files\innotek VirtualBox\VBoxManage.exe” startvm XP

Sao chép / Di chuyển phím tắt đến thư mục khởi động của bạn.

ps: nếu bạn muốn trì hoãn Máy ảo cho đến khi hệ thống của bạn được khởi động hoàn toàn, bạn có thể thực hiện việc này trong XP thông qua Startup Delayer .


Nó dường như hoạt động tốt, dù sao cũng có thể "ẩn" cửa sổ cho máy ảo, vì vậy nó sẽ chạy giống như một dịch vụ windows?
Jhonny D. Cano -Leftware-

chạy VBox như một dịch vụ sẽ không ẩn cửa sổ. bạn có thể giảm thiểu nó tự động vào khay hệ thống với AWM mặc dù: eusing.com/WindowManager/WindowManager.htm

15
kiểm tra "VBoxHeadless" để khởi chạy VM không có giao diện người dùng. Bạn sẽ cần sử dụng RDP nếu bạn muốn xem màn hình của VM.
Đánh dấu

13
Đây không phải là một dịch vụ. Điều này chỉ chạy VBox khi bạn đăng nhập - không phải khi máy được bật. VBoxHeadless là cách để chạy như một dịch vụ. Xem câu trả lời của tôi dưới đây (mà tôi sắp cải thiện theo nhận xét của Aaron Copley).
John Hart

Câu trả lời không liên quan gì đến việc chạy như một dịch vụ. Việc khởi động xảy ra sau khi đăng nhập người dùng, hoàn toàn khác với hành vi dịch vụ.
Felice Pollano

10

Lưu ý rằng câu trả lời hiện được chấp nhận (Molly7244) thực sự khởi động VM khi bạn đăng nhập - không phải khi bạn khởi động máy. Nói cách khác, nó không phải là một dịch vụ.

Đối với một dịch vụ thực tế chạy khi máy khởi động, tôi sử dụng hai tập lệnh (ban đầu từ đây ) kết hợp với cygwin (cygrunsrv). Làm cho việc sử dụng chế độ VBoxHeadless như được đề cập ở nơi khác trên trang này.

Kịch bản đầu tiên chạy VM của bạn thông qua VBoxHeadless; nó lấy tên của VM phù hợp để chạy (và thông tin khác như thư mục chính VBOX của bạn) từ các biến môi trường. Tập lệnh thứ hai cài đặt một dịch vụ cho một VM cụ thể (bằng cách sử dụng cygrunsrv để gọi tập lệnh đầu tiên với tập vars env. Right). Cuối cùng, có một tập tin thứ ba chứa các chức năng phổ biến. Nếu bạn đặt tất cả những thứ này vào một thư mục cùng nhau, bạn có thể cài đặt một vm mới như vậy:

$ VBOX_USER_HOME="/path/to/.VirtualBox/" vboxd-install MyVMName 3333

Và sau đó bắt đầu dịch vụ với "net start vboxd-MyVMName" hoặc "cygrunsrv -S vboxd-MyVMName".

Đây là tập lệnh chạy VM, "vboxd":

#!/bin/bash
# from http://forums.virtualbox.org/viewtopic.php?f=1&t=23536

##
## Manages start / stop of VirtualBox virtual machines
##

## load common functions
basedir="$(readlink -f $(dirname $0))"
source "$basedir/.libcommon" || exit 1

## parse arguments
parseArg vmName "$1" "$VBOXD_VM_NAME"
parseArg vmPort "$2" "$VBOXD_VM_PORT"

VBOX_INSTALL_PATH="$(cygpath "$VBOX_MSI_INSTALL_PATH")"

## define signal handler
function onHalt {
    warn "Stopping virtual machine '$vmName'"
    "$VBOX_INSTALL_PATH/VBoxManage" controlvm "$vmName" savestate
    exit 0
}

## install signal handler; cygrunsrv uses SIGTERM by default
trap 'onHalt' TERM

## hardcode this path if you like; it's required for VBox* utils to
## find the correct VirtualBox.xml config file and is usually set
## during a call to vboxd-install.
#export VBOX_USER_HOME="$USERPROFILE\\.VirtualBox"

## default VBoxHeadless port specification
portSpec="-e \"TCP/Ports=$vmPort\""

## determine vm state
info "Querying virtual machine '$vmName' state"
vmState=$( \
    "$VBOX_INSTALL_PATH/VBoxManage" showvminfo "$vmName" \
    | grep '^State:' \
    | sed 's/State: *//' )
info "Virtual machine '$vmName' is $vmState"

## if vm state is saved, we can't specify port without an exception,
## as port spec requires modification of the (immutable) saved machine
## state. See http://www.virtualbox.de/ticket/3609
if  [ "${vmState##saved}" != "$vmState" ]; then
    ## state is saved; clear port specification
    warn "Port specification is not allowed for saved vms"
    portSpec=""
fi

## start the VM
info "Starting virtual machine '$vmName' on port $vmPort"
"$VBOX_INSTALL_PATH/VBoxHeadless" -s "$vmName" $portSpec &

## record pid of VBoxHeadless child process and wait on it
pid="$!"
info "Waiting on VBoxHeadless child process $pid"
wait "$pid"

Và đây là tập lệnh cài đặt, "vboxd-install":

#!/bin/bash
# http://forums.virtualbox.org/viewtopic.php?f=1&t=23536

##
## Registers a VirtualBox virtual machine to start as a service via cygrunsrv
##

## load common functions
basedir="$(readlink -f $(dirname $0))"
source "$basedir/.libcommon" || exit 1

## test for presence of cygrunsrv utility
if [ ! -x "$(which cygrunsrv)" ]; then
    die "Utility 'cygrunsrv' is not in path"
fi

## test VirtualBox configuration
if [ -z "$VBOX_USER_HOME" ]; then
    die "Required environment variable 'VBOX_USER_HOME' is undefined. " \
     "Please ensure this variable is set to point to the directory " \
     "containing your VirtualBox.xml configuration file."
fi
configFile=$(cygpath -u "$VBOX_USER_HOME\\VirtualBox.xml")
if [ ! -e "$configFile" ]; then
    die "VirtualBox configuration file '$(cygpath -w $configFile)' not found"
fi

## parse arguments
parseArg vmName "$1"
parseArg vmPort "$2"
parseArg vmUser "$3" "SYSTEM"

## if vmUser is not SYSTEM, update userSpec
userSpec="--interactive"
if [ "$vmUser" != "SYSTEM" ]; then
    ## "interactive" option disallowed when user is specified
    userSpec="--user \"$vmUser\""
fi

## install the service
cygrunsrv \
    --install "vboxd-$vmName" \
    --path "$basedir/vboxd" \
    --env "VBOXD_VM_NAME=$vmName" \
    --env "VBOXD_VM_PORT=$vmPort" \
    --env "VBOX_USER_HOME=$VBOX_USER_HOME" \
    --desc "VirtualBox virtual machine '$vmName' on port $vmPort" \
    $userSpec \
    --type auto \
    --termsig TERM \
    --shutsig TERM \
    --neverexits \
    --preshutdown \
    || die "Failed to install service"

Và cuối cùng, đây là tập lệnh ".libcommon" được tham chiếu bởi cả hai:

# -*-shell-script-*-
# from http://forums.virtualbox.org/viewtopic.php?f=1&t=23536

SCRIPT="$(basename $0)"
BASEDIR="$(readlink -f $(dirname $0))"
[ -z "$LOGLEVEL" ] && LOGLEVEL=2
[ -z "$LOGDATEFORMAT" ] && LOGDATEFORMAT="%Y-%m-%d %H:%M:%S "

function log {
    local now=""
    [ -n "$LOGDATEFORMAT" ] && now=$(date +"$LOGDATEFORMAT")
    echo "$SCRIPT $now$@" >&2
}

function debug {
    [ "$LOGLEVEL" -lt 3 ] && return
    log "[DEBUG] $@"
}

function info {
    [ "$LOGLEVEL" -lt 2 ] && return
    log "[INFO]  $@"
}

function warn {
    [ "$LOGLEVEL" -lt 1 ] && return
    log "[WARN]  $@"
}

function error {
    log "[ERROR] $@"
}

function die {
    error "$@"
    exit 1
}

function parseArg {
    local _name="$1"
    local _value="$2"
    local _default="$3"
    if [ -z "$_value" ]; then
        if [ -z "$_default" ]; then
            die "Required argument '$_name' is undefined"
        fi
     if [ "$_default" = "*EMPTY*" ]; then
         _value=""
     else
            _value="$_default"
     fi
    fi
    debug "$_name=\"$_value\""
    eval "$_name=\"$_value\""
}

Giải pháp này hoạt động rất tốt cho tôi; Hy vọng bạn sẽ có may mắn tương tự.


4
+1 cho "không phải là dịch vụ" ... -1 để liên kết với giải pháp thay vì đưa nó vào câu trả lời. Bình chọn là vô giá trị. :) Xem xét sửa đổi để bao gồm các giải pháp vì thối liên kết là bất lợi cho tuổi thọ của câu trả lời này.
Aaron Copley

8

Có vẻ như câu trả lời đơn giản nhất vào thời điểm này là VBoxVMService . Tôi chưa thử, tôi sẽ cố nhớ đến đây và cập nhật câu trả lời nếu / khi tôi làm.


1
mặc dù nó không hoạt động với 4.2.x
Archimedes Trajano

2
@ArchimedesTrajano Tôi đã thử phiên bản hiện tại (4.1) với VirtualBox 4.3.6 và nó chạy tốt. Trang của dự án tuyên bố nó "được viết lại gần như từ đầu" .
Melebius

1
Yup tôi vừa thử nó tối qua và nó hoạt động! Chỉ cần nhớ để REBOOT.
Archimedes Trajano

4

Đồng ý về VBoxVMService. Nó thực sự dễ dàng để thiết lập và dường như đang hoạt động tốt. Bạn có thể tìm thấy một cách để thiết lập nó ở đây:

http://www.windows-noob.com/forums/index.php?/topic/4931-have-virtualbox-vms-start-as-a-service-on-a-windows-host/

**** CHỈNH SỬA **** Theo yêu cầu bên dưới, tóm tắt về liên kết. Mặc dù giải pháp hiệu quả với tôi, khoản tín dụng dành cho Peter Upprint - http://peter.upprint.org.uk/

  • Cài đặt Virtualbox và thiết lập VM để chấp nhận các phiên RDP.
  • Tải xuống và cài đặt VBoxVmService vào C: \ vms. Chỉ cần Google VBoxVmService cho một liên kết tải xuống (xin lỗi, không đủ đại diện để đăng nhiều hơn 2 liên kết).
  • Chỉnh sửa tệp ini của VBoxVmService trong C: \ vms:

[Cài đặt]

Tên dịch vụ = VBoxVmService

VBOX_USER_HOME = C: \ Users \ Administrator.VirtualBox

RunAsUser =. \ Administrator

UserPassword = enteryourpasswordhere

RunWebService = không

Tạm dừngShutdown = 5000

[Vm0] VmName = tên của vm trong VirtualBox

ShutdownMethod = savestate

Tự động khởi động = có

  • Thay thế trong VBOX_USER_HOME bằng thư mục .VirtualBox trong thư mục chính của người dùng, cũng như các chỉ thị RunAsUser và UserPassword và đặt tên của máy ảo đích trong ứng dụng VirtualBox trong VmName. Bạn cũng có thể thêm các phần [Vmx] bổ sung sau [Vm0] với các máy ảo khác để khởi động khi máy khởi động.

  • Khi bạn hài lòng với cấu hình của mình, từ Dấu nhắc lệnh do Quản trị viên kích hoạt, hãy chạy lệnh sau để cài đặt dịch vụ. Sau khi dịch vụ được cài đặt, bạn có thể xóa mật khẩu người dùng khỏi tệp INI, vì nó được lưu trong cấu hình Dịch vụ:

C: \ vms \ VmServiceControl.exe -i

  • Bây giờ, bạn phải khởi động lại máy tính trước khi thử khởi động dịch vụ lần đầu tiên, nếu không nó sẽ không thể định vị được máy ảo.

  • Khi khởi động lại, dịch vụ sẽ bắt đầu (tuân theo độ trễ 'Tự động (Bắt đầu trễ)' và máy ảo của bạn sẽ được khởi động khi khởi động.


1
Bạn có thể tóm tắt các liên kết trong câu trả lời của bạn trong trường hợp nó chết?
jonsca

Đăng bài theo yêu cầu.
RooiWillie

cái này có hoạt động trên phiên bản 4.2.x của VirtualBox không?
Archimedes Trajano

Các hướng dẫn này có thể áp dụng cho một số phiên bản cũ hơn, phiên bản hiện tại của VBoxVmService (4.1) dễ cài đặt hơn và nó sẽ hướng dẫn bạn trong suốt quá trình.
Melebius

2

Chỉ cung cấp tùy chọn này như một tùy chọn khác:

Sử dụng lệnh 'sc' dựng sẵn của Windows để tạo một dịch vụ. Kết hợp điều này với 'vboxheadless' sẽ đưa bạn đến nơi bạn muốn.

Chưa được kiểm tra với vboxheadless cụ thể, nhưng tôi đã tạo một dịch vụ thử nghiệm chạy calc.exe. Bạn nên làm một cái gì đó như thế này:

sc create servicenamehere start= auto binPath= "C:\path\to\vboxheadless.exe --startvm name"

Tham khảo tài liệu cho sc để biết thêm thông tin. Lưu ý: Những khoảng trắng sau dấu bằng là cố ý.


Điều này sẽ khởi động dịch vụ một cách chính xác, nhưng sẽ làm sập VM khi dịch vụ bị dừng - VBoxHeadless không thể giải thích chính xác điều khiển dừng dịch vụ, vì vậy Windows sẽ đợi cho đến khi hết thời gian và sau đó buộc phải hủy quá trình, điều này ít hơn lý tưởng. Xem các câu trả lời khác cho các kịch bản lệnh bao bọc để ngăn chặn điều đó xảy ra.
Aaron Miller

Cảm ơn các bình luận. Hy vọng, điều này được gửi đến các nhà phát triển dưới dạng yêu cầu sửa lỗi / tính năng.
Aaron Copley

1

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!


Tập lệnh của bạn đơn giản hơn, nhưng yêu cầu Perl và mã cứng một số thuộc tính mà tập lệnh vboxd chấp nhận làm tham số. Theo virtualbox.org/manual/ch07.html , bằng cách không chấp nhận cổng VRDE, VBoxHeadless sẽ không chạy VM (nó chỉ chặn vô thời hạn) nếu VM được đặt để sử dụng cổng mặc định mà máy chủ RDP khác đang sử dụng. vboxd-installlà hữu ích vì nó thuận tiện che giấu các chi tiết tranh luận của cygrunirv. Tuy nhiên, tôi đồng ý rằng đó acpipowerbuttonlà một lựa chọn "dừng" tốt hơn savestate.
Derek Mahar

@DerekMahar Mang nó cho bất cứ điều gì nó có giá trị, tôi cho rằng. Vì nó không hoạt động trên bất cứ thứ gì mới hơn XP, tôi nghi ngờ đó là rất nhiều trong mọi trường hợp. \ _ () _ / ¯ Cảm ơn bạn đã phản hồi!
Aaron Miller

Aaron Miller, ý bạn là tập lệnh hoặc vboxd của bạn không hoạt động trên bất kỳ Windows nào mới hơn XP? Tôi đoán bạn có nghĩa là tập lệnh của bạn vì tôi đã làm cho vboxd hoạt động trên Windows 10 với VirtualBox 5.1.6.
Derek Mahar

@DerekMahar Ý tôi là kịch bản của tôi chứ không phải vboxd.
Aaron Miller
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.