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
ショートカットをスタートアップフォルダーにコピー/移動します。
ps:システムが完全に起動するまで仮想マシンを遅延させる場合は、XPでStartup Delayerを使用してこれを実行できます。
現在受け入れられている答え(Molly7244)は、マシンをブートするときではなく、ログインしたときにVMを実際に起動することに注意してください。つまり、サービスではありません。
マシンの起動時に実行される実際のサービスでは、cygwin(cygrunsrv)と組み合わせて2つのスクリプト(元々はここから)を使用します。このページの他の場所で説明されているように、VBoxHeadlessモードを使用します。
最初のスクリプトは、VBoxHeadlessを介してVMを実行します。環境変数から実行する適切なVMの名前(およびVBOXホームディレクトリなどの他の情報)を取得します。2番目のスクリプトは、特定のVMにサービスをインストールします(cygrunsrvを使用して、正しいenv。varsセットで最初のスクリプトを呼び出します)。最後に、一般的な機能を含む3番目のファイルがあります。これらをすべてディレクトリにまとめると、次のように新しい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に同意しました。設定は本当に簡単で、うまく機能しているようです。設定方法については、次を参照してください。
****編集****以下のリクエストに従って、リンクの要約。ソリューションは私にとってはうまくいきましたが、クレジットはPeter Upfold- http: //peter.upfold.org.uk/にあります
[設定]
ServiceName = VBoxVmService
VBOX_USER_HOME = C:\ Users \ Administrator.VirtualBox
RunAsUser =。\ Administrator
UserPassword = enteryourpasswordhere
RunWebService = no
PauseShutdown = 5000
[Vm0] VmName = VirtualBoxのvmの名前
ShutdownMethod = savestate
AutoStart = yes
VBOX_USER_HOMEを正しいユーザーのホームディレクトリの.VirtualBoxフォルダー、およびRunAsUserディレクティブとUserPasswordディレクティブに置き換え、VirtualBoxアプリのターゲット仮想マシンの名前をVmNameに設定します。他の仮想マシンで[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」によって処理されることです。 。
これが目的に合わない場合は、簡単に変更できます。最初のケースでは、 '-e "TCP / Ports = [、port ...]"'をVBoxHeadlessコマンドライン文字列($ cmd)に追加し、2番目のケースでは、「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。だから何かがおかしくなったら、それが理由を探す最初の場所です。
心に留めておくべきことの1つは、この方法でVMを実行すると、自分ではなくビルトインSYSTEMアカウントで実行されることです。この場合、サービスとして実行されている間、VirtualBoxコンソールを介してVMを管理することはできません。「電源が入っていない」状態になり、設定にアクセスできなくなります。(VMをサービスとして実行中にパワーオンしようとすることはお勧めしません-何が起こるかわかりませんが、せいぜい何も操作せず、最悪の場合はVMをホース接続します。) VMの設定を変更するか、コンソールにアクセスする必要がある場合は、最初にサービスを停止し(そしてVBoxHeadless.exeが終了するのを待って)、通常どおりにVirtualBoxコンソールで設定/起動します。
VirtualBoxコンソールを実行するための2番目の対話型サービスをインストールすることにより、おそらくこの問題を解決できます。SYSTEMアカウントでもコンソールが実行されるため、実行中のVMを表示および管理できる可能性が高くなります。私は自分でそれを行う必要がなかったので、それがうまくいくかどうかはわかりませんが、うまくいかない理由はわかりません。(試してみたら、この回答へのコメントをいただければ幸いです。どのように機能したか教えてください。ありがとう!)
お役に立てれば!
vboxd-install
cygrunsrvの引数の詳細を便利に隠すので便利です。ただし、これacpipowerbutton
はの場合よりも優れた「停止」オプションですsavestate
。