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.