Wie kann ich eine VirtualBox-Maschine als Dienst unter Windows XP ausführen?


12

Ich habe eine VirtualBox-Maschine mit Windows XP auf einem Windows XP-Host.

Wie kann ich VirtualBox als Dienst starten, um eine virtuelle Maschine unter die Haube zu bekommen, und ich muss VirtualBox nicht starten, um auf meine virtuelle Maschine zuzugreifen (über VNC aus dem Netzwerk)?

Ich fand, dass VirtualBox Manage der richtige Weg ist, aber da ich ein Anfänger bin, weiß ich nicht, wo ich anfangen soll.

Irgendwelche Ideen?

Antworten:


0

Erstellen Sie eine Verknüpfung zu C:\Program Files\innotek VirtualBox\VBoxManage.exe

Nach den Anführungszeichen eingeben: startvm <your virtual machine name>

Beispiel:

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

Kopieren / Verschieben Sie die Verknüpfung in Ihren Startordner.

ps: Wenn Sie die virtuelle Maschine verzögern möchten, bis Ihr System vollständig gestartet ist, können Sie dies in XP über Startup Delayer tun .


Es scheint gut zu funktionieren. Gibt es überhaupt eine Möglichkeit, das Fenster für die virtuelle Maschine zu "verstecken", damit es eher wie ein Windows-Dienst ausgeführt wird?
Jhonny D. Cano -Leftware-

Wenn Sie VBox als Dienst ausführen, wird das Fenster nicht ausgeblendet. Sie können es jedoch mit AWM automatisch in die Taskleiste minimieren: eusing.com/WindowManager/WindowManager.htm

15
checkout "VBoxHeadless" zum Starten von VMs ohne Benutzeroberfläche. Sie müssen RDP verwenden, wenn Sie den Bildschirm der VM sehen möchten.
Mark Porter

13
Dies ist kein Service. Dies führt VBox nur aus, wenn Sie sich anmelden - nicht, wenn der Computer eingeschaltet ist. VBoxHeadless ist der richtige Weg, um als Dienst ausgeführt zu werden. Siehe meine Antwort unten (die ich laut Aaron Copleys Kommentar verbessern werde).
John Hart

Die Antwort hat nichts damit zu tun, als Dienst ausgeführt zu werden. Der Start erfolgt nach einer Benutzeranmeldung, völlig anders als das Verhalten der Dienste.
Felice Pollano

9

Beachten Sie, dass die aktuell akzeptierte Antwort (Molly7244) die VM tatsächlich startet, wenn Sie sich anmelden - nicht, wenn Sie den Computer starten. Es ist also keine Dienstleistung.

Für einen tatsächlichen Dienst, der beim Booten des Computers ausgeführt wird, verwende ich zwei Skripte (ursprünglich von hier ) in Verbindung mit cygwin (cygrunsrv). Verwendet den VBoxHeadless-Modus, wie an anderer Stelle auf dieser Seite erwähnt.

Das erste Skript führt Ihre VM über VBoxHeadless aus. Aus Umgebungsvariablen wird der Name der richtigen VM abgerufen, die ausgeführt werden soll (und andere Informationen, z. B. Ihr VBOX-Ausgangsverzeichnis). Das zweite Skript installiert einen Dienst für eine bestimmte VM (indem mit cygrunsrv das erste Skript mit der richtigen Umgebungsvariable aufgerufen wird). Schließlich gibt es eine dritte Datei, die allgemeine Funktionen enthält. Wenn Sie all dies in einem Verzeichnis zusammenfassen, können Sie eine neue VM wie folgt installieren:

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

Und dann starten Sie den Dienst mit "net start vboxd-MyVMName" oder "cygrunsrv -S vboxd-MyVMName".

Hier ist das VM-Skript "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"

Und hier ist das Installationsskript "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"

Und schließlich ist hier das ".libcommon" -Skript, auf das von beiden verwiesen wird:

# -*-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\""
}

Diese Lösung eignet sich hervorragend für mich. hoffentlich haben Sie ähnliches Glück.


4
+1 für "kein Dienst" ... -1 für das Verknüpfen mit der Lösung, anstatt sie in die Antwort aufzunehmen. Abstimmung ist null. :) Erwägen Sie eine Überarbeitung, um die Lösung einzuschließen, da Link Rot die Langlebigkeit dieser Antwort beeinträchtigt.
Aaron Copley

8

Die derzeit einfachste Antwort scheint VBoxVMService zu sein . Ich habe es noch nicht ausprobiert, ich werde versuchen, mich daran zu erinnern, hierher zu kommen und die Antwort zu aktualisieren, wenn / wenn ich es tue.


1
Es funktioniert jedoch nicht mit 4.2.x
Archimedes Trajano

2
@ArchimedesTrajano Ich habe die aktuelle Version (4.1) mit VirtualBox 4.3.6 ausprobiert und es läuft gut. Die Seite des Projekts behauptet, es sei "fast von Grund auf neu geschrieben" worden .
Melebius

1
Ja, ich habe es letzte Nacht getestet und es funktioniert! Denken Sie daran, neu zu starten.
Archimedes Trajano

4

Einverstanden über VBoxVMService. Es ist sehr einfach einzurichten und scheint gut zu funktionieren. Eine Anleitung zum Einrichten finden Sie hier:

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

**** BEARBEITEN **** Gemäß der Anfrage unten eine Zusammenfassung des Links. Obwohl die Lösung für mich funktioniert hat, geht der Kredit an Peter Upfold - http://peter.upfold.org.uk/

  • Installieren Sie Virtualbox und richten Sie die VM so ein, dass RDP-Sitzungen akzeptiert werden.
  • Laden Sie VBoxVmService herunter und installieren Sie es unter C: \ vms. Nur Google VBoxVmService für einen Download-Link (leider nicht genug Mitarbeiter, um mehr als 2 Links zu posten).
  • Bearbeiten Sie die INI-Datei von VBoxVmService unter C: \ vms:

[Die Einstellungen]

ServiceName = VBoxVmService

VBOX_USER_HOME = C: \ Users \ Administrator.VirtualBox

RunAsUser =. \ Administrator

UserPassword = EnteryourPasswordhere

RunWebService = no

PauseShutdown = 5000

[Vm0] VmName = Name der VM in VirtualBox

ShutdownMethod = savestate

AutoStart = Ja

  • Ersetzen Sie im Ordner VBOX_USER_HOME den Ordner .VirtualBox im Basisverzeichnis des richtigen Benutzers sowie die Anweisungen RunAsUser und UserPassword, und legen Sie den Namen der virtuellen Zielmaschine in der VirtualBox-App in VmName fest. Sie können nach [Vm0] weitere [Vmx] -Abschnitte mit anderen virtuellen Maschinen hinzufügen, die beim Systemstart gestartet werden.

  • Wenn Sie mit Ihrer Konfiguration zufrieden sind, führen Sie an einer vom Administrator aktivierten Eingabeaufforderung den folgenden Befehl aus, um den Dienst zu installieren. Sobald der Dienst installiert ist, können Sie Ihr Benutzerkennwort aus der INI-Datei entfernen, da es in der Dienstkonfiguration gespeichert ist:

C: \ vms \ VmServiceControl.exe -i

  • Jetzt müssen Sie den Computer neu starten, bevor Sie versuchen, den Dienst zum ersten Mal zu starten. Andernfalls können die VMs nicht gefunden werden.

  • Nach dem Neustart sollte der Dienst gestartet werden (vorbehaltlich der Verzögerung „Automatisch (verzögerter Start)“) und Ihre VMs werden beim Start gestartet.


1
Können Sie den Link in Ihrer Antwort zusammenfassen, falls er nicht mehr funktioniert?
Jonsca

Beitrag wie gewünscht bearbeitet.
RooiWillie

funktioniert das auf der 4.2.x Version von VirtualBox?
Archimedes Trajano

Diese Anweisungen gelten wahrscheinlich für einige ältere Versionen. Die aktuelle Version von VBoxVmService (4.1) ist einfacher einzurichten und führt Sie durch den Vorgang.
Melebius

2

Biete dies einfach als weitere Option an:

Verwenden Sie den integrierten Windows-Befehl 'sc', um einen Dienst zu erstellen. Wenn Sie dies mit "vboxheadless" kombinieren, gelangen Sie dorthin, wo Sie sein möchten.

Speziell mit vboxheadless nicht getestet, aber ich habe einen Testdienst erstellt, der calc.exe ausführt. Sie sollten so etwas tun:

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

Weitere Informationen finden Sie in der Dokumentation zu sc. Hinweis: Diese Leerzeichen nach dem Gleichheitszeichen sind beabsichtigt.


Dadurch wird der Dienst korrekt gestartet, aber die VM stürzt ab, wenn der Dienst beendet wird. VBoxHeadless kann die Steuerung zum Beenden des Dienstes nicht korrekt interpretieren. Daher wartet Windows bis zum Timeout und bricht den Prozess gewaltsam ab, was nicht optimal ist. Weitere Antworten zu Wrapper-Skripten, um dies zu verhindern.
Aaron Miller

Danke für den Kommentar. Hoffentlich wird dies den Entwicklern als Fehlerbehebungs- / Funktionsanforderung übermittelt.
Aaron Copley

1

Wenn Sie mit den vboxd-Skripten genauso Probleme haben wie mit mir, können Sie dies versuchen. Es ist eine einfachere Lösung, die in Perl implementiert ist und die gleiche Funktionalität bietet. Insbesondere startet die VM mit dem System (vorausgesetzt, der Dienst wird automatisch gestartet, was die Standardeinstellung ist) und geht sauber aus, wenn der Dienst beendet wird.

Die Hauptunterschiede zur vboxd-Lösung bestehen darin, dass dieses Skript meiner Erfahrung nach keine VRDE-Porteinstellung an VBoxHeadless übergibt und das Herunterfahren der VM über "acpipowerbutton" und nicht über "savestate" erfolgt. .

Wenn dies nicht zu Ihren Zwecken passt, können Sie es leicht ändern. Fügen Sie im ersten Fall der VBoxHeadless-Befehlszeilenzeichenfolge ($ cmd) '-e "TCP / Ports = [, port ...]" hinzu, und ändern Sie im zweiten Fall "acpipowerbutton" in "savestate" der SIGTERM-Handler.

Hier ist das Perl-Skript:

 #!/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";

Und hier ist die cygrunsrv-Befehlszeile, mit der ich den Windows-Dienst installiert habe:

 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

Von da an sollte es nur noch darum gehen, 'sc start <Dienstname>' auszugeben, und Sie sollten bereit sein - denken Sie daran, dass sich cygrunsrv-Dienste standardmäßig in / var / log / <Dienstname> anmelden .log. Wenn sich also etwas schlecht verhält, ist dies der erste Ort, an dem Sie nach einem Grund suchen.

Beachten Sie, dass die VM auf diese Weise unter dem integrierten SYSTEM-Konto und nicht unter Ihrem eigenen Konto ausgeführt wird. In diesem Fall können Sie die VM nicht über die VirtualBox-Konsole verwalten, während sie als Dienst ausgeführt wird. Es scheint sich im Status "Ausgeschaltet" zu befinden, und Sie können nicht zu den Einstellungen gelangen. (Der Versuch, die VM einzuschalten, während sie als Dienst ausgeführt wird, wird nicht empfohlen. Ich weiß nicht, was passieren wird, aber im besten Fall ist es ein No-Op, und im schlimmsten Fall wird Ihre VM damit überlastet.) Wenn Sie die Einstellungen der VM ändern oder auf die Konsole zugreifen müssen, beenden Sie zuerst den Dienst (und warten Sie, bis VBoxHeadless.exe beendet ist) und konfigurieren Sie ihn / schalten Sie ihn in der VirtualBox-Konsole wie gewohnt ein.

Sie könnten dieses Problem wahrscheinlich lösen, indem Sie einen zweiten interaktiven Dienst installieren, um die VirtualBox-Konsole auszuführen. Da die Konsole dann auch unter dem SYSTEM-Konto ausgeführt wird, kann sie die ausgeführte VM höchstwahrscheinlich sehen und verwalten. Ich musste das nicht selbst tun, also bin ich mir nicht sicher, ob es funktionieren würde, aber ich sehe keinen Grund, warum es nicht funktionieren würde. (Wenn du es versuchst, würde ich mich über einen Kommentar zu dieser Antwort freuen und mich wissen lassen, wie es für dich funktioniert hat. Danke!)

Hoffe das hilft!


Ihr Skript ist einfacher, erfordert jedoch Perl und einige Eigenschaften, die das vboxd-Skript als Parameter akzeptiert. Laut virtualbox.org/manual/ch07.html führt VBoxHeadless die VM nicht aus (sie wird nur auf unbestimmte Zeit blockiert), wenn die VM auf den Standardport eingestellt ist, den ein anderer RDP-Server verwendet. vboxd-installist hilfreich, weil es bequem Argumentdetails von cygrunsrv verbirgt. Ich stimme jedoch zu, dass dies acpipowerbuttoneine bessere "Stopp" -Option ist als savestate.
Derek Mahar

@DerekMahar Nimm es für alles, was es wert ist, nehme ich an. Da es auf nichts neuerem als XP funktioniert, bezweifle ich, dass das auf jeden Fall eine ganze Menge ist. ¯ \ _ (ツ) _ / ¯ Danke für das Feedback!
Aaron Miller

Aaron Miller, meinst du, dein Skript oder vboxd funktionieren unter keinem neueren Windows als XP? Ich nehme an, Sie meinen Ihr Skript, weil ich vboxd dazu gebracht habe, unter Windows 10 mit VirtualBox 5.1.6 zu arbeiten.
Derek Mahar

@DerekMahar Ich meine mein Skript, nicht vboxd.
Aaron Miller
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.