web-dev-qa-db-ja.com

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

Windows XPホスト上にWindowsXPを搭載したVirtualBoxマシンがあります。

VirtualBoxをサービスとして起動して、仮想マシンを内部で取得し、仮想マシンに(ネットワークからVNC経由で)アクセスするためにVirtualBoxを起動する必要がないようにするにはどうすればよいですか?

VirtualBox Manageが最適な方法であることがわかりましたが、私はこれを初めて使用するため、どこから始めればよいのかわかりません。

何か案は?

C:\Program Files\innotek VirtualBox\VBoxManage.exeへのショートカットを作成する

引用符の後に次のように入力します:startvm <your virtual machine name>

例:

“C:\Program Files\innotek VirtualBox\VBoxManage.exe” startvm XP

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

p.s。:システムが完全に起動するまで仮想マシンを遅延させたい場合は、XP via Startup Delayer でこれを行うことができます。

0
Molly7244

現在受け入れられている回答(Molly7244)は、実際にはログイン時にVM)を開始することに注意してください。マシンを起動するときではありません。つまり、サービスではありません。

マシンの起動時に実行される実際のサービスでは、2つのスクリプト(元は here )をcygwin(cygrunsrv)と組み合わせて使用​​しています。このページの他の場所で説明されているように、VBoxHeadlessモードを利用します。

最初のスクリプトは、VBoxHeadlessを介してVMを実行します。実行する適切なVM(およびVBOXホームディレクトリなどの他の情報)の名前を環境から取得します) 2番目のスクリプトは、特定のVM(cygrunsrvを使用して、適切なenv。varsセットで最初のスクリプトを呼び出すことにより)のサービスをインストールします。最後に、共通の関数を含む3番目のファイルがあります。これらすべてをディレクトリにまとめると、次のように新しいVMをインストールできます。

$ VBOX_USER_HOME="/path/to/.VirtualBox/" vboxd-install MyVMName 3333

次に、「netstartvboxd-MyVMName」または「cygrunsrv-Svboxd-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\""
}

このソリューションは私にとってはうまく機能します。うまくいけば、同様の運が得られるでしょう。

10
John Hart

この時点で最も簡単な答えは VBoxVMService のようです。私はまだそれを試していません。私がここに来て、私がやったら答えを更新することを忘れないようにします。

8
Tao

VBoxVMServiceについて合意しました。セットアップは本当に簡単で、うまく機能しているようです。あなたはここでそれを設定する方法を見つけることができます:

http://www.windows-noob.com/forums/index.php?/topic/4931-have-virtualbox-vms-start-as-a-service-on-a-windows-Host/

****編集****以下のリクエストに従って、リンクの概要。解決策は私のために働いたが、クレジットはピーターアップフォールドに行きます- http://peter.upfold.org.uk/

  • Virtualboxをインストールし、RDPセッションを受け入れるようにVMを設定します。
  • VBoxVmServiceをダウンロードしてC:\ vmsにインストールします。ダウンロードリンクはGoogleVBoxVmServiceだけです(申し訳ありませんが、2つ以上のリンクを投稿するには担当者が足りません)。
  • C:\ vmsの下にあるVBoxVmServiceのiniファイルを編集します。

[設定]

ServiceName = VBoxVmService

VBOX_USER_HOME = C:\ Users\Administrator.VirtualBox

RunAsUser =。\ Administrator

UserPassword =ここにパスワードを入力してください

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

4
RooiWillie

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

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

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

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

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

2
Aaron Copley

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なので、何かがうまくいかない場合は、それが理由を探す最初の場所です。

覚えておくべきことの1つは、VMをこのように実行すると、自分のアカウントではなく、組み込みのSYSTEMアカウントで実行されるということです。この場合、次のようになります。サービスとして実行されている間、VirtualBoxコンソールを介してVMを管理できます。「電源オフ」状態になっているように見え、次の場所にアクセスできなくなります。その設定。(サービスとして実行中にVM)の電源を入れようとすると非推奨-何が起こるかわかりませんが、せいぜい「何もしないで、最悪の場合はVMをホース化します。)VMの設定を変更するか、コンソールにアクセスする必要がある場合は、まずサービスを停止し(そしてVBoxHeadless.exeが終了するまで待ちます)、次に構成します。通常の方法でVirtualBoxコンソールでit/power upします。

VirtualBoxコンソールを実行するための2番目のインタラクティブサービスをインストールすることで、おそらくこの問題を解決できます。これにより、SYSTEMアカウントでもコンソールが実行されるため、実行中のVMを表示および管理できる可能性があります。自分でやる必要がなかったので、うまくいくかどうかはわかりませんが、うまくいかない理由はわかりません。 (試してみた場合は、この回答に対するコメントをお願いします。それがどのように機能したかを教えてください。ありがとう!)

お役に立てれば!

1
Aaron Miller