É possível obter uma VM do Virtualbox sempre iniciando no mesmo horário; se sim, como?

9

Estou tentando usar o VB para configurar uma VM do Windows 7 para uso em um curso de treinamento. Quero que a máquina virtual seja sempre inicializada nas mesmas condições, em particular:

  1. A VM sempre inicia na mesma data e hora
  2. O disco permanece inalterado como resultado do exercício anterior

Eu descobri como configurar um disco como "imutável", que deve cuidar de (2), mas não consigo fazer a VM iniciar ao mesmo tempo. Depois de olhar em volta, encontrei o seguinte:

Depois de instalado e iniciado, o Virtualbox Guest Additions tentará sincronizar o horário do convidado com o horário do host. Isso pode ser evitado proibindo o serviço de convidado de ler o relógio do host:

VBoxManage setextradata "VM name" "VBoxInternal / Devices / VMMDev / 0 / Config / GetHostTimeDisabled" 1

Eu tentei isso com a VM desligada e com a inicialização, mas parece não fazer nada. Na mesma página de documentação , também há uma menção ao parâmetro "--timesync-set-start", no entanto, não consigo ver nenhuma menção ao formato para definir data e hora. Ajuda seria bem vinda.

Martin K
fonte
Com "parece não fazer nada", você quer dizer "a hora e a data do sistema são sincronizadas de qualquer maneira com o host"?
Sopalajo de Arrierez
Deve ser uma solução para você definir a hora e a data após a inicialização do Windows (alguns segundos depois, quero dizer)? Um script .cmd simples deve fazer isso, eu acho.
Sopalajo de Arrierez
O próprio Windows também pode ser configurado para sincronizar o horário com um servidor de horário da Internet.
Thorbjørn Ravn Andersen

Respostas:

16

Você precisa executar as seguintes ações para que o tempo do hóspede mantenha o que era:

1. Desative a sincronização horária da sua máquina virtual:

1.1 Desativar host para sincronização de convidados

VBoxManage setextradata <YOUR_VM_NAME> "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" 1

VBoxManage setextradata <YOUR_VM_NAME> "VBoxInternal/TM/TSCTiedToExecution" 1

Para reverter:

VBoxManage setextradata <YOUR_VM_NAME> "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" 0

1.2 Desativar sincronização de hora do GuestAddition

Use o regedit.exe para modificar o registro.

Encontre este ramo: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ VBoxService

Altere o valor ImagePathde

system32\VBoxService.exe

para

system32\VBoxService.exe --disable-timesync

Reinicie sua VM ou reinicie o serviço "VirtualBox Guest Additions Service".

2. Desative a sincronização horária do Windows.

Verifique as configurações de hora. Desative a sincronização da hora da Internet.

Fonte: http://www.ppq.ch/snippets/15-vobxtime

Madwyn
fonte
Obrigado. Seu "1.2 Desativar sincronização do tempo de adição de convidados" é a única opção que parecia funcionar para mim. As alterações do host continuavam sendo revertidas pelo VirtualBox. Eu daria uma olhada no arquivo depois de iniciar a VM e as novas entradas xml extradados foram removidas.
Graymatter 8/07/19
5

As etapas a seguir funcionarão, se a máquina host for Windows / Linux.

  1. Se "máquina de destino" for Windows: Abra "máquina virtual de destino" e aplique "Painel de Controle -> Data e Hora -> Hora da Internet -> Alterar configurações -> Desativar" Sincronizar com um servidor de horário da Internet "".

  2. Copie as linhas abaixo como o arquivo "yourfilename.ps1" (Windows) / "yourfilename.sh" (Linux) na máquina host. Edite este arquivo como descrito na etapa 3. 4. 5.


HOST: WINDOWS

$vbox_path="C:\Program Files\ORACLE\VirtualBox"
$vm_name="Win7_VB"
$start_utc=1444176000

#DO NOT CHANGE ANYTHING BELOW THIS LINE
$now_utc_ms=[int64](([datetime]::UtcNow)-(get-date "1/1/1970")).TotalMilliseconds
$dif_utc_ms=$start_utc * 1000 - $now_utc_ms
Write-Host "START UTC:" $start_utc*1000 " DIF UTC:" $dif_utc_ms " NEW UTC:" $now_utc_ms

cd $vbox_path
VBoxManage setextradata $vm_name "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" "0"
VBoxManage setextradata $vm_name "VBoxInternal/TM/TSCTiedToExecution" 1
VBoxManage modifyvm     $vm_name --biossystemtimeoffset $dif_utc_ms
VBoxManage startvm      $vm_name
Start-Sleep -s 5

HOST: LINUX

#!/bin/sh
vbox_path="/usr/bin/"
vm_name="Win7_VB"
start_utc=1444176000

#DO NOT CHANGE ANYTHING BELOW THIS LINE
now_utc_ms=$(($(date +%s)*1000))
dif_utc_ms=$(($(($start_utc * 1000)) - $now_utc_ms))
echo "START UTC:" $(($start_utc * 1000)) " DIF UTC:" $dif_utc_ms "NOW UTC:" $now_utc_ms

cd $vbox_path
VBoxManage setextradata $vm_name "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" "0"
VBoxManage setextradata $vm_name "VBoxInternal/TM/TSCTiedToExecution" 1
VBoxManage modifyvm     $vm_name --biossystemtimeoffset $dif_utc_ms
VBoxManage startvm      $vm_name
sleep 5
  1. Atualize "vbox_path" com o caminho de instalação do VirtualBox. (Anfitrião: Windows)
  2. Atualize "vm_name" com o nome da imagem do VirtualBox, que será iniciado.
  3. Atualize "start_utc" usando com http://www.epochconverter.com/ . A máquina de destino iniciará sempre com o horário "start_utc". Epoch Converter
  4. Abra "Windows PowerShell" no menu Iniciar como administrador . (Anfitrião: Windows)
  5. Execute o seguinte comando e responda a pergunta como [Y]. (Anfitrião: Windows)

    Set-ExecutionPolicy RemoteSigned
    
  6. Execute com o botão direito do mouse em "yourfilename.ps1" e selecione "Executar com o PowerShell" para iniciar a máquina de destino. (Anfitrião: Windows)

  7. Inicie um comando de execução do Terminal Linux abaixo para iniciar a máquina de destino (Host: Linux)

    chmod +x yourfilename.sh && sh yourfilename.sh
    

Nota: Sempre use a etapa 8 (Host: Windows) / etapa 9 (Host: Linux) para executar a máquina virtual de destino.

Onur Turhan
fonte
Para usuários que possuem um host Linux, eu criei um script bash com base nesta resposta, que você pode encontrar aqui: gist.github.com/breautek/be83414034b973d53691645d6e178bb4 Apenas salve-o como startvm.sh chmod +x startvm.she use-o ./startvm.shpara executá-lo. Provavelmente também funcionará em um host Mac, mas não testei.
Norman Breau
1

Para responder à pergunta original do OP (MartinK): É possível obter uma VM do Virtualbox sempre iniciando do mesmo tempo, se sim, como?

É possível simplesmente

(a) Definindo a propriedade "GetHostTimeDisabled" = 1, usando o comando VBoxManage na linha de comando (no modo offline, ou seja, antes de iniciar a VM)

(b) Inicie uma VM a partir de um SnapShot salvo feito anteriormente. (no horário de início desejado)

Não são necessários mais comandos, sempre que isso funcionar. (testado para Windows Guest nos hosts do Windows)

Essa resposta está mais próxima da resposta anterior de Oliver Salzburg, exceto que ele perdeu a configuração de parâmetros "GetHostTimeDisabled". O Ofcourse Internet Time Sync (NTP) deve estar desativado, no instantâneo salvo.

Bhishmar
fonte
0

Use instantâneos.

  1. Para criar um novo instantâneo, basta usar o botão Obter instantâneo na visão geral dos instantâneos :

    insira a descrição da imagem aqui

  2. Nomeie o instantâneo e salve-o.

  3. Quando você deseja inicializar o estado fixo posteriormente, volte ao instantâneo anterior com o botão Restaurar Instantâneo :

    insira a descrição da imagem aqui

Se você deseja garantir que seu instantâneo sempre tenha a mesma data, provavelmente desejará desativar a sincronização da hora da Internet no Windows desmarcando a caixa de seleção Sincronizar com um servidor de horário da Internet na caixa de diálogo de configuração do relógio.

Der Hochstapler
fonte
Essa é uma excelente solução e resolve o problema para mim, eu acho. Parece então que, se eu usar um instantâneo, não preciso me preocupar em tornar o disco "imutável" - estou certo? Além disso, embora eu não preciso disso para resolver o meu problema, eu sou curioso quanto à finalidade dos comandos VBoxManage que eu mencionei no meu post anterior (e como obtê-los para o trabalho)
Martin K
Consulte a documentação sobre esse comando: virtualbox.org/manual/ch09.html#disabletimesync Não vejo quais benefícios um disco imutável teria ou o que realmente significa nesse contexto.
Der Hochstapler
Conforme meu post original, eu já examinei a documentação a que você se refere e tentei fazê-la funcionar - no entanto, ela não fez nada. Eu devo estar perdendo alguma coisa - mas o que?
Martin K