Como iniciar uma VM na inicialização e desligar na VM?

4

Longa história curta ...

Eu tive que instalar um pequeno aplicativo de servidor em execução em uma VM em um dos PCs dessa empresa. Ambos os computadores estão executando o Windows XP (com softwares legados, portanto a atualização não é possível), e comprar um PC extra é limitado no momento. Então, eu converti o Windows do host em um deles em uma VM e instalei o Lubuntu. Em seguida, importou o aplicativo do servidor e tudo funciona bem; tudo é quase transparente para o usuário, exceto para os processos de inicialização e cancelamento.

O problema

Eu queria saber como eu poderia iniciar as duas VMs na inicialização do host e, em seguida, desligar o computador quando a VM do Windows XP estiver inativa? No momento, os funcionários estão fazendo isso manualmente, mas eu gostaria de automatizar esse processo.

Requisitos

  1. Lubuntu deve ter um usuário configurado para efetuar login no início - > feito!
  2. A VM do aplicativo do servidor deve iniciar no logon - > inseguro
  3. A VM do Windows XP deve iniciar no logon - > inseguro
  4. A VM do aplicativo do servidor deve salvar o estado e ser fechada automaticamente quando a máquina com Windows XP for encerrada - > não sei
  5. O Lubuntu deve ser encerrado quando todas as VMs estiverem pausadas / fechadas. - > não sei

O sistema está sendo executado no Lubuntu 14.04 com o VirtualBox 4.3.x.

    
por Yanick Rochon 10.11.2014 / 16:27

3 respostas

3

Você pode configurar um script Init.d / Systemd como este:

#! /bin/sh
# /etc/init.d/vbox

#Edit these variables! VMUSER=VMAdmin VMNAME="cdb62186-7c30-4c25-a0b0-e4a32cfb0504" BASEFOLDER=/home/VMAdmin/path/to/backups/

case "$1" in
    start)
        echo "Starting VirtualBox VM..."
        sudo -H -u $VMUSER VBoxManage startvm "$VMNAME" --type headless
        ;;
    reset)
        echo "Resetting VirtualBox VM..."
        sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" reset
        ;;
    stop)
        echo "Saving state of Virtualbox VM..."
        sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" savestate
        ;;
    shutdown)
        echo "Shutting down Virtualbox VM..."
        sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" acpipowerbutton
        ;;
    status)
        sudo -H -u $VMUSER VBoxManage list vms -l | grep -e ^"$VMNAME": -e ^State | sed s/\ \ //g | cut -d: -f2-
        ;;
    backup)
        echo ""
        sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" acpipowerbutton

        echo "Waiting for VM "$VMNAME" to poweroff..."
        until $(sudo -H -u $VMUSER VBoxManage showvminfo --machinereadable "$VMNAME" | grep -q ^VMState=.poweroff.)
        do
          sleep 1
        done

        FILENAME=$(date +"%Y_%m_%d-%T")
        echo "Backing up Virtualbox VM to '$BASEFOLDER$FILENAME'..."
        sudo -H -u $VMUSER VBoxManage clonevm "$VMNAME" --options keepallmacs --name $FILENAME --basefolder $BASEFOLDER

        echo "Restarting VirtualBox VM..."
        sudo -H -u $VMUSER VBoxManage startvm "$VMNAME" --type headless
        echo ""
        ;;
    *)
        echo "Usage: sudo service vbox {start|stop|status|shutdown|reset|backup}"
        exit 1
        ;; esac

exit 0

Por favor, note que eu tenho o script a partir daqui: link

Verifique os comandos antes de instalar o script e teste cada funcionalidade. Você precisará colocá-lo no diretório /etc/init.d e executar chmod +x para executá-lo. Em seguida, passe e teste a funcionalidade dele. Uma vez satisfeito, execute:

sudo update-rc.d vbox defaults 99 01

Isto irá configurá-lo para começar com o sistema. A postagem original tem algumas etapas para tarefas agendadas, como um FYI. Se alguém souber de um método mais atualizado de fazer isso, sinta-se à vontade para editar este post ou postar outra resposta.

    
por Geary Shull 11.11.2014 / 21:36
3

Eu iria com uma combinação de trabalho cron e uso do vboxmanage via scripts bash.

Eu teria um script bash que inicializaria as máquinas virtuais e acionaria um cron job para verificar o status das máquinas.

O script deve ser parecido com:

#!/bin/bash

vboxmanage startvm "Server App VM name"
vboxmanage startvm "Windows XP VM name"
crontab ~/check_vms_and_shutdown_job.txt

Digamos que salvamos como start_vms_and_cronjob.sh . Lembre-se de chmod +x , então pode ser realmente executado.

Você pode se perguntar sobre o arquivo check_vms_and_shutdown_job.txt . É um arquivo de texto contendo informações sobre um trabalho que deve ser executado em determinados intervalos. Neste exemplo, colocamos na pasta inicial do usuário e ele deve ler:

*/5 * * * * ~/check_vms_and_shutdown.sh

Este arquivo deve ter uma nova linha no final da linha (pressione enter antes de salvar;)) O que este arquivo faz é que ele descreve um cron job que é executado a cada 5 minutos e executa um script bash. p>

Agora, o que é esse script check_vms_and_shutdown.sh que você pode perguntar? Bem, aqui está o ponto todo. Deveria dizer:

#!/bin/bash

if vboxmanage list runningvms | grep "Windows XP VM name"
then
    echo "Windows XP still running."
else
    echo "Windows XP shut down. Shutting down the rest."
    vboxmanage controlvm "Server App VM name" savestate
    crontab -r 
    shutdown -h now
fi

Agora, o que acontece, ele verificará se há a máquina virtual XP em execução. Se não estiver, ele ordenará que a máquina virtual do aplicativo do servidor salve seu estado. Depois disso, o cronjob será removido e o sistema encerrado. Lembre-se de chmod +x e aqui também colocamos o arquivo na pasta pessoal do usuário.

Para conveniência e melhor uso, você também pode querer rodar os headless e ter seu uso ser feito através de exibição remota.

Agora adicione o start_vms_and_cronjob.sh em seus aplicativos de inicialização e você deve estar definido.

Então o que temos aqui é:

  • Quando o sistema é iniciado, as máquinas virtuais são iniciadas por um script de shell e uma nova tarefa cron (executando um script de shell) é criada a partir de um arquivo txt de regra de tarefa cron.
  • A cada 5 minutos, a tarefa cron executa o script que verifica se a máquina virtual XP ainda está em execução e, caso contrário, salvará a outra máquina virtual, removerá a tarefa cron e encerrará o sistema.

Espero que isso ajude você a configurar exatamente o que você precisa.

    
por Ahti Komu 11.11.2014 / 04:28
3

Estas são as etapas para realizar as tarefas descritas. O convidado da VM com o aplicativo do servidor será chamado de "ServerApp", a máquina Windows "WindowsXP" abaixo. Substitua-os por seus nomes reais.

O método abaixo envolve a criação de um Xsession personalizado na máquina host. Isso tem a vantagem de podermos desmontar esta sessão para carregar apenas os aplicativos necessários para executar nossas máquinas virtuais (provavelmente não precisaremos de uma área de trabalho completa para isso). Além disso, usar os métodos de espera embutidos no VirtualBox não exigirá mais loops adicionais para monitorar os estados da VM.

  1. Crie um usuário para executar a máquina virtual.
  2. Instale as adições de convidados ao convidado
  3. Mude para tela cheia com Host + F ao executar a VM.
  4. Defina uma sessão personalizada do Lubuntu no host:

    • Crie um arquivo em /usr/share/xsessions e nomeie-o, por exemplo WindowsVM.desktop com o seguinte conteúdo:

      [Desktop Entry]
      Name=WindowsXP # or any other sensible name
      Comment=Custom Xsession running a VM 
      Exec=/etc/X11/Xsession
      
    • Torne este arquivo executável. Esta sessão irá chamar ~/.xsession no login.

  5. Crie o script de inicialização de sessão executável chamado ~/.xsession na HOME do usuário acima:

    #! /bin/bash
    
    /usr/bin/lxsession -s Lubuntu LXDE &
    VBoxManage startvm "ServerApp" --type headless
    VBoxManage startvm "WindowsXP"
    VBoxManage guestproperty set RUNNING 1 --flags TRANSIENT
    VBoxManage guestproperty wait "WindowsXP" RUNNING
    VBoxManage controlvm "SeverApp" savestate
    dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
    
  6. Escolha a sessão personalizada em 4. no login.

O problema é obter a propriedade guest RUNNING (ou qualquer outro nome que escolhermos) excluída da máquina virtual, pois ela não é tão transitória quanto as especificações sugerem. Infelizmente, ele sobreviverá a um desligamento / desligamento da máquina virtual.

Portanto, temos que adicionar o seguinte comando usando VBoxcontrol.exe (instalado com as adições de convidado) ao Windows convidado no final de sua rotina de desligamento (ou de um script de desligamento que colocamos lá):

VBoxControl.exe guestproperty set RUNNING

Isso terminará o estado wait para continuar salvando o "ServerAPP" e, em seguida, desligando o host.

Uma alternativa para isso é iniciando um aplicativo do Windows no convidado para aguardar o término do aplicativo antes de desligarmos as máquinas e desligarmos o host. Em seguida, substituiríamos os dois comandos set guestproperty no script por uma linha semelhante a esta:

VBoxManage --nologo guestcontrol "WindowsXP" execute --image "C:\full\path\to\program.exe" --username <windowsuser> --password <password> --wait-exit --wait-stdout

Consulte o Manual do VirtualBox para ver as limitações e mais detalhes sobre como configurar isso em uma conta sem senha Windows.

Comandos do script na etapa 5. explicado:

  • /usr/bin/lxsession -s Lubuntu LXDE
    inicia uma sessão do Lubuntu (substitua por qualquer outro Xsession personalizado, se aplicável)

  • VBoxManage startvm "ServerApp --type headless"
    inicia a máquina virtual executando o aplicativo do servidor no modo sem cabeça (ou seja, sem exibição)

  • VBoxManage startvm "WindowsXP"
    inicia a máquina virtual executando o Windows (tela inteira ou qualquer outra resolução definida na última execução)

  • VBoxManage guestproperty set "WindowsXP" RUNNING 1 --flags TRANSIENT
    define uma propriedade RUNNING para a máquina Windows que pode ser controlada a partir do sistema operacional convidado

  • VBoxManage guestproperty wait "WindowsXP" RUNNING
    aguarda a remoção da propriedade RUNNING do Windows convidado

  • VBoxManage controlvm "SeverApp" savestate
    encerra a VM do aplicativo do servidor no savestate

  • dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" \ a /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
    termina o host Lubuntu (estado de desligamento) sem interação do usuário.

por Takkat 11.11.2014 / 21:20