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


13

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

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

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

Alguma ideia?

Respostas:


0

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

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

Exemplo:

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

Copie / mova o atalho para sua pasta de inicialização.

ps: se você quiser atrasar a máquina virtual até que seu sistema seja totalmente inicializado, você pode fazer isso no XP via Startup Delayer .


Parece que funciona bem. Existe alguma maneira de "ocultar" a janela da máquina virtual também, para que ela esteja funcionando mais como um serviço do Windows?
precisa saber é o seguinte

executar o VBox como um serviço não ocultará a janela. você pode minimizá-lo automaticamente para a bandeja do sistema com AWM porém: eusing.com/WindowManager/WindowManager.htm

15
checkout "VBoxHeadless" para iniciar VMs sem interface do usuário. Você precisará usar o RDP se quiser ver a tela da VM.
Mark Porter

13
Este não é um serviço. Isso só executa o VBox quando você faz login - não quando a máquina está ligada. VBoxHeadless é o caminho a percorrer para executar como um serviço. Veja minha resposta abaixo (que estou prestes a melhorar de acordo com o comentário de Aaron Copley).
John Hart

A resposta não tem nada a ver com a execução como serviço. A inicialização ocorre após o logon do usuário, completamente diferente do comportamento dos serviços.
Felice Pollano

10

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

Para um serviço real que é executado quando a máquina é inicializada, eu uso dois scripts (originalmente daqui ) em conjunto com o cygwin (cygrunsrv). Utiliza o modo VBoxHeadless, conforme mencionado em outras partes desta página.

O primeiro script executa sua VM via VBoxHeadless; obtém o nome da VM correta para executar (e outras informações, como o diretório inicial do VBOX) a partir de variáveis ​​de ambiente. O segundo script instala um serviço para uma VM específica (usando cygrunsrv para chamar o primeiro script com o ambiente correto definido). Finalmente, há um terceiro arquivo que contém funções comuns. Se você juntar tudo isso em um diretório, poderá instalar uma nova vm assim:

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

E, 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.


4
+1 para "não é um serviço" ... -1 para vincular à solução em vez de incluí-la na resposta. O voto é nulo. :) Considere a possibilidade de revisar para incluir a solução, pois a podridão do link prejudica a longevidade desta resposta.
Aaron Copley

8

Parece que a resposta mais simples neste momento é VBoxVMService . Ainda não tentei, tentarei lembrar de vir aqui e atualizar a resposta se / quando o fizer.


1
ele não funciona com 4.2.x embora
Archimedes Trajano

2
@ArchimedesTrajano Tentei a versão atual (4.1) com o VirtualBox 4.3.6 e funciona bem. A página do projeto afirma que foi "reescrita quase do zero" .
Melebius

1
Sim, eu apenas testei ontem à noite e funciona! Lembre-se de reiniciar.
Archimedes Trajano

4

Concordou em VBoxVMService. É realmente fácil de configurar e parece estar funcionando bem. Você pode encontrar um guia sobre como configurá-lo aqui:

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

**** EDIT **** Conforme a solicitação abaixo, um resumo do link. Embora a solução tenha funcionado para mim, o crédito é para Peter Upfold - http://peter.upfold.org.uk/

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

[Configurações]

ServiceName = VBoxVmService

VBOX_USER_HOME = C: \ Usuários \ Administrador.VirtualBox

RunAsUser =. \ Administrador

UserPassword = enteryourpasswordhere

RunWebService = no

PauseShutdown = 5000

[Vm0] VmName = nome da vm no VirtualBox

ShutdownMethod = savestate

AutoStart = yes

  • Substitua na VBOX_USER_HOME pela pasta .VirtualBox no diretório inicial do usuário correto, além das 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 inicializar.

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

C: \ vms \ VmServiceControl.exe -i

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

  • Na reinicialização, o serviço deve iniciar (sujeito ao atraso 'Automático (início atrasado)') e suas VMs serão iniciadas na inicialização.


1
Você pode resumir o link na sua resposta, caso ele fique morto?
jonsca

Postagem editada conforme solicitado.
precisa saber é o seguinte

isso funciona na versão 4.2.x do VirtualBox?
Archimedes Trajano

Essas instruções provavelmente se aplicam a algumas versões mais antigas, a versão atual do VBoxVmService (4.1) é mais fácil de configurar e o guiará pelo processo.
Melebius

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 especificamente com vboxheadless, 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 obter mais informações. Nota: Esses espaços após o sinal de igual são intencionais.


Isso iniciará o serviço corretamente, mas travará a VM quando o serviço for parado - o VBoxHeadless não pode interpretar corretamente o controle de parada do serviço; portanto, o Windows aguardará até o tempo limite e matará o processo à força, o que é menos que o ideal. Veja outras respostas para scripts de wrapper para impedir que isso aconteça.
Aaron Miller

Obrigado pelo comentário. Felizmente, isso é enviado aos desenvolvedores como uma solicitação de correção / recurso de bug.
Aaron Copley

1

Se os scripts do vboxd estiverem lhe causando tantos problemas quanto eles, talvez você queira tentar isso; é uma solução bastante mais simples, implementada no Perl, que fornece a mesma funcionalidade. Especificamente, a VM inicia com o sistema (supondo que o serviço esteja configurado para iniciar automaticamente, que é o padrão) e fica inoperante quando o serviço é parado.

As principais diferenças em relação à solução vboxd, além de serem consideravelmente mais simples de lidar na minha experiência, são que esse script não passa uma configuração de porta VRDE para o VBoxHeadless e que o desligamento da VM é tratado pelo "botão acpipower" em vez de "savestate" .

Se isso não se adequar aos seus objetivos, é fácil mudar; no primeiro caso, adicione '-e "TCP / Ports = [, port ...]"' à string de linha de comando VBoxHeadless ($ cmd) e, no segundo caso, basta alterar "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 cygrunsrv que usei para instalar o serviço 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 daí, deve ser apenas uma questão de emitir 'sc start <nome do serviço>' e você deve estar pronto - lembre-se de que, por padrão, os serviços cygrunsrv registram-se em / var / log / <nome do serviço> .log, se algo se comportar mal, esse é o primeiro lugar para procurar um motivo.

Um aspecto a ter em mente é que, quando você executa a VM dessa maneira, ela será executada na conta SYSTEM interna, e não na sua. Sendo esse o caso, você não poderá administrar a VM pelo console do VirtualBox enquanto estiver sendo executado como um serviço; ele parecerá estar no estado "Desligado" e você não poderá acessar as configurações. ( Não é recomendável tentar ligar a VM enquanto ela estiver sendo executada como um serviço - não sei o que acontecerá, mas, na melhor das hipóteses, não será uma operação e, na pior das hipóteses, mangará sua VM.) Se você precisar alterar as configurações da VM ou acessar o console, pare 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.

Você provavelmente poderia resolver esse problema instalando um segundo serviço interativo para executar o console do VirtualBox; uma vez que iria executar o console sob a conta SYSTEM assim, seria mais provável ser capaz de ver e gerenciar a máquina virtual em execução. Eu não precisei fazer isso sozinho, por isso não tenho certeza de que funcionaria, mas não vejo uma razão para isso não acontecer. (Se você tentar, agradeceria um comentário a esta resposta, informando como funcionou para você. Obrigado!)

Espero que isto ajude!


Seu script é mais simples, mas requer Perl e codifica várias propriedades que o script vboxd aceita como parâmetros. De acordo com virtualbox.org/manual/ch07.html , ao não aceitar a porta VRDE, o VBoxHeadless não executará a VM (apenas bloqueia indefinidamente) se a VM estiver configurada para usar a porta padrão usada por outro servidor RDP. vboxd-installé útil porque oculta convenientemente os detalhes do argumento de cygrunsrv. Concordo, porém, que acpipowerbuttoné uma opção melhor "parar" do que savestate.
Derek Mahar

@DerekMahar Suponha que valha a pena, suponho. Como não funciona em nada mais novo que o XP, duvido que seja muito, de qualquer forma. ¯ \ _ (ツ) _ / ¯ Obrigado pelo feedback!
Aaron Miller

Aaron Miller, você quer dizer que seu script ou vboxd não funciona em nenhum Windows mais recente que o XP? Eu presumo que você quis dizer seu script porque eu fiz o vboxd funcionar no Windows 10 com o VirtualBox 5.1.6.
Derek Mahar

@DerekMahar Quero dizer meu script, não vboxd.
Aaron Miller
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.