Estou executando o Windows 7 dentro do Virtualbox no Ubuntu 11.10. Tudo funciona bem. Estou executando-o na inicialização, mas tenho um problema com a reinicialização.
Quando digito, sudo reboot now
o estado do Windows 7 virtual não é salvo. Após a reinicialização, o virtualbox é iniciado, mas em vez do Windows em execução, recebo o menu de inicialização travada do Windows 7 e o Windows é inicializado novamente.
Existe uma opção que o Ubuntu possa enviar algum sinal para a caixa virtual para fechar com segurança a instância antes da reinicialização do host?
fonte
reboot
12.10 diz "Quando chamada com --force ou quando no nível de execução 0 ou 6, esta ferramenta chama a própria chamada de sistema reboot (2) e reinicia diretamente o sistema. Caso contrário, isso simplesmente chama a ferramenta shutdown (8) com os argumentos apropriados. "; e a página do manualshutdown
diz "Depois que o TIME terminar, o shutdown envia uma solicitação ao daemon init (8) para trazer o sistema para o nível de execução apropriado".Eu recomendaria uma abordagem mais sofisticada, incluindo um trabalho inicial, um script de início e parada. Como exemplo, estou usando o Windows XP, pois meu diretório pessoal permite usar tombert ..., que você deve alterar de acordo. Ele tem a vantagem de tudo o que você faz (reinicialização, desligamento, pressionamento do botão liga / desliga) e lida com sua máquina virtual .
Primeiro, o trabalho inicial, coloque em /etc/init/winxpvm.conf:
O trabalho inicial inicia a máquina virtual no nível de execução 2 (que está no modo gráfico) e, no meu caso, aumenta a prioridade com
nice
. Para desligar bem a máquina virtual, preciso "desativar" a terminação inicial usando akill signal SIGCONT
instrução Isso deixa a máquina virtual em execução no início (evitando o padrãoSIGTERM
). Após 120 segundos, oSIGKILL
envio é assim mesmo. Em vez disso, estou executando owinxpvm-stop.sh
script.Nota lateral 1: As estrofes
start on started runlevel [2]
estop on starting runlevel [!2]
não funcionam. É preciso mencionar especificamente o trabalhorc
.Nota lateral 2: O que é confuso também no manual inicial: A
kill signal
estrofe especifica o sinal enviado após 5 segundos. Neste exemplo, defini-o deSIGTERM
(padrão) para SIGCONT - mas o tempo limite de 5 segundos não foi possível alterar. Akill timeout
estrofe especifica o tempo limite após o qual oSIGKILL
envio é enviado - qual sinal não pode ser alterado. Uma melhoria, portanto, seria definir novas estrofesterm signal
eterm timeout
.Aqui o script de início winxpvm-start.sh:
Como todas as configurações etc. são feitas no modo de usuário (como meu login é tombert ), mesmo quando executado como root, mudo a conta para tombert . Obviamente, o usuário pode ser alterado na configuração inicial, mas essa solução me deixa a opção de iniciar / parar a máquina virtual "manualmente" no console.
O mais interessante é o script de desligamento no winxpvm-stop.sh:
Primeiro, faço o mesmo que no script inicial - estou mudando o usuário da raiz para a minha conta tombert . Agora vamos olhar para a função
dostop
. Primeiro, estou verificando se a máquina virtual está em execução. Então, eu estou tentando "suavemente" o desligamento enviando um desligamento diretamente para o WinXP usandoguestcontrol
. Aqui você deve fornecer as credenciais da conta WinXP, que no meu caso é tombert e uma senha. O Windowsshutdown
irá fechar todos os aplicativos normalmente e desligar o sistema operacional (normalmente). Em seguida, vamos verificar o estado da máquina virtual continuamente usandoshowvminfo
. Fazer isso pelo menos 60 vezes com 1 segundo de tempo limite (faça o que você achar apropriado aqui) deve deixar a máquina virtual tempo suficiente para desligar normalmente. Observe que a chamada parashowvminfo
também demora um pouco menos de um segundo (pelo menos no meu computador), o que gera aproximadamente 120 segundos no meu caso. Se tudo frear, podemos desligar à força usando apoweroff
declaração.Você também deve ver o
acpipowerbutton
, mas não utilizado. Isso ocorre porque não funciona de maneira confiável. Se você estiver conectado ao Windows, ou ainda pior, vários usuários, o Windows mostrará uma caixa de diálogo de encerramento de confirmação, impedindo o desligamento do sistema. Esta também é a razão pela qual oacpibutton
in/etc/default/virtualbox
não funcionará 100% confiável. Além disso, opoweroff
desligamento forçado da máquina virtual é o mesmo que pressionar um botão liga / desliga por muito tempo. Portanto, é melhor definir isso como vazio:Trecho de / etc / default / virtualbox:
Para torná-lo perfeito, convém alterar o comportamento do botão liga / desliga:
Trecho de /etc/acpi/powerbtn.sh:
Ainda existe uma pequena desvantagem. Quando a máquina virtual ainda estiver inicializando e o serviço de controle de convidados não estiver ativo (na máquina virtual), ele não receberá o comando shutdown. Um caso raro ... mas pense nisso.
É isso, espero que ajude.
fonte
VERR_INVALID_PARAMETER
no host se eu estiver conectado via RDC como o usuário fornecido no script e, subsequentemente, o convidado continuar executando.Siga esta resposta para alterar a política do sistema para reinicialização
Você não pode simplificar isso
reboot
. Osinit.d
scripts do AFAIK não funcionarão porque leva muito tempo, mas você pode executar o comando assim:onde
<vm>
é o nome da máquina virtualfonte
Você pode enviar uma solicitação de desligamento para a máquina virtual com:
Mas se você fizer isso em um script init, o script não deverá sair até que o desligamento seja concluído. Podemos detectar isso pesquisando o arquivo de unidade da VM (.vdi) com
lsof
oufuser
em um loop. Ou, como solução alternativa barata,sleep 20
pode ser suficiente.Aqui está o que estou usando atualmente no bloco próximo do meu script init:
Perto do topo do arquivo, eu defini:
Na verdade, isso pode não fechar o aplicativo VirtualBox, mas aguarda a VM concluir o desligamento. Também não funcionará se a máquina virtual ainda estiver em processo de inicialização (muitos sistemas operacionais ignoram o botão de desligar durante esta fase) ou se você estiver emulando um sistema antigo sem suporte a ACPI.
fonte