¿Cómo puedo ejecutar una máquina VirtualBox como servicio en Windows XP?


13

Tengo una máquina VirtualBox con Windows XP en un Windows XP Host.

¿Cómo puedo iniciar VirtualBox como un servicio, para poder obtener una máquina virtual bajo el capó, y no tengo que iniciar VirtualBox para acceder a mi máquina virtual (a través de VNC desde la red)?

Descubrí que VirtualBox Manage podría ser el camino a seguir, pero como soy un principiante con esto, no sé por dónde empezar.

¿Algunas ideas?

Respuestas:


0

Crear un acceso directo para C:\Program Files\innotek VirtualBox\VBoxManage.exe

Después de las comillas ingrese: startvm <your virtual machine name>

Ejemplo:

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

Copie / mueva el acceso directo a su carpeta de inicio.

ps: si desea retrasar la máquina virtual hasta que su sistema se inicie por completo, puede hacerlo en XP a través de Startup Delayer .


Parece que funciona bien, ¿hay alguna forma de "ocultar" la ventana de la máquina virtual también, para que se ejecute más como un servicio de Windows?
Jhonny D. Cano -Leftware-

ejecutar VBox como servicio no ocultará la ventana. sin embargo, puede minimizarlo automáticamente en la bandeja del sistema con AWM: eusing.com/WindowManager/WindowManager.htm

15
compruebe "VBoxHeadless" para iniciar máquinas virtuales sin interfaz de usuario. Deberá usar RDP si desea ver la pantalla de la VM.
Mark Porter el

13
Esto no es un servicio. Esto solo ejecuta VBox cuando inicia sesión, no cuando la máquina está encendida. VBoxHeadless es el camino a seguir para ejecutarse como un servicio. Vea mi respuesta a continuación (que estoy a punto de mejorar según el comentario de Aaron Copley).
John Hart

La respuesta no tiene nada que ver con correr como un servicio. El inicio ocurre después del inicio de sesión de un usuario, completamente diferente al comportamiento de los servicios.
Felice Pollano

10

Tenga en cuenta que la respuesta actualmente aceptada (Molly7244) en realidad inicia la VM cuando inicia sesión, no cuando inicia la máquina. No es, en otras palabras, un servicio.

Para un servicio real que se ejecuta cuando la máquina arranca, utilizo dos scripts (originalmente de aquí ) junto con cygwin (cygrunsrv). Utiliza el modo VBoxHeadless como se menciona en otra parte de esta página.

El primer script ejecuta su VM a través de VBoxHeadless; obtiene el nombre de la VM correcta para ejecutar (y otra información, como el directorio de inicio de VBOX) de las variables de entorno. La segunda secuencia de comandos instala un servicio para una VM particular (mediante el uso de cygrunsrv para llamar a la primera secuencia de comandos con el conjunto de valores de entorno correcto). Finalmente hay un tercer archivo que contiene funciones comunes. Si reúne todo esto en un directorio, puede instalar una nueva máquina virtual de esta manera:

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

Y luego inicie el servicio con "net start vboxd-MyVMName" o "cygrunsrv -S vboxd-MyVMName".

Aquí está el script que ejecuta 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"

Y aquí está el script de instalación, "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"

Y, finalmente, aquí está el script ".libcommon" al que hacen referencia ambos:

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

Esta solución funciona muy bien para mí; ojalá tengas suerte similar.


44
+1 para "no es un servicio" ... -1 para vincular a la solución en lugar de incluirla en la respuesta. El voto es nulo. :) Considere la posibilidad de revisar para incluir la solución, ya que la rotura del enlace es perjudicial para la longevidad de esta respuesta.
Aaron Copley

8

Parece que la respuesta más simple en este momento es VBoxVMService . Todavía no lo he probado, intentaré recordar venir aquí y actualizar la respuesta si lo hago.


1
sin embargo, no funciona con 4.2.x
Archimedes Trajano

2
@ArchimedesTrajano He probado la versión actual (4.1) con VirtualBox 4.3.6 y funciona bien. La página del proyecto afirma que fue "reescrito casi desde cero" .
Melebius

1
¡Sí, lo probé anoche y funciona! Solo recuerda reiniciar.
Arquímedes Trajano

4

Acordado en VBoxVMService. Es realmente fácil de configurar y parece estar funcionando bien. Puede encontrar una manera de configurarlo aquí:

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

**** EDITAR **** Según la solicitud a continuación, un resumen del enlace. Aunque la solución funcionó para mí, el crédito es para Peter Upfold: http://peter.upfold.org.uk/

  • Instale Virtualbox y configure la VM para aceptar sesiones RDP.
  • Descargue e instale VBoxVmService en C: \ vms. Simplemente busque en Google VBoxVmService un enlace de descarga (lo siento, no hay suficiente representante para publicar más de 2 enlaces).
  • Edite el archivo ini de VBoxVmService en C: \ vms:

[Configuración]

ServiceName = VBoxVmService

VBOX_USER_HOME = C: \ Users \ Administrator.VirtualBox

RunAsUser =. \ Administrador

UserPassword = enteryourpasswordhere

RunWebService = no

PauseShutdown = 5000

[Vm0] VmName = nombre de la vm en VirtualBox

ShutdownMethod = savestate

Inicio automático = sí

  • Sustituya en VBOX_USER_HOME con la carpeta .VirtualBox en el directorio de inicio del usuario correcto, así como las directivas RunAsUser y UserPassword, y establezca el nombre de la máquina virtual de destino en la aplicación VirtualBox en VmName. También puede agregar secciones [Vmx] adicionales después de [Vm0] con otras máquinas virtuales para comenzar cuando la máquina se inicia.

  • Cuando esté satisfecho con su configuración, desde un símbolo del sistema habilitado por el administrador, ejecute el siguiente comando para instalar el servicio. Una vez que se instala el servicio, puede eliminar su contraseña de usuario del archivo INI, ya que se guarda en la configuración del Servicio:

C: \ vms \ VmServiceControl.exe -i

  • Ahora, debe reiniciar la computadora antes de intentar iniciar el servicio por primera vez, o no podrá ubicar las máquinas virtuales.

  • Al reiniciar, el servicio debería iniciarse (sujeto al retraso 'Automático (inicio retrasado)') y sus máquinas virtuales se iniciarán al iniciar.


1
¿Puede resumir el enlace dentro de su respuesta en caso de que falle?
jonsca

Publicación editada según lo solicitado.
RooiWillie

¿Funciona esto en la versión 4.2.x de VirtualBox?
Archimedes Trajano

Estas instrucciones probablemente se apliquen a alguna versión anterior, la versión actual de VBoxVmService (4.1) es más fácil de configurar y lo guiará a través del proceso.
Melebius

2

Simplemente ofreciendo esto como otra opción:

Use el comando incorporado de Windows 'sc' para crear un servicio. Combina esto con 'vboxheadless' te llevará a donde quieres estar.

No probé específicamente con vboxheadless, pero creé un servicio de prueba que ejecuta calc.exe. Deberías estar haciendo algo como esto:

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

Consulte la documentación de sc para obtener más información. Nota: Esos espacios después del signo igual son intencionales.


Esto iniciará el servicio correctamente, pero bloqueará la VM cuando el servicio se detenga: VBoxHeadless no puede interpretar correctamente el control de detención del servicio, por lo que Windows esperará hasta que se agote el tiempo de espera y luego forzará el proceso, lo que es menos que ideal. Vea otras respuestas para los scripts de envoltura para evitar que eso suceda.
Aaron Miller

Gracias por el comentario. Con suerte, esto se envía a los desarrolladores como una solicitud de corrección de errores / función.
Aaron Copley

1

Si las secuencias de comandos de vboxd le causan tantos problemas como a mí, puede intentar esto; Es una solución bastante simple, implementada en Perl, que proporciona la misma funcionalidad. Específicamente, la VM se inicia con el sistema (suponiendo que el servicio está configurado para iniciarse automáticamente, que es el predeterminado), y se desactiva limpiamente cuando se detiene el servicio.

Las principales diferencias con respecto a la solución vboxd, además de ser considerablemente más simple de tratar en mi experiencia, son que este script no pasa una configuración de puerto VRDE a VBoxHeadless, y que el apagado de VM se maneja a través de "acpipowerbutton" en lugar de "savestate" .

Si esto no se ajusta a sus propósitos, es bastante fácil cambiarlo; en el primer caso, agregue '-e "TCP / Ports = [, port ...]"' a la cadena de línea de comando VBoxHeadless ($ cmd), y en el segundo caso, simplemente cambie "acpipowerbutton" a "savestate" en el manejador SIGTERM.

Aquí está el script de 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";

Y aquí está la línea de comando cygrunsrv que utilicé para instalar el servicio de 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

A partir de ahí, solo debería ser cuestión de emitir 'sc start <service-name>', y debería ser bueno para ir; recuerde que, de forma predeterminada, los servicios de cygrunsrv inician sesión en / var / log / <service-name> .log, así que si algo se comporta mal, ese es el primer lugar para buscar una razón.

Una cosa a tener en cuenta es que, cuando ejecuta la VM de esta manera, se ejecutará bajo la cuenta del SISTEMA incorporado, en lugar de la suya. Siendo este el caso, no podrá administrar la VM a través de la consola VirtualBox mientras se ejecuta como un servicio; parecerá estar en el estado "Apagado" y no podrá acceder a su configuración. ( No se recomienda intentar encender la VM mientras se está ejecutando como servicio ; no sé qué sucederá, pero en el mejor de los casos será un no-op, y en el peor de los casos, controlará su VM). Si necesita cambiar la configuración de la VM o acceder a la consola, primero detenga el servicio (y espere a que salga VBoxHeadless.exe) y luego configúrelo / enciéndalo en la consola VirtualBox como lo haría normalmente.

Probablemente podría resolver este problema instalando un segundo servicio interactivo para ejecutar la consola VirtualBox; dado que eso también ejecutaría la consola con la cuenta SYSTEM, lo más probable es que pueda ver y administrar la VM en ejecución. No he tenido la necesidad de hacerlo yo mismo, así que no estoy seguro de que funcione, pero no veo una razón por la que no lo haría. (Si lo intentas, agradecería un comentario a esta respuesta, que me haga saber cómo te fue. ¡Gracias!)

¡Espero que esto ayude!


Su script es más simple, pero requiere Perl y codifica varias propiedades que el script vboxd acepta como parámetros. De acuerdo con virtualbox.org/manual/ch07.html , al no aceptar el puerto VRDE, VBoxHeadless no ejecutará la VM (solo se bloquea indefinidamente) si la VM está configurada para usar el puerto predeterminado que está utilizando otro servidor RDP. vboxd-installes útil porque oculta convenientemente los detalles del argumento de cygrunsrv. Estoy de acuerdo, sin embargo, que acpipowerbuttones una mejor opción de "parar" que savestate.
Derek Mahar

@DerekMahar Tómelo por lo que sea, supongo. Como no funciona en nada más nuevo que XP, dudo que sea mucho en cualquier caso. ¯ \ _ (ツ) _ / ¯ ¡Gracias por los comentarios!
Aaron Miller

Aaron Miller, ¿quieres decir que tu script o vboxd no funciona en Windows más nuevo que XP? Supongo que te refieres a tu script porque conseguí que vboxd funcionara en Windows 10 con VirtualBox 5.1.6.
Derek Mahar

@DerekMahar Me refiero a mi script, no a vboxd.
Aaron Miller
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.