Como iniciar e desligar automaticamente máquinas VirtualBox?

52

Eu preciso executar um sistema de software que se destina a ser instalado como um appliance em uma máquina dedicada. Para economizar energia, planejo executar o sistema em uma VM do VirtualBox.

O host é uma caixa Linux padrão com um sistema SysV-Init, o convidado é um Linux muito modificado e eu preferiria não ter que alterá-lo ainda mais. O VirtualBox é usado na versão OSE.

Eu já descobri como iniciar a VM quando o host é inicializado ( Edit: isso é feito, como Nikhil mencionou abaixo, através do comando VBoxManager startvm ), mas como posso me desligar graciosamente a VM? Qualquer script em execução no host precisaria esperar até que o convidado fosse desligado.

Alguém pode sugerir como, por exemplo, um arquivo de serviço faria isso?

    
por jstarek 08.01.2012 / 15:58

10 respostas

34

Já experimentou acpipowerbutton deste conjunto de comandos?

VBoxManage controlvm        <uuid>|<name>
                            pause|resume|reset|poweroff|savestate|
                            acpipowerbutton|acpisleepbutton|

Edite depois de ler os comentários:

Você pode usar acpid ou outros utilitários acpi para torná-lo agradável. Além disso, você pode fornecer mais informações sobre como desligar a máquina no momento?

A shutdown simples não esperaria por trabalhos inacabados, um atraso de tempo pode ser muito longo.

Suponho que você não esteja usando um gerenciador de janelas, então tente esta ferramenta .

Apenas vi este daemon . Você pode achar útil.

    
por 18.01.2012 / 20:07
16

Em vez de codificar isso, considere usar o Vagrant , criado para instanciar e controlar as instâncias do VirtualBox. A documentação é excelente e eu sugiro que você verifique isso em vez de tentar fazer o seu próprio.

O mais curto e mais rápido é que você cria um arquivo de controle simples e então executa vagrant up para iniciar quantas instâncias do VirtualBox você quiser. Você pode usar vagrant ssh para efetuar login nos hosts e vagrant halt para desligar o host (sem finalizar). vagrant destroy se livrará das instâncias.

Ele suporta provisionamento com fantoches, Ansible ou Chef e permite que você controle a maioria das configurações expostas do VBox.

    
por 09.01.2012 / 02:58
11

Eu tenho um aplicativo semelhante ao seu, com uma diferença: preciso reiniciar o sistema e recuperar do instantâneo.

O que lhe interessa é o modo sem cabeça .

Eu tenho alguns desses serviços, então eu uso o seguinte script:

VBox_StopRestoreStart.sh

#!/bin/bash
if [ -z "$1" ]; then
        echo "Usage: $0 VMNAME_or_UUID"
        exit 1
fi
set -x
VBoxManage controlvm  "$1" poweroff  #enforce turnoff
VBoxManage snapshot   "$1" restorecurrent   #retore state
VBoxManage showvminfo "$1" | grep State   #display state to ensure
VBoxHeadless -s       "$1"  #run in headless mode in background

how can I gracefully shut down the VM?

Se você deseja desativar a VM normalmente, você tem duas opções, dependendo do seu aplicativo:

  • Emule o "botão de desligamento" ou o "botão de suspensão" e prepare a VM para reagir (para fechar normalmente)
    • VBoxManage controlvm <uuid>|<VMname> acpipowerbutton
    • VBoxManage controlvm <uuid>|<VMname> acpisleepbutton
  • Salvar o estado da VM para restaurar depois
    • VBoxManage controlvm <uuid>|<VMname> savestate

DICAS: você pode achar útil:

  • VBoxManage list vms - lista de vms disponíveis
  • rdesktop IP-ADDR:3389 ou rdesktop-vrdp IP-ADDR:3389 - quando você deseja uma GUI (mesmo remotamente ) ao executar no modo sem cabeça: VBoxHeadless -s <uuid>|<VMname>
  • VBoxManage startvm - inicia com a GUI para depuração local

Capítulo do manual do VirtualBox relacionado: Capítulo 7. Máquinas virtuais remotas - Passo a passo: criando uma máquina virtual em um servidor sem cabeçalho

P.S. Se você estiver interessado em soluções já implementadas com recursos completos, o OpenStack parece uma opção interessante.

    
por 20.01.2012 / 22:29
10

Analisando a documentação de gerenciamento da VM do VirtualBox no link

Para listar as VMs, use o comando VBoxManage list vms

Para iniciar a VM, use o comando VBoxManage startvm

link

Para controlar a VM, use VBoxManage controlvm

O subcomando controlvm permite alterar o estado de uma máquina virtual em execução no momento. O seguinte pode ser especificado:

VBoxManage controlvm <vm> pause temporariamente coloca a máquina virtual em espera, sem alterar seu estado para sempre. A janela da VM será pintada em cinza para indicar que a VM está pausada no momento. (Isso é equivalente a selecionar o item "Pause" no menu "Machine" da GUI).

Use VBoxManage controlvm <vm> resume para desfazer um comando de pausa anterior. (Isso é equivalente a selecionar o item "Continuar" no menu "Máquina" da GUI).

VBoxManage controlvm <vm> reset tem o mesmo efeito em uma máquina virtual do que pressionar o botão "Redefinir" em um computador real: uma reinicialização a frio da máquina virtual, que será reiniciada e inicializará o sistema operacional convidado novamente imediatamente. O estado da VM não é salvo de antemão e os dados podem ser perdidos. (Isso é equivalente a selecionar o item "Reset" no menu "Machine" da GUI).

VBoxManage controlvm <vm> poweroff tem o mesmo efeito em uma máquina virtual do que puxar o cabo de alimentação em um computador real. Novamente, o estado da VM não é salvo de antemão e os dados podem ser perdidos. (Isso equivale a selecionar o item "Fechar" no menu "Máquina" da GUI ou pressionar o botão de fechamento da janela e selecionar "Desligar a máquina" na caixa de diálogo).

Depois disso, o estado da VM será "Desligado".

    
por 08.01.2012 / 16:18
5

Para um sistema baseado em systemd, você pode tentar isso.

Etapa 1: crie um arquivo de serviço

[Unit]
Description=VBox Virtual Machine %i Service
Requires=systemd-modules-load.service
After=systemd-modules-load.service

[Service]
User=user
Group=vboxusers
ExecStart=/usr/bin/VBoxHeadless -s %i
ExecStop=/usr/bin/VBoxManage controlvm %i savestate

[Install]
WantedBy=multi-user.target

Etapa 2: ativar o arquivo de serviço

$ sudo systemctl enable vboxvmservice@vm_name.service

Referências

por 03.06.2013 / 13:33
3

Que tal enviar o comando via ssh do host para o convidado?

Não tenho certeza se funciona e se você pode verificar o status da máquina posteriormente ou obter algo como um status de saída, mas ela deve estar limpa no mínimo.

    
por 08.01.2012 / 18:16
1

Minha solução: Neste shellscript, 'root' é o invocador e 'theuser' é o proprietário de 'thevm'

Eu sei que o vms terminou quando a saída do comando VBoxManage list runningvms retorna uma string vazia.

...
start(){
    su -c "VBoxHeadless --startvm thevm" -s /bin/bash theuser &
    # maybe another vbox command
}

stop(){
    su -c "VBoxManage controlvm thevm acpipowerbutton" -s /bin/bash theuser
    # maybe another vbox command
    while [ "'su -c 'VBoxManage list runningvms' -s /bin/bash theuser'" != "" ]
    do
        echo waiting for VMs to shutdown
        sleep 3
    done
}
...
    
por 15.11.2013 / 17:09
1

Para iniciar vm:

VBoxManage startvm VMNAME --type headless

Para parar vm:

VBoxManage controlvm VMNAME savestate

Listar todos os vms em execução:

VBoxManage list runningvms
    
por 25.03.2015 / 08:08
0

Talvez isso ajude como parte da solução.

VBoxManage list runningvms | tr -s '\" {' '%{' | cut -d '%' -f3  | while read uuid; do
   VBoxManage controlvm $uuid savestate; 
done
    
por 02.02.2014 / 05:38
0

Provavelmente uma pergunta estúpida, mas por que você não faz login no seu convidado e fecha a partir daí?

A menos que você tenha uma boa razão para não instalar o sshd e acessar a VM realmente através do VBox, eu usaria um script que apenas emite um ssh shutdown -h now . Para ser honesto, eu criaria um script para cada máquina que o desligasse corretamente e realizasse alguns exames enquanto estava nele.

Basta empacotar um script /etc/init.d/shutdown_vm que chama o outro do host, a chamada será bloqueada até que esteja pronta. Esse processo (como descrito) adiciona uma dependência do Linux no guest, mas remove a dependência do VBox no host.

Sem falar nada: você não precisa acessar o VBox para desligar uma máquina, se você tem algum meio de acessá-lo (ou seja, ssh), então o SO sempre terá alguns meios para isso (ligá-lo, é diferente claro)

    
por 03.03.2014 / 11:24