Windows XP 호스트에 Windows XP가 설치된 VirtualBox 시스템이 있습니다.
VirtualBox를 서비스로 시작하려면 어떻게하면 가상 머신을 사용할 수 있으며 가상 머신에 액세스하기 위해 VirtualBox를 시작할 필요가 없습니다 (네트워크의 VNC를 통해)?
VirtualBox Manage가 좋은 방법이라는 것을 알았지 만 초보자이기 때문에 어디서부터 시작해야할지 모르겠습니다.
어떤 아이디어?
Windows XP 호스트에 Windows XP가 설치된 VirtualBox 시스템이 있습니다.
VirtualBox를 서비스로 시작하려면 어떻게하면 가상 머신을 사용할 수 있으며 가상 머신에 액세스하기 위해 VirtualBox를 시작할 필요가 없습니다 (네트워크의 VNC를 통해)?
VirtualBox Manage가 좋은 방법이라는 것을 알았지 만 초보자이기 때문에 어디서부터 시작해야할지 모르겠습니다.
어떤 아이디어?
답변:
바로 가기 만들기 C:\Program Files\innotek VirtualBox\VBoxManage.exe
따옴표 뒤에 다음을 입력하십시오. startvm <your virtual machine name>
예:
“C:\Program Files\innotek VirtualBox\VBoxManage.exe” startvm XP
바로 가기를 시작 폴더로 복사 / 이동합니다.
추신 : 시스템이 완전히 부팅 될 때까지 가상 머신을 지연시키고 싶다면 XP에서 Startup Delayer 를 통해이를 수행 할 수 있습니다 .
현재 허용되는 답변 (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\""
}
이 솔루션은 저에게 효과적입니다. 바라건대 당신도 비슷한 행운을 빕니다.
이 시점에서 가장 간단한 대답은 VBoxVMService 입니다. 나는 그것을 시도하지 않았지만, 여기에 오면 내가 할 때 대답을 업데이트하려고 노력할 것입니다.
VBoxVMService에 동의합니다. 설치가 정말 쉽고 잘 작동하는 것 같습니다. 여기에서 설정하는 방법을 찾을 수 있습니다.
**** EDIT **** 아래 요청에 따라 링크 요약. 솔루션이 나를 위해 일했지만 크레딧은 Peter Upfold- http: //peter.upfold.org.uk/로갑니다 .
[설정]
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은 부팅시 시작됩니다.
이것을 다른 옵션으로 제공하면됩니다.
기본 제공 Windows 명령 'sc'를 사용하여 서비스를 작성하십시오. 이것을 'vboxheadless'와 결합하면 원하는 곳으로 갈 수 있습니다.
구체적으로 vboxheadless로 테스트하지 않았지만 calc.exe를 실행하는 테스트 서비스를 만들었습니다. 다음과 같이해야합니다.
sc create servicenamehere start= auto binPath= "C:\path\to\vboxheadless.exe --startvm name"
자세한 내용은 sc 설명서를 참조하십시오. 참고 : 등호 뒤의 공백은 의도적 인 것입니다.
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을보고 관리 할 가능성이 높습니다. 나는 그것을 스스로 할 필요가 없었기 때문에 그것이 효과가 있을지 확신하지 못하지만 그 이유가 보이지 않습니다. (시도해 주시면이 답변에 대한 의견을 보내 주셔서 감사합니다. 감사합니다.)
도움이 되었기를 바랍니다!
vboxd-install
cygrunsrv의 인수 세부 사항을 편리하게 숨기므로 유용합니다. 그러나 나는 그것이 acpipowerbutton
"보다" "중지"옵션에 더 동의합니다 savestate
.