Preciso executar um sistema de software destinado a ser instalado como um dispositivo em uma máquina dedicada. Para economizar energia, planejo executar o sistema em uma VM do VirtualBox.
O host é uma caixa padrão do Linux com um sistema SysV-Init, o convidado é um Linux fortemente modificado e eu preferiria não precisar alterá-lo ainda mais. O VirtualBox é usado na versão OSE.
Eu já descobri como iniciar a VM quando o host é inicializado ( Editar: isso é feito, como Nikhil mencionou abaixo, por meio do comando VBoxManager startvm
), mas como posso desligar a VM normalmente? Qualquer script em execução no host precisaria aguardar até que o hóspede seja totalmente desligado.
Alguém pode sugerir como, por exemplo, um arquivo de serviço fazendo isso teria que procurar?
fonte
Respostas:
Você já tentou
acpipowerbutton
deste conjunto de comandos?Edite depois de ler os comentários:
Você pode usar
acpid
ou outros utilitários da acpi para torná-lo elegante. Além disso, você pode fornecer mais informações sobre como desligar a máquina no momento?A Plain
shutdown
não esperaria por trabalhos inacabados; um atraso de tempo pode ser muito longo.Eu suponho que você não está usando um gerenciador de janelas, então tente esta ferramenta.
Acabei de ver este daemon . Você pode achar util.
fonte
vboxmanage list runningvms
até a sua VM acabar.Em vez de codificar isso você mesmo, considere usar o Vagrant , criado para instanciar e controlar instâncias de caixas virtuais. A documentação é excelente e sugiro que você a verifique em vez de tentar criar sua própria.
O longo e curto disso é que você cria um arquivo de controle simples e executa
vagrant up
para iniciar quantas instâncias do VirtualBox desejar. Você pode usarvagrant ssh
para fazer login nos hosts evagrant halt
desligar o host (sem terminar).vagrant destroy
vai se livrar das instâncias.Ele suporta provisionamento com fantoche, Ansible ou Chef e permite controlar a maioria das definições de configuração expostas do VBox.
fonte
Tenho aplicativo semelhante ao seu, com uma diferença: preciso reiniciar o sistema e me recuperar do instantâneo.
O que você está interessado é o modo sem cabeça .
Eu tenho alguns desses serviços, então eu uso o seguinte script:
VBox_StopRestoreStart.sh
Se você deseja desativar a VM normalmente, você tem duas opções, dependendo do seu aplicativo:
VBoxManage controlvm <uuid>|<VMname> acpipowerbutton
VBoxManage controlvm <uuid>|<VMname> acpisleepbutton
VBoxManage controlvm <uuid>|<VMname> savestate
Dicas: Você pode achar útil:
VBoxManage list vms
- lista de vms disponíveisrdesktop IP-ADDR:3389
ourdesktop-vrdp IP-ADDR:3389
- quando você deseja uma GUI (mesmo remotamente ) quando executa no modo sem cabeça:VBoxHeadless -s <uuid>|<VMname>
VBoxManage startvm
- comece com GUI para depuração localCapítulo do manual relacionado ao VirtualBox: Capítulo 7. Máquinas virtuais remotas - Passo a passo: criando uma máquina virtual em um servidor sem cabeça
PS Se você estiver interessado em soluções já implementadas com todos os recursos, o OpenStack parece uma opção interessante.
fonte
Consultando a documentação de gerenciamento da VM do VirtualBox em http://www.virtualbox.org/manual/ch08.html
Para listar as VMs, use o comando
VBoxManage list vms
Para iniciar a VM, use o comando
VBoxManage startvm
http://www.virtualbox.org/manual/ch08.html#vboxmanage-controlvm
Para controlar a VM, use
VBoxManage controlvm
O
controlvm
subcomando 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 uma 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á em pausa no momento. (Isso é equivalente a selecionar o item "Pausar" no menu "Máquina" 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 reiniciará e inicializará o sistema operacional convidado imediatamente imediatamente. O estado da VM não é salvo anteriormente e os dados podem ser perdidos. (Isso é equivalente a selecionar o item "Redefinir" no menu "Máquina" da GUI.)VBoxManage controlvm <vm> poweroff
tem o mesmo efeito em uma máquina virtual que puxar o cabo de alimentação em um computador real. Novamente, o estado da VM não é salvo anteriormente e os dados podem ser perdidos. (Isso é equivalente a selecionar o item "Fechar" no menu "Máquina" da GUI ou pressionar o botão Fechar da janela e selecionar "Desligar a máquina" na caixa de diálogo.)Depois disso, o estado da VM será "Desligado".
fonte
vboxmanage
(tudo em minúsculas).VBoxManage controlvm
subcomandos faz isso./etc/init.d/vboxvms-service
script no sistema host, que, ao iniciar, fará com que todos os vms sejam ativados e interrompidos, fará com que todos os vms sejam desativados.VBoxManage controlvm savestate
é outra possibilidade (pelo menos o google me diz), ele salva o status das máquinas e o desliga de maneira limpa, mas ainda não há como forçar o host a esperar.Para um sistema baseado em systemd, você pode tentar isso.
Etapa 1: criar um arquivo de serviço
Etapa 2: ativar o arquivo de serviço
Referências
fonte
VBoxHeadless -s %i
para iniciar eVBoxManage controlvm %i savestate
parar a VM.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 deve estar limpo pelo menos.
fonte
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.fonte
Para iniciar o vm:
Para parar o vm:
Listar todos os vm em execução:
fonte
Talvez isso ajude como parte da solução.
fonte
Por que você não entra no seu convidado e encerra a partir daí?
A menos que você tenha um bom motivo para não instalar o sshd e acessar a VM realmente por meio do VBox, eu optaria por um script que apenas emita um
ssh shutdown -h now
. Para ser sincero, eu criaria um script para cada máquina que a desligasse corretamente e realizaria algumas verificações enquanto estava nela.Apenas compacte um script /etc/init.d/shutdown_vm que chame o outro do host, a chamada será bloqueada até que esteja pronto. Esse processo (conforme descrito) adiciona uma dependência do Linux no convidado, mas remove a dependência do VBox no host.
Direto ao assunto: você não precisa acessar o VBox para desligar uma máquina, se você tiver algum meio de acessá-lo (por exemplo, ssh), o sistema operacional sempre terá alguns meios para isso (ativá-lo, é diferente, é claro)
fonte