Comment puis-je exécuter une machine VirtualBox en tant que service sur Windows XP?


13

J'ai une machine VirtualBox avec Windows XP sur un hôte Windows XP.

Comment puis-je démarrer VirtualBox en tant que service, afin de pouvoir obtenir une machine virtuelle sous le capot, et je n'ai pas besoin de démarrer VirtualBox pour accéder à ma machine virtuelle (via VNC depuis le réseau)?

J'ai trouvé que VirtualBox Manage pourrait être la voie à suivre, mais comme je suis un débutant avec cela, je ne sais pas par où commencer.

Des idées?

Réponses:


0

Créer un raccourci vers C:\Program Files\innotek VirtualBox\VBoxManage.exe

Après les guillemets, entrez: startvm <your virtual machine name>

Exemple:

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

Copiez / déplacez le raccourci vers votre dossier de démarrage.

ps: si vous voulez retarder la machine virtuelle jusqu'à ce que votre système soit complètement démarré, vous pouvez le faire dans XP via Startup Delayer .


Il semble bien fonctionner. Existe-t-il de toute façon de "masquer" la fenêtre de la machine virtuelle, afin qu'elle fonctionne plus comme un service Windows?
Jhonny D. Cano -Leftware-

l'exécution de VBox en tant que service ne masquera pas la fenêtre. vous pouvez cependant le réduire automatiquement dans la barre d'état système avec AWM: eusing.com/WindowManager/WindowManager.htm

15
checkout "VBoxHeadless" pour lancer des VM sans UI. Vous devrez utiliser RDP si vous voulez voir l'écran de la machine virtuelle.
Mark Porter

13
Ce n'est pas un service. Cela n'exécute VBox que lorsque vous vous connectez - pas lorsque la machine est sous tension. VBoxHeadless est la voie à suivre pour fonctionner en tant que service. Voir ma réponse ci-dessous (que je suis sur le point d'améliorer par le commentaire d'Aaron Copley).
John Hart

La réponse n'a rien à voir avec l'exécution en tant que service. Le démarrage se produit après une connexion utilisateur, complètement différent du comportement des services.
Felice Pollano du

10

Notez que la réponse actuellement acceptée (Molly7244) démarre réellement la VM lorsque vous vous connectez - pas lorsque vous démarrez la machine. Ce n'est pas, en d'autres termes, un service.

Pour un service réel qui s'exécute lorsque la machine démarre, j'utilise deux scripts (à l'origine d' ici ) en conjonction avec cygwin (cygrunsrv). Utilise le mode VBoxHeadless comme mentionné ailleurs sur cette page.

Le premier script exécute votre machine virtuelle via VBoxHeadless; il obtient le nom de la bonne machine virtuelle à exécuter (et d'autres informations telles que votre répertoire personnel VBOX) à partir des variables d'environnement. Le deuxième script installe un service pour une machine virtuelle particulière (en utilisant cygrunsrv pour appeler le premier script avec le bon jeu de variables env.). Enfin, il y a un troisième fichier qui contient des fonctions communes. Si vous mettez tous ces éléments dans un répertoire, vous pouvez installer un nouveau vm comme ceci:

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

Et puis démarrez le service avec "net start vboxd-MyVMName" ou "cygrunsrv -S vboxd-MyVMName".

Voici le script exécutant la machine virtuelle, "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"

Et voici le script d'installation, "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"

Et, enfin, voici le script ".libcommon" référencé par les deux:

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

Cette solution fonctionne très bien pour moi; j'espère que vous aurez la même chance.


4
+1 pour "pas un service" ... -1 pour un lien vers la solution plutôt que de l'inclure dans la réponse. Le vote est nul. :) Envisagez de réviser pour inclure la solution, car la pourriture des liens nuit à la longévité de cette réponse.
Aaron Copley

8

Il semble que la réponse la plus simple à ce stade soit VBoxVMService . Je ne l'ai pas encore essayé, je vais essayer de me rappeler de venir ici et de mettre à jour la réponse si / quand je le fais.


1
mais cela ne fonctionne pas avec 4.2.x
Archimedes Trajano

2
@ArchimedesTrajano J'ai essayé la version actuelle (4.1) avec VirtualBox 4.3.6 et elle fonctionne bien. La page du projet affirme qu'il a été "réécrit presque à partir de zéro" .
Melebius

1
Ouais je viens de le tester hier soir et ça marche! N'oubliez pas de redémarrer.
Archimedes Trajano

4

Convenu sur VBoxVMService. Il est vraiment facile à installer et semble bien fonctionner. Vous pouvez trouver un moyen de le configurer ici:

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

**** EDIT **** Conformément à la demande ci-dessous, un résumé du lien. Bien que la solution ait fonctionné pour moi, le mérite revient à Peter Upfold - http://peter.upfold.org.uk/

  • Installez Virtualbox et configurez la machine virtuelle pour accepter les sessions RDP.
  • Téléchargez et installez VBoxVmService dans C: \ vms. Juste Google VBoxVmService pour un lien de téléchargement (désolé, pas assez de représentant pour poster plus de 2 liens).
  • Modifiez le fichier ini de VBoxVmService sous C: \ vms:

[Réglages]

ServiceName = VBoxVmService

VBOX_USER_HOME = C: \ Users \ Administrator.VirtualBox

RunAsUser =. \ Administrator

UserPassword = enteryourpasswordhere

RunWebService = no

PauseShutdown = 5000

[Vm0] VmName = nom du vm dans VirtualBox

ShutdownMethod = savestate

Démarrage automatique = oui

  • Remplacez dans VBOX_USER_HOME par le dossier .VirtualBox dans le répertoire de base de l'utilisateur correct, ainsi que les directives RunAsUser et UserPassword, et définissez le nom de la machine virtuelle cible dans l'application VirtualBox dans VmName. Vous pouvez également ajouter des sections [Vmx] supplémentaires après [Vm0] avec d'autres machines virtuelles pour démarrer au démarrage de la machine.

  • Lorsque vous êtes satisfait de votre configuration, à partir d'une invite de commandes activée par l'administrateur, exécutez la commande suivante pour installer le service. Une fois le service installé, vous pouvez supprimer votre mot de passe utilisateur du fichier INI, tel qu'il est enregistré dans la configuration du service:

C: \ vms \ VmServiceControl.exe -i

  • Maintenant, vous devez redémarrer l'ordinateur avant d'essayer de démarrer le service pour la première fois, sinon il ne pourra pas localiser les machines virtuelles.

  • Au redémarrage, le service devrait démarrer (sous réserve du délai «Automatique (démarrage différé)») et vos machines virtuelles seront démarrées au démarrage.


1
Pouvez-vous résumer le lien dans votre réponse au cas où il mourrait?
jonsca

Message modifié comme demandé.
RooiWillie

cela fonctionne-t-il sur la version 4.2.x de VirtualBox?
Archimedes Trajano

Ces instructions s'appliquent probablement à une ancienne version, la version actuelle de VBoxVmService (4.1) est plus facile à configurer et vous guidera tout au long du processus.
Melebius

2

Je propose simplement cela comme une autre option:

Utilisez la commande Windows intégrée «sc» pour créer un service. Combinez cela avec 'vboxheadless' vous amènera là où vous voulez être.

Non testé avec vboxheadless en particulier, mais j'ai créé un service de test qui exécute calc.exe. Vous devriez faire quelque chose comme ça:

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

Reportez-vous à la documentation de sc pour plus d'informations. Remarque: ces espaces après le signe égal sont intentionnels.


Cela démarrera le service correctement, mais plantera la machine virtuelle lorsque le service est arrêté - VBoxHeadless ne peut pas interpréter correctement le contrôle d'arrêt du service, donc Windows attendra le délai d'expiration, puis tuera de force le processus, ce qui est loin d'être idéal. Voir les autres réponses pour les scripts wrapper pour éviter que cela se produise.
Aaron Miller,

Merci pour le commentaire. Espérons que cela soit soumis aux développeurs sous forme de correction de bogue / demande de fonctionnalité.
Aaron Copley

1

Si les scripts vboxd vous causent autant de problèmes qu'ils m'ont fait, vous voudrez peut-être essayer ceci; c'est une solution plutôt simple, implémentée en Perl, qui fournit les mêmes fonctionnalités. Plus précisément, la machine virtuelle démarre avec le système (en supposant que le service est configuré pour démarrer automatiquement, ce qui est la valeur par défaut), et s'arrête proprement lorsque le service est arrêté.

Les principales différences par rapport à la solution vboxd, en plus d'être considérablement plus simple à gérer dans mon expérience, sont que ce script ne transmet pas de paramètre de port VRDE à VBoxHeadless, et que l'arrêt de la machine virtuelle est géré via "acpipowerbutton" plutôt que "savestate" .

Si cela ne correspond pas à vos objectifs, il est assez facile de changer; dans le premier cas, ajoutez '-e "TCP / Ports = [, port ...]"' à la chaîne de ligne de commande VBoxHeadless ($ cmd), et dans le second cas, changez simplement "acpipowerbutton" en "savestate" dans le gestionnaire SIGTERM.

Voici le script 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";

Et voici la ligne de commande cygrunsrv que j'ai utilisée pour installer le service Windows:

 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

À partir de là, il suffit de lancer 'sc start <service-name>', et vous devriez être prêt à partir - n'oubliez pas que, par défaut, les services cygrunsrv se connectent à / var / log / <service-name> .log, donc si quelque chose se comporte mal, c'est le premier endroit pour chercher une raison.

Une chose à garder à l'esprit est que, lorsque vous exécutez la machine virtuelle de cette façon, elle s'exécutera sous le compte SYSTEM intégré, plutôt que le vôtre. Cela étant, vous ne pourrez pas administrer la machine virtuelle via la console VirtualBox pendant qu'elle s'exécute en tant que service; il semblera être dans l'état "Éteint" et vous ne pourrez pas accéder à ses paramètres. (Il n'est pas recommandé d' essayer de mettre la VM sous tension en tant que service - je ne sais pas ce qui se passera, mais au mieux, ce sera une absence d'opération, et au pire, cela va arroser votre VM.) Si vous devez modifier les paramètres de la machine virtuelle ou accéder à la console, arrêtez d'abord le service (et attendez que VBoxHeadless.exe se termine), puis configurez-le / mettez-le sous tension dans la console VirtualBox comme vous le feriez normalement.

Vous pouvez probablement résoudre ce problème en installant un deuxième service interactif pour exécuter la console VirtualBox; car cela exécuterait également la console sous le compte SYSTEM, il serait probablement en mesure de voir et de gérer la machine virtuelle en cours d'exécution. Je n'ai pas eu besoin de le faire moi-même, donc je ne suis pas sûr que cela fonctionnerait, mais je ne vois pas pourquoi cela ne fonctionnerait pas. (Si vous l'essayez, j'apprécierais un commentaire à cette réponse, me faisant savoir comment cela a fonctionné pour vous. Merci!)

J'espère que cela t'aides!


Votre script est plus simple, mais nécessite Perl et code dur plusieurs propriétés que le script vboxd accepte comme paramètres. Selon virtualbox.org/manual/ch07.html , en n'acceptant pas le port VRDE, VBoxHeadless n'exécutera pas la machine virtuelle (elle se bloque juste indéfiniment) si la machine virtuelle est définie pour utiliser le port par défaut utilisé par un autre serveur RDP. vboxd-installest utile car il cache commodément les détails des arguments de cygrunsrv. Je suis d'accord, cependant, c'est acpipowerbuttonune meilleure option "stop" que savestate.
Derek Mahar du

@DerekMahar Prenez-le pour ce qu'il vaut, je suppose. Comme cela ne fonctionne pas sur quelque chose de plus récent que XP, je doute que ce soit beaucoup de toute façon. ¯ \ _ (ツ) _ / ¯ Merci pour la rétroaction!
Aaron Miller du

Aaron Miller, voulez-vous dire que votre script ou vboxd ne fonctionne pas sur Windows plus récent que XP? Je suppose que vous voulez dire votre script parce que j'ai réussi à faire fonctionner vboxd sur Windows 10 avec VirtualBox 5.1.6.
Derek Mahar

@DerekMahar Je veux dire mon script, pas vboxd.
Aaron Miller
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.