VirtualBoxマシンをWindows XPでサービスとして実行するにはどうすればよいですか?


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

ショートカットをスタートアップフォルダーにコピー/移動します。

ps:システムが完全に起動するまで仮想マシンを遅延させる場合は、XPでStartup Delayerを使用してこれを実行できます


仮想マシンのウィンドウを「非表示」にする方法はありますか?
ジョニーD.カノ

VBoxをサービスとして実行しても、ウィンドウは非表示になりません。ただし、AWMを使用してシステムトレイに自動的に最小化できます。eusing.com

15
UIなしでVMを起動するための「VBoxHeadless」をチェックアウトします。VMの画面を表示するには、RDPを使用する必要があります。
マークポーター

13
これはサービスではありません。これは、ログイン時にのみVBoxを実行します。マシンの電源がオンのときは実行されません。VBoxHeadlessは、サービスとして実行するための方法です。以下の私の回答を参照してください(アーロンコプリーのコメントごとに改善します)。
ジョンハート

答えは、サービスとして実行することとは関係ありません。スタートアップはユーザーのログオン後に行われますが、サービスの動作とはまったく異なります。
フェリーチェポラーノ16年

10

現在受け入れられている答え(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\""
}

この解決策は私にとって非常に効果的です。うまくいけば、同様の運があります。


4
「サービスではない」場合は+1 ...ソリューションに含めるのではなく、ソリューションにリンクする場合は-1。投票は無効です。:)リンクの腐敗はこの回答の寿命に有害なので、ソリューションを含めるように修正することを検討してください。
アーロンコプリー

8

この時点で最も簡単な答えはVBoxVMServiceのようです。まだ試したことはありません。ここに来て、答えた場合は更新することを忘れないでください。


1
ただし、4.2.xでは動作しません
アルキメデストラハノ

2
@ArchimedesTrajano VirtualBox 4.3.6で現在のバージョン(4.1)を試しましたが、うまく動作します。プロジェクトのページは、それが「ほとんどゼロから書き直されたと主張しています。
メレビウス14

1
うん、昨夜それをテストしただけで、うまくいきます!再起動することを忘れないでください。
アルキメデストラハノ14

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をインストールし、RDPセッションを受け入れるようにVMをセットアップします。
  • VBoxVmServiceをC:\ vmsにダウンロードしてインストールします。ダウンロードリンク用のGoogle VBoxVmServiceのみ(申し訳ありませんが、3つ以上のリンクを投稿するのに十分な担当者ではありません)。
  • C:\ vmsの下のVBoxVmServiceのiniファイルを編集します。

[設定]

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が開始されます。


1
リンクが機能しなくなった場合に備えて、回答内のリンクを要約できますか?
jonsca

要求に応じて投稿を編集しました。
ルイウィリー

これは4.2.xバージョンのVirtualBoxで機能しますか?
アルキメデストラハノ

これらの手順はおそらくいくつかの古いバージョンに適用されます。VBoxVmServiceの現在のバージョン(4.1)はセットアップが簡単で、プロセスをガイドします。
メレビウス14

2

これを別のオプションとして提供するだけです:

組み込みのWindowsコマンド「sc」を使用して、サービスを作成します。これを「vboxheadless」と組み合わせると、目的の場所に移動できます。

特にvboxheadlessではテストされていませんが、calc.exeを実行するテストサービスを作成しました。あなたはこのようなことをするべきです:

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

詳細については、scのドキュメントを参照してください。注:等号の後のスペースは意図的なものです。


これにより、サービスが正しく開始されますが、サービスが停止するとVMがクラッシュします-VBoxHeadlessはサービス停止コントロールを正しく解釈できないため、Windowsはタイムアウトになるまで待機してから強制的にプロセスを強制終了しますが、これは理想的ではありません。それを防ぐために、ラッパースクリプトに関する他の回答を参照してください。
アーロンミラー

コメントをありがとう。うまくいけば、これはバグ修正/機能リクエストとして開発者に提出されます。
アーロンコプリー

1

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を表示および管理できる可能性が高くなります。私は自分でそれを行う必要がなかったので、それがうまくいくかどうかはわかりませんが、うまくいかない理由はわかりません。(試してみたら、この回答へのコメントをいただければ幸いです。どのように機能したか教えてください。ありがとう!)

お役に立てれば!


スクリプトは簡単ですが、Perlが必要であり、vboxdスクリプトがパラメーターとして受け入れるいくつかのプロパティをハードコードします。virtualbox.org/manual/ch07.htmlによると、VRDEポートを受け入れないことにより、VMが別のRDPサーバーが使用しているデフォルトポートを使用するように設定されている場合、VBoxHeadlessはVMを実行しません(無期限にブロックします)。vboxd-installcygrunsrvの引数の詳細を便利に隠すので便利です。ただし、これacpipowerbuttonはの場合よりも優れた「停止」オプションですsavestate
デレクマハル

@DerekMahar価値があるものなら何でも持って行ってください。XPよりも新しいものでは動作しないため、どのような場合でも大したことではないでしょう。¯\ _(ツ)_ /¯フィードバックありがとうございます!
アーロンミラー

アーロンミラー、スクリプトまたはvboxdがXPより新しいWindowsでは動作しないということですか?VirtualBox 5.1.6を搭載したWindows 10でvboxdが動作するようになったため、あなたのスクリプトを意味していると思います。
デレクマハル

@DerekMahar私はvboxdではなく、私のスクリプトを意味します。
アーロンミラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.