Windows XP에서 VirtualBox 시스템을 서비스로 실행하려면 어떻게해야합니까?


13

Windows XP 호스트에 Windows XP가 설치된 VirtualBox 시스템이 있습니다.

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

바로 가기를 시작 폴더로 복사 / 이동합니다.

추신 : 시스템이 완전히 부팅 될 때까지 가상 머신을 지연시키고 싶다면 XP에서 Startup Delayer 를 통해이를 수행 할 수 있습니다 .


잘 작동하는 것 같습니다. 가상 머신의 창을 "숨기기"해도 Windows 서비스처럼 실행되고 있습니까?
Jhonny D. Cano -Leftware-

VBox를 서비스로 실행하면 창이 숨겨지지 않습니다. : 당신은 비록 AWM과 시스템 트레이에 자동으로 최소화 할 수 있습니다 eusing.com/WindowManager/WindowManager.htm

15
UI없이 VM을 시작하기위한 "VBoxHeadless"체크 아웃 VM 화면을 보려면 RDP를 사용해야합니다.
마크 포터

13
이것은 서비스가 아닙니다. 이것은 로그인 할 때만 VBox를 실행합니다-컴퓨터의 전원이 켜져 있지 않은 경우. VBoxHeadless는 서비스로 실행하는 방법입니다. 아래의 답변을 참조하십시오 (Aaron Copley의 의견에 따라 개선하려고합니다).
John Hart

답은 서비스로 실행하는 것과는 아무런 관련이 없습니다. 시작은 서비스 로그온과 완전히 다른 사용자 로그온 후에 발생합니다.
Felice Pollano

10

현재 허용되는 답변 (Molly7244)은 실제로 컴퓨터를 부팅 할 때가 아니라 로그인 할 때 VM을 시작합니다. 다시 말해서 서비스가 아닙니다.

머신이 부팅 될 때 실행되는 실제 서비스의 경우 cygwin (cygrunsrv)과 함께 두 개의 스크립트 (원본은 here )를 사용합니다. 이 페이지의 다른 곳에 언급 된 VBoxHeadless 모드를 사용합니다.

첫 번째 스크립트는 VBoxHeadless를 통해 VM을 실행합니다. 환경 변수에서 실행할 올바른 VM의 이름 (및 VBOX 홈 디렉토리와 같은 기타 정보)을 가져옵니다. 두 번째 스크립트는 cygrunsrv를 사용하여 올바른 환경 변수가 설정된 첫 번째 스크립트를 호출하여 특정 VM에 대한 서비스를 설치합니다. 마지막으로 일반적인 기능을 포함하는 세 번째 파일이 있습니다. 이 모든 것을 하나의 디렉토리에 넣으면 다음과 같이 새 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를하지만 작동하지 않습니다
아르키메데스 Trajano

2
@ArchimedesTrajano VirtualBox 4.3.6으로 현재 버전 (4.1)을 시도했지만 제대로 실행됩니다. 프로젝트의 페이지는 "거의 처음부터 다시 작성 되었다 "고 주장합니다 .
Melebius

1
예, 방금 어제 테스트했는데 작동합니다! REBOOT을 기억하십시오.
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/

**** EDIT **** 아래 요청에 따라 링크 요약. 솔루션이 나를 위해 일했지만 크레딧은 Peter Upfold- http: //peter.upfold.org.uk/로갑니다 .

  • Virtualbox를 설치하고 RDP 세션을 수락하도록 VM을 설정하십시오.
  • C : \ vms에 VBoxVmService를 다운로드하여 설치하십시오. 다운로드 링크에 대한 Google VBoxVmService (죄송합니다. 링크가 두 개 이상인 경우 담당자가 아닙니다).
  • C : \ vms에서 VBoxVmService의 ini 파일을 편집하십시오.

[설정]

ServiceName = VBoxVmService

VBOX_USER_HOME = C : \ Users \ Administrator.VirtualBox

RunAsUser =. \ 관리자

UserPassword = 비밀번호 입력

RunWebService = 아니오

PauseShutdown = 5000

[Vm0] VmName = VirtualBox의 VM 이름

ShutdownMethod = 저장 상태

자동 시작 = 예

  • RunAsUser 및 UserPassword 지시문뿐만 아니라 올바른 사용자의 홈 디렉토리에있는 .VirtualBox 폴더로 VBOX_USER_HOME을 대체하고 VmName의 VirtualBox 앱에서 대상 가상 머신의 이름을 설정하십시오. 다른 가상 머신과 함께 [Vm0] 뒤에 [Vmx] 섹션을 추가하여 머신 부팅시 시작할 수도 있습니다.

  • 구성에 만족하면 관리자 사용 명령 프롬프트에서 다음 명령을 실행하여 서비스를 설치하십시오. 서비스가 설치되면 서비스 구성에 저장된 INI 파일에서 사용자 비밀번호를 제거 할 수 있습니다.

C : \ vms \ VmServiceControl.exe -i

  • 이제 서비스를 처음 시작하기 전에 컴퓨터를 재부팅해야합니다. 그렇지 않으면 VM을 찾을 수 없습니다.

  • 재부팅시 서비스가 시작되고 ( '자동 (지연된 시작)'지연에 따라) VM은 부팅시 시작됩니다.


1
응답이 끊어진 경우 답변 내에 링크를 요약 할 수 있습니까?
jonsca

요청에 따라 게시물이 수정되었습니다.
RooiWillie

이 VirtualBox 4.2.x 버전에서 작동합니까?
Archimedes Trajano

이 지침은 일부 이전 버전에 적용되며 현재 버전의 VBoxVmService (4.1)가 설정하기 쉽고 프로세스를 안내합니다.
Melebius

2

이것을 다른 옵션으로 제공하면됩니다.

기본 제공 Windows 명령 'sc'를 사용하여 서비스를 작성하십시오. 이것을 'vboxheadless'와 결합하면 원하는 곳으로 갈 수 있습니다.

구체적으로 vboxheadless로 테스트하지 않았지만 calc.exe를 실행하는 테스트 서비스를 만들었습니다. 다음과 같이해야합니다.

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

자세한 내용은 sc 설명서를 참조하십시오. 참고 : 등호 뒤의 공백은 의도적 인 것입니다.


그러면 서비스가 올바르게 시작되지만 서비스가 중지되면 VM이 중단됩니다 .VBoxHeadless는 서비스 중지 제어를 올바르게 해석 할 수 없으므로 Windows는 시간 종료까지 기다렸다가 프로세스를 강제 종료합니다. 이상적이지 않습니다. 래퍼 스크립트에 대한 다른 답변을 참조하십시오.
Aaron Miller

의견 주셔서 감사합니다. 바라건대, 이것은 버그 수정 / 기능 요청으로 개발자에게 제출되기를 바랍니다.
Aaron Copley

1

vboxd 스크립트가 나처럼 많은 문제를 겪고 있다면 이것을 시도해 볼 수 있습니다. 그것은 동일한 기능을 제공하는 Perl로 구현 된 다소 간단한 솔루션입니다. 특히, VM은 시스템으로 시작되고 (서비스가 자동으로 시작되도록 설정되어 있다고 가정합니다. 기본값) 서비스가 중지되면 완전히 다운됩니다.

vboxd 솔루션과의 주요 차이점은 내 경험에서 처리가 훨씬 간단하다는 것 외에도이 스크립트는 VRDE 포트 설정을 VBoxHeadless로 전달하지 않으며 VM 종료는 "savestate"가 아닌 "acpipowerbutton"을 통해 처리된다는 것입니다. .

이것이 귀하의 목적에 맞지 않으면 변경하기가 쉽습니다. 첫 번째 경우 VBoxHeadless 명령 줄 문자열 ($ cmd)에 '-e "TCP / Ports = [, port ...]"를 추가하고 두 번째 경우 "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";

Windows 서비스를 설치하는 데 사용한 cygrunsrv 명령 줄은 다음과 같습니다.

 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 계정으로 실행된다는 것입니다. 이 경우 서비스로 실행되는 동안 VirtualBox 콘솔을 통해 VM을 관리 할 수 ​​없습니다. "전원 끄기"상태 인 것 같으며 해당 설정으로 이동할 수 없습니다. (서비스로 실행되는 동안 VM의 전원을 켜려고 시도하는 것은 권장 되지 않습니다. 어떤 일이 일어날지는 모르겠지만 기껏해야 VM이 될 것입니다. VM의 설정을 변경하거나 콘솔에 액세스해야하는 경우 먼저 서비스를 중지 한 다음 VBoxHeadless.exe가 종료 될 때까지 기다린 다음 VirtualBox 콘솔에서 평소와 같이 구성 / 전원을 켜십시오.

VirtualBox 콘솔을 실행하기 위해 두 번째 대화식 서비스를 설치하여이 문제를 해결할 수 있습니다. SYSTEM 계정으로 콘솔을 실행하기 때문에 실행중인 VM을보고 관리 할 가능성이 높습니다. 나는 그것을 스스로 할 필요가 없었기 때문에 그것이 효과가 있을지 확신하지 못하지만 그 이유가 보이지 않습니다. (시도해 주시면이 답변에 대한 의견을 보내 주셔서 감사합니다. 감사합니다.)

도움이 되었기를 바랍니다!


스크립트는 더 단순하지만 Perl이 필요하며 vboxd 스크립트가 매개 변수로 허용하는 몇 가지 특성을 하드 코딩합니다. virtualbox.org/manual/ch07.html 에 따르면 VRDE 포트를 허용하지 않음으로써 VM이 다른 RDP 서버가 사용하는 기본 포트를 사용하도록 설정된 경우 VBoxHeadless는 VM을 무한정 실행하지 않습니다. vboxd-installcygrunsrv의 인수 세부 사항을 편리하게 숨기므로 유용합니다. 그러나 나는 그것이 acpipowerbutton"보다" "중지"옵션에 더 동의합니다 savestate.
Derek Mahar

@DerekMahar 가치가있는 모든 것을 가져 가라. XP보다 새로운 것에서는 작동하지 않기 때문에 어쨌든 그 점이 많이 의심됩니다. ¯ \ _ (ツ) _ / ¯ 피드백 주셔서 감사합니다!
Aaron Miller

Aaron Miller, 스크립트 나 vboxd가 XP보다 새로운 Windows에서는 작동하지 않습니까? vboxd가 VirtualBox 5.1.6이 설치된 Windows 10에서 작동하게했기 때문에 스크립트를 의미한다고 가정합니다.
Derek Mahar

@DerekMahar 나는 vboxd가 아니라 내 스크립트를 의미합니다.
Aaron Miller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.