ฉันจะเรียกใช้เครื่อง VirtualBox เป็นบริการบน Windows XP ได้อย่างไร


13

ฉันมีเครื่อง VirtualBox พร้อม Windows XP บนโฮสต์ Windows XP

ฉันจะเริ่ม VirtualBox เป็นบริการได้อย่างไรฉันจึงสามารถรับเครื่องเสมือนภายใต้ประทุนได้และฉันไม่ต้องเริ่ม VirtualBox เพื่อเข้าถึงเครื่องเสมือนของฉัน (ผ่าน VNC จากเครือข่าย)

ฉันพบว่า VirtualBox Manage อาจเป็นหนทางไป แต่เนื่องจากฉันเป็นผู้เริ่มต้นด้วยสิ่งนี้ฉันจึงไม่รู้ว่าจะเริ่มต้นอย่างไร

ความคิดใด ๆ

คำตอบ:


0

สร้างทางลัดไปที่ C:\Program Files\innotek VirtualBox\VBoxManage.exe

หลังจากเครื่องหมายคำพูดป้อน: startvm <your virtual machine name>

ตัวอย่าง:

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

คัดลอก / ย้ายทางลัดไปยังโฟลเดอร์เริ่มต้นของคุณ

PS: ถ้าคุณต้องการที่จะชะลอการทำงานของเครื่องเสมือนจนกว่าระบบของคุณบูทอย่างเต็มที่คุณสามารถทำเช่นนี้ใน XP ผ่านStartup Delayer


ดูเหมือนว่าจะใช้งานได้ดีมี "ซ่อน" หน้าต่างสำหรับเครื่องเสมือนด้วยหรือไม่ดังนั้นจึงทำงานเหมือนบริการ windows มากกว่าหรือไม่
Jhonny D. Cano -Leftware-

ใช้ VBox เป็นบริการจะไม่ซ่อนหน้าต่าง คุณสามารถย่อให้เล็กสุดอัตโนมัติไปยังถาดระบบด้วย AWM แม้ว่า: eusing.com/WindowManager/WindowManager.htm

15
ชำระเงิน "VBoxHeadless" สำหรับเรียกใช้ VM โดยไม่มี UI คุณจะต้องใช้ RDP ถ้าคุณต้องการที่จะเห็นหน้าจอของ VM
Mark Porter

13
นี่ไม่ใช่บริการ สิ่งนี้จะทำงานเฉพาะ VBox เมื่อคุณเข้าสู่ระบบ - ไม่ใช่เมื่อเปิดเครื่อง VBoxHeadless เป็นวิธีการที่จะไปทำงานเป็นบริการ ดูคำตอบของฉันด้านล่าง (ซึ่งฉันจะปรับปรุงตามความคิดเห็นของ Aaron Copley)
John Hart

คำตอบไม่เกี่ยวกับการทำงานเป็นบริการ การเริ่มต้นเกิดขึ้นหลังจากการเข้าสู่ระบบของผู้ใช้แตกต่างอย่างสิ้นเชิงกับพฤติกรรมการบริการ
Felice Pollano

10

โปรดทราบว่าคำตอบที่ได้รับการยอมรับในปัจจุบัน (Molly7244) จะเริ่ม VM เมื่อคุณเข้าสู่ระบบ - ไม่ใช่เมื่อคุณบูตเครื่อง มันไม่ได้เป็นบริการ

สำหรับบริการจริงที่ทำงานเมื่อบูทเครื่องฉันใช้สองสคริปต์ (มาจากที่นี่ ) ร่วมกับ cygwin (cygrunsrv) ใช้โหมด VBoxHeadless ตามที่กล่าวไว้ที่อื่นในหน้านี้

สคริปต์แรกรัน VM ของคุณผ่าน VBoxHeadless มันได้รับชื่อของ VM ที่เหมาะสมในการเรียกใช้ (และข้อมูลอื่น ๆ เช่นไดเรกทอรีบ้าน VBOX ของคุณ) จากตัวแปรสภาพแวดล้อม สคริปต์ที่สองติดตั้งบริการสำหรับ VM เฉพาะ (โดยใช้ cygrunsrv เพื่อเรียกใช้สคริปต์แรกที่มีชุด env. vars ที่ถูกต้อง) ในที่สุดก็มีไฟล์ที่สามซึ่งมีฟังก์ชั่นทั่วไป หากคุณใส่สิ่งเหล่านี้ลงในไดเรกทอรีด้วยกันคุณสามารถติดตั้ง vm ใหม่เช่น:

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

จากนั้นเริ่มบริการด้วย "net start vboxd-MyVMName" หรือ "cygrunsrv -S vboxd-MyVMName"

นี่คือสคริปต์ทำงานของ 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"

และนี่คือสคริปต์ตัวติดตั้ง "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"

และในที่สุดนี่คือสคริปต์ ".libcommon" ที่อ้างอิงโดยทั้งสองสิ่งนี้:

# -*-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\""
}

วิธีนี้ใช้ได้ดีสำหรับฉัน หวังว่าคุณจะมีโชคเหมือนกัน


4
+1 สำหรับ "ไม่ใช่บริการ" ... -1 สำหรับเชื่อมโยงกับโซลูชันแทนที่จะรวมไว้ในคำตอบ โหวตเป็นโมฆะ :) พิจารณาแก้ไขเพื่อรวมถึงการแก้ปัญหาเป็นลิงค์เน่าเป็นอันตรายต่อการยืดอายุของคำตอบนี้
Aaron Copley

8

ดูเหมือนว่าคำตอบที่ง่ายที่สุดที่จุดนี้จะVBoxVMService ฉันยังไม่ได้ลองฉันจะพยายามอย่าลืมมาที่นี่และอัปเดตคำตอบถ้า / เมื่อฉันทำ


1
มันไม่ทำงานกับ 4.2.x แม้ว่า
Archimedes Trajano

2
@ArchimedesTrajano ฉันได้ลองใช้เวอร์ชันปัจจุบัน (4.1) ด้วย VirtualBox 4.3.6 และมันทำงานได้ดี โครงการการเรียกร้องหน้ามันก็"เขียนใหม่เกือบตั้งแต่เริ่มต้น"
Melebius

1
ใช่ฉันเพิ่งทดสอบเมื่อคืนนี้และใช้งานได้! เพียงจำที่จะรีบูต
Archimedes Trajano

4

ตกลงบน VBoxVMService มันง่ายมากที่จะติดตั้งและดูเหมือนว่าจะทำงานได้ดี คุณสามารถค้นหาวิธีการตั้งค่าได้ที่นี่:

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

**** แก้ไข **** ตามคำขอด้านล่างนี้เป็นลิงค์สรุป แม้ว่าวิธีแก้ปัญหานี้จะได้ผลสำหรับฉัน แต่เครดิตก็ยังคงอยู่ที่ Peter Upfold - http://peter.upfold.org.uk/

  • ติดตั้ง Virtualbox และตั้งค่า VM เพื่อยอมรับเซสชัน RDP
  • ดาวน์โหลดและติดตั้ง VBoxVmService เข้าใน C: \ vms เพียง Google VBoxVmService สำหรับลิงก์ดาวน์โหลด (ขออภัยมีตัวแทนไม่เพียงพอที่จะโพสต์มากกว่า 2 ลิงก์)
  • แก้ไขไฟล์ ini ของ VBoxVmService ภายใต้ C: \ vms:

[Settings]

ServiceName = VBoxVmService

VBOX_USER_HOME = C: \ Users \ Administrator.VirtualBox

RunAsUser =. \ Administrator

userPassword = enteryourpasswordhere

RunWebService = ไม่มี

PauseShutdown = 5000

[Vm0] VmName = ชื่อของ vm ใน VirtualBox

ShutdownMethod = saveState

AutoStart = yes

  • ทดแทนใน VBOX_USER_HOME ด้วยโฟลเดอร์. VirtualBox ในไดเรกทอรีบ้านของผู้ใช้ที่ถูกต้องรวมถึงคำสั่ง RunAsUser และ UserPassword และตั้งชื่อเครื่องเสมือนเป้าหมายในแอป VirtualBox ใน VmName คุณสามารถเพิ่มส่วน [Vmx] เพิ่มเติมหลังจาก [Vm0] กับเครื่องเสมือนอื่นเพื่อเริ่มเมื่อเครื่องบู๊ต

  • เมื่อคุณพอใจกับการกำหนดค่าของคุณจากพรอมต์คำสั่งที่เปิดใช้งานโดยผู้ดูแลระบบให้เรียกใช้คำสั่งต่อไปนี้เพื่อติดตั้งบริการ เมื่อติดตั้งบริการแล้วคุณสามารถลบรหัสผ่านผู้ใช้ของคุณออกจากไฟล์ INI เนื่องจากบันทึกไว้ในการกำหนดค่าบริการ:

C: \ vms \ VmServiceControl.exe -i

  • ตอนนี้คุณต้องรีบูตคอมพิวเตอร์ก่อนที่จะเริ่มบริการเป็นครั้งแรกไม่เช่นนั้นจะไม่สามารถระบุตำแหน่งของ VM ได้

  • เมื่อรีบู๊ตบริการควรเริ่มต้น (ขึ้นอยู่กับความล่าช้า 'อัตโนมัติ (ล่าช้าเริ่มต้น)' และ VMs ของคุณจะเริ่มเมื่อบู๊ต


1
คุณสามารถสรุปลิงค์ในคำตอบของคุณในกรณีที่มันตายไปได้หรือไม่?
jonsca

โพสต์แก้ไขตามที่ร้องขอ
RooiWillie

ใช้งานกับ VirtualBox เวอร์ชัน 4.2.x ได้หรือไม่
Archimedes Trajano

คำแนะนำเหล่านี้อาจใช้กับเวอร์ชันเก่ากว่าเวอร์ชันปัจจุบันของ VBoxVmService (4.1) นั้นง่ายต่อการตั้งค่าและมันจะแนะนำคุณตลอดกระบวนการ
Melebius

2

เพียงแค่เสนอสิ่งนี้เป็นตัวเลือกอื่น:

ใช้คำสั่ง builtin Windows 'sc' เพื่อสร้างบริการ รวมสิ่งนี้กับ 'vboxheadless' จะพาคุณไปยังที่ที่คุณต้องการ

ไม่ได้ทดสอบกับ vboxheadless โดยเฉพาะ แต่ฉันสร้างบริการทดสอบที่เรียกใช้ calc.exe คุณควรทำสิ่งนี้:

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

อ้างถึงเอกสารสำหรับ sc สำหรับข้อมูลเพิ่มเติม หมายเหตุ: ช่องว่างเหล่านั้นหลังจากเครื่องหมายเท่ากับมีเจตนา


สิ่งนี้จะเริ่มบริการได้อย่างถูกต้อง แต่จะหยุดทำงาน VM เมื่อบริการหยุดทำงาน - VBox ไม่สามารถตีความการควบคุมการหยุดให้บริการได้อย่างถูกต้องดังนั้น Windows จะรอจนกระทั่งหมดเวลาและบังคับให้กระบวนการทำงานช้าลงซึ่งน้อยกว่าอุดมคติ ดูคำตอบอื่น ๆ สำหรับสคริปต์ตัวคลุมเพื่อป้องกันไม่ให้เกิดขึ้น
Aaron Miller

ขอบคุณสำหรับความคิดเห็น หวังว่าสิ่งนี้จะถูกส่งไปยังนักพัฒนาเพื่อขอแก้ไขข้อบกพร่อง / คุณสมบัติ
Aaron Copley

1

หากสคริปต์ 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 <service-name>' และคุณควรจะดี - โปรดจำไว้ว่าโดยค่าเริ่มต้นบริการ cygrunsrv จะบันทึก / var / log / <service-name> .log ดังนั้นหากมีสิ่งใดที่ไม่เหมาะสมเกิดขึ้นนั่นเป็นสถานที่แรกที่จะมองหาเหตุผลว่าทำไม

สิ่งหนึ่งที่ต้องจำไว้คือเมื่อคุณเรียกใช้ VM ด้วยวิธีนี้มันจะทำงานภายใต้บัญชี SYSTEM ในตัวแทนที่จะเป็นของคุณเอง ในกรณีนี้คุณจะไม่สามารถจัดการ VM ผ่านคอนโซล VirtualBox ในขณะที่ทำงานเป็นบริการ มันจะปรากฏเป็นสถานะ "ปิดการใช้งาน" และคุณจะไม่สามารถเข้าถึงการตั้งค่าได้ (พยายามเปิดเครื่อง VM ขณะที่กำลังทำงานเนื่องจากไม่แนะนำให้ใช้บริการ - ฉันไม่รู้ว่าจะเกิดอะไรขึ้น แต่ที่ดีที่สุดคือไม่ใช้งานและที่แย่ที่สุดมันจะทำให้ท่อของคุณไม่ทำงาน) ถ้าคุณต้องการเปลี่ยนการตั้งค่าของ VM หรือเข้าถึงคอนโซลให้หยุดบริการก่อน (และรอให้ VBoxHeadless.exe จบการทำงาน) จากนั้นกำหนดค่า / เปิดใช้งานมันในคอนโซล VirtualBox ตามปกติ

คุณอาจจะสามารถแก้ปัญหานี้ได้ด้วยการติดตั้งบริการแบบโต้ตอบที่สองเพื่อเรียกใช้คอนโซล VirtualBox ตั้งแต่นั้นจะเรียกใช้คอนโซลภายใต้บัญชี SYSTEM ด้วยเช่นกันน่าจะสามารถดูและจัดการ VM ที่กำลังทำงานอยู่ได้ ฉันไม่จำเป็นต้องทำด้วยตัวเองดังนั้นฉันจึงไม่แน่ใจว่ามันจะทำงานได้ แต่ฉันไม่เห็นเหตุผลที่จะไม่ทำ (ถ้าคุณลองฉันจะขอบคุณความคิดเห็นคำตอบนี้แจ้งให้ฉันทราบว่ามันทำงานอย่างไรสำหรับคุณขอบคุณ!)

หวังว่านี่จะช่วยได้!


สคริปต์ของคุณง่ายขึ้น แต่ต้องใช้ Perl และรหัสยากคุณสมบัติหลายอย่างที่สคริปต์ vboxd ยอมรับเป็นพารามิเตอร์ ตามvirtualbox.org/manual/ch07.htmlโดยไม่ยอมรับพอร์ต VRDE VBoxHeadless จะไม่เรียกใช้ VM (บล็อกเพียงไม่ จำกัด เวลา) หากตั้งค่า VM ให้ใช้พอร์ตเริ่มต้นที่เซิร์ฟเวอร์ RDP อื่นใช้อยู่ vboxd-installมีประโยชน์เพราะสะดวกซ่อนรายละเอียดอาร์กิวเมนต์ของ cygrunsrv ฉันจะเห็นได้ว่าacpipowerbuttonเป็นดีกว่า "หยุด" savestateตัวเลือกที่ดีกว่า
Derek Mahar

@DerekMahar เอามันไปใช้สำหรับสิ่งที่มันคุ้มค่าฉันคิดว่า เนื่องจากมันใช้งานไม่ได้กับอะไรที่ใหม่กว่า XP ฉันจึงสงสัยว่ามันมีอะไรมากมาย ¯ \ _ (ツ) _ / ¯ขอบคุณสำหรับคำติชม!
Aaron Miller

Aaron Miller คุณหมายถึงสคริปต์หรือ vboxd ของคุณไม่ทำงานบน Windows ที่ใหม่กว่า XP หรือไม่ ฉันคิดว่าคุณหมายถึงสคริปต์ของคุณเพราะฉันได้รับ vboxd ให้ทำงานบน Windows 10 ด้วย VirtualBox 5.1.6
Derek Mahar

@DerekMahar ฉันหมายถึงสคริปต์ของฉันไม่ใช่ vboxd
Aaron Miller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.