Como posso executar uma máquina VirtualBox como um serviço no Windows XP?

12

Eu tenho uma máquina VirtualBox com o Windows XP em um host Windows XP.

Como eu posso iniciar o VirtualBox como um serviço, para que eu possa ter uma máquina virtual sob o capô, e eu não tenho que iniciar o VirtualBox para acessar minha máquina virtual (via VNC da rede)?

Descobri que o VirtualBox Manage pode ser o caminho a percorrer, mas como sou iniciante com isso, não sei por onde começar.

Alguma idéia?

    
por Jhonny D. Cano -Leftware- 05.01.2010 / 20:08

6 respostas

0

Crie um atalho para C:\Program Files\innotek VirtualBox\VBoxManage.exe

Após as aspas, insira: startvm <your virtual machine name>

Exemplo:

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

Copiar / Mover o atalho para sua pasta de inicialização.

ps: se você quiser atrasar a máquina virtual até que seu sistema esteja totalmente inicializado, você pode fazer isso no XP através de inicialização Atraso .

    
por 05.01.2010 / 20:29
9

Observe que a resposta aceita atualmente (Molly7244) na verdade inicia a VM quando você faz login - não quando você inicializa a máquina. Não é, em outras palavras, um serviço.

Para um serviço real que é executado quando a máquina inicializa, eu uso dois scripts (originalmente de aqui ) em conjunto com o cygwin (cygrunsrv). Faz uso do modo VBoxHeadless como mencionado em outra parte desta página.

O primeiro script executa sua VM via VBoxHeadless; ele obtém o nome da VM correta a ser executada (e outras informações, como o diretório inicial do VBOX) das variáveis de ambiente. O segundo script instala um serviço para uma determinada VM (usando o cygrunsrv para chamar o primeiro script com o env. Envs correto). Finalmente, há um terceiro arquivo que contém funções comuns. Se você colocar todos eles em um diretório juntos, você pode instalar uma nova vm assim:

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

Em seguida, inicie o serviço com "net start vboxd-MyVMName" ou "cygrunsrv -S vboxd-MyVMName".

Aqui está o script de execução da 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"

E aqui está o script do instalador, "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"

E, finalmente, aqui está o script ".libcommon" referenciado por 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 solução funciona muito bem para mim; espero que você tenha sorte semelhante.

    
por 03.01.2012 / 23:04
8

Parece que a resposta mais simples neste momento é VBoxVMService . Eu não tentei ainda, vou tentar me lembrar de vir aqui e atualizar a resposta se / quando eu fizer.

    
por 26.10.2011 / 21:30
4

Concordado com o VBoxVMService. É realmente fácil de configurar e parece estar funcionando bem. Você pode encontrar uma maneira de configurá-lo aqui:

link

**** EDIT **** De acordo com a solicitação abaixo, um resumo do link. Embora a solução tenha funcionado para mim, o crédito vai para Peter Upfold - link

  • Instale o Virtualbox e configure a VM para aceitar sessões RDP.
  • Faça o download e instale o VBoxVmService em C: \ vms. Apenas o Google VBoxVmService para um link de download (desculpe, não há representante suficiente para postar mais de dois links).
  • Edite o arquivo ini do VBoxVmService em C: \ vms:

[Settings]

ServiceName=VBoxVmService

VBOX_USER_HOME=C:\Users\Administrator.VirtualBox

RunAsUser=.\Administrator

UserPassword=enteryourpasswordhere

RunWebService=no

PauseShutdown=5000

[Vm0] VmName=name of the vm in VirtualBox

ShutdownMethod=savestate

AutoStart=yes

  • Substitua VBOX_USER_HOME pela pasta .VirtualBox no diretório pessoal do usuário correto, bem como pelas diretivas RunAsUser e UserPassword e defina o nome da máquina virtual de destino no aplicativo VirtualBox em VmName. Você também pode adicionar seções [Vmx] adicionais após [Vm0] com outras máquinas virtuais para iniciar quando a máquina for inicializada.

  • Quando estiver satisfeito com sua configuração, em um prompt de comando habilitado pelo administrador, execute o seguinte comando para instalar o serviço. Depois que o serviço é instalado, você pode remover a senha do usuário do arquivo INI, pois ele é salvo na configuração do Serviço:

C:\vms\VmServiceControl.exe -i

  • Agora, você deve reinicializar o computador antes de tentar iniciar o serviço pela primeira vez ou não conseguirá localizar as VMs.

  • Após a reinicialização, o serviço deve iniciar (sujeito ao atraso 'Automatic (Delayed Start)') e suas VMs serão iniciadas na inicialização.

por 13.08.2013 / 12:21
2

Apenas oferecendo isso como outra opção:

Use o comando interno do Windows 'sc' para criar um serviço. Combine isso com 'vboxheadless' para chegar onde você quer estar.

Não testado com o vboxheadless especificamente, mas criei um serviço de teste que executa o calc.exe. Você deveria estar fazendo algo assim:

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

Consulte a documentação para sc para mais informações. Nota: Esses espaços após o sinal de igual são intencionais.

    
por 03.01.2012 / 23:17
1

Se os scripts do vboxd estiverem causando tanto problema quanto eles, talvez você queira tentar isso; É uma solução bastante simples, implementada em Perl, que fornece a mesma funcionalidade. Especificamente, a VM inicializa com o sistema (supondo que o serviço esteja configurado para iniciar automaticamente, que é o padrão) e desce quando o serviço é interrompido.

As principais diferenças da solução vboxd, além de serem consideravelmente mais simples de lidar com a minha experiência, são que esse script não passa uma configuração de porta VRDE para VBoxHeadless e que o desligamento da VM é tratado por meio de "acpipowerbutton" "savestate".

Se isso não atender aos seus propósitos, é fácil mudar; no primeiro caso, adicione '-e' TCP / Ports = [ port ...] "'à string de linha de comando do VBoxHeadless ($ cmd), e no segundo caso, apenas altere" acpipowerbutton "para" savestate "em o manipulador SIGTERM.

Aqui está o 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";

E aqui está a linha de comando do cygrunsrv que eu usei para instalar o serviço do 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

De lá, deve ser apenas uma questão de emitir "sc start < service-name >", e você deve estar pronto - lembre-se de que, por padrão, os serviços do cygrunsrv registram / var / log / & lt nome-do-serviço > .log, por isso, se alguma coisa se comportar mal, este é o primeiro local a procurar uma razão pela qual.

Uma coisa a ter em mente é que, quando você executar a VM dessa maneira, ela será executada na conta SYSTEM incorporada, e não na sua própria. Sendo este o caso, você não poderá administrar a VM através do console do VirtualBox enquanto estiver sendo executado como um serviço; Ele parecerá estar no estado "Desligado" e você não poderá acessar suas configurações. (Tentando ligar a VM enquanto está sendo executado como um serviço não é recomendado) Eu não sei o que vai acontecer, mas na melhor das hipóteses, será um no-op, e na pior das hipóteses Se precisar alterar as configurações da VM ou acessar o console, interrompa o serviço primeiro (e aguarde a saída do VBoxHeadless.exe) e, em seguida, configure-o / ligue-o no console do VirtualBox como faria normalmente faria.

Você provavelmente poderia resolver esse problema instalando um segundo serviço interativo para executar o console do VirtualBox; já que isso executaria o console na conta SYSTEM, provavelmente seria capaz de ver e gerenciar a VM em execução. Eu não tive a necessidade de fazer isso sozinho, então não tenho certeza se daria certo, mas não vejo uma razão para isso não funcionar. (Se você tentar, eu apreciaria um comentário para esta resposta, deixando-me saber como isso funcionou para você. Obrigado!)

Espero que isso ajude!

    
por 01.10.2012 / 17:29