Czy jest możliwe, aby VM Virtualbox zawsze zaczynał od tego samego czasu, jeśli tak, to w jaki sposób?

9

Próbuję użyć VB, aby skonfigurować maszynę wirtualną z systemem Windows 7 na potrzeby szkolenia. Chcę, aby maszyna wirtualna zawsze uruchamiała się w tych samych warunkach, w szczególności:

  1. Maszyna wirtualna zawsze zaczyna się o tej samej dacie i godzinie
  2. Dysk pozostaje niezmieniony w wyniku poprzedniego ćwiczenia

Nauczyłem się konfigurować dysk jako „niezmienny”, który powinien zająć się (2), ale nie mogę uruchomić maszyny wirtualnej w tym samym czasie. Po rozejrzeniu się znalazłem:

Po zainstalowaniu i uruchomieniu Dodatki dla gości Virtualbox spróbują zsynchronizować czas gościa z czasem hosta. Można temu zapobiec, uniemożliwiając usłudze gościa czytanie zegara hosta:

VBoxManage setextradata „Nazwa maszyny wirtualnej” „VBoxInternal / Devices / VMMDev / 0 / Config / GetHostTimeDisabled” 1

Próbowałem tego z wyłączoną maszyną wirtualną i przy jej uruchomieniu, ale wydaje się, że nic nie robi. Na tej samej stronie dokumentacji znajduje się również wzmianka o parametrze „--timesync-set-start”, jednak nie widzę żadnej wzmianki o formacie ustawiania daty i godziny. Pomoc byłaby mile widziana.

Martin K.
źródło
Jeśli masz na myśli „nic nie robi”, masz na myśli „czas i data systemu i tak są zsynchronizowane z hostem”?
Sopalajo de Arrierez
Czy powinno być rozwiązaniem dla Ciebie ustawienie czasu i daty po uruchomieniu systemu Windows (mam na myśli kilka sekund później)? Myślę, że powinien to zrobić prosty skrypt .cmd.
Sopalajo de Arrierez
Sam system Windows może być również skonfigurowany do synchronizacji czasu z internetowym serwerem czasu.
Thorbjørn Ravn Andersen

Odpowiedzi:

16

Musisz wykonać następujące czynności, aby czas gościa zachował to, co było:

1. Wyłącz synchronizację czasu maszyny wirtualnej:

1.1 Wyłącz synchronizację hosta dla gościa

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

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

Aby cofnąć:

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

1.2 Wyłącz synchronizację GuestAddition

Użyj regedit.exe, aby zmodyfikować rejestr.

Znajdź tę gałąź: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ VBoxService

Zmień wartość ImagePathz na

system32\VBoxService.exe

do

system32\VBoxService.exe --disable-timesync

Uruchom ponownie maszynę wirtualną lub ponownie uruchom usługę „VirtualBox Guest Additions Service”.

2. Wyłącz synchronizację czasu w systemie Windows.

Sprawdź ustawienia czasu. Wyłącz synchronizację czasu w Internecie.

Źródło: http://www.ppq.ch/snippets/15-vobxtime

Madwyn
źródło
Dzięki. Twoje „1.2 Wyłącz GuestAddition Timesync” to jedyna opcja, która wydawała mi się działać. Zmiany hosta były przywracane przez VirtualBox. Rzuciłem okiem na plik po uruchomieniu maszyny wirtualnej i usunięciu nowych wpisów xml extradata.
Graymatter,
5

Poniższe kroki będą działać, jeśli hostem jest system Windows / Linux.

  1. Jeśli „maszyną docelową” jest Windows: otwórz „docelową maszynę wirtualną” i zastosuj „Panel sterowania -> Data i godzina -> Czas internetowy -> Zmień ustawienia -> Wyłącz„ Synchronizuj z internetowym serwerem czasu ””.

  2. Skopiuj poniższe wiersze jako plik „nazwa_pliku.ps1” (Windows) / „nazwa pliku.sh” (Linux) na komputerze hosta. Edytuj ten plik zgodnie z opisem w kroku 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. Zaktualizuj „vbox_path” za pomocą ścieżki instalacji VirtualBox. (Host: Windows)
  2. Zaktualizuj „vm_name” nazwą VirtualBox Image, która zostanie uruchomiona.
  3. Zaktualizuj „start_utc” za pomocą http://www.epochconverter.com/ . Maszyna docelowa uruchomi się zawsze z czasem „start_utc”. Konwerter Epoki
  4. Otwórz „Windows PowerShell” z Menu Start jako Administrator . (Host: Windows)
  5. Uruchom następujące polecenie i odpowiedz na pytanie jako [Y]. (Host: Windows)

    Set-ExecutionPolicy RemoteSigned
    
  6. Uruchom prawym przyciskiem myszy plik „twoja nazwa pliku.ps1” i wybierz „Uruchom za pomocą programu PowerShell”, aby uruchomić komputer docelowy. (Host: Windows)

  7. Uruchom terminal systemu Linux wykonaj poniższe polecenia, aby uruchomić maszynę docelową (host: Linux)

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

Uwaga: Zawsze używaj kroku 8 (Host: Windows) / kroku 9 (Host: Linux), aby uruchomić docelową maszynę wirtualną.

Onur Turhan
źródło
Dla użytkowników, którzy mają hosta linuksowego, stworzyłem skrypt bash oparty na tej odpowiedzi, którą można znaleźć tutaj: gist.github.com/breautek/be83414034b973d53691645d6e178bb4 Po prostu zapisz go jako startvm.sh chmod +x startvm.shi użyj go, ./startvm.shaby go uruchomić. Prawdopodobnie zadziała również na komputerze Mac, ale go nie przetestowałem.
Norman Breau,
1

Aby odpowiedzieć na oryginalne OP (MartinK) Pytanie: Czy można uzyskać maszynę wirtualną Virtualbox zawsze zaczynać od tego samego czasu, jeśli tak, to w jaki sposób?

Jest to możliwe po prostu przez

(a) Ustawienie właściwości „GetHostTimeDisabled” = 1 przy użyciu polecenia VBoxManage w wierszu polecenia (w trybie offline, tj. przed uruchomieniem maszyny wirtualnej)

(b) Uruchom maszynę wirtualną z wcześniej zapisanego SnapShota. (w żądanym czasie rozpoczęcia)

Nie trzeba więcej poleceń za każdym razem, gdy to działa. (testowany na Windows Guest na Windows Hosts)

Ta odpowiedź jest bliższa wcześniejszej odpowiedzi Olivera Salzburga, z tym wyjątkiem, że przeoczył ustawienie parametrów „GetHostTimeDisabled”. OfCourse Internet Time Sync (NTP) powinien być wyłączony w zapisanej migawce.

Bhishmar
źródło
0

Użyj migawek.

  1. Aby utworzyć nową migawkę, wystarczy użyć przycisku Wykonaj migawkę w przeglądzie migawek :

    wprowadź opis zdjęcia tutaj

  2. Nazwij migawkę i zapisz ją.

  3. Aby później zrestartować stały stan, przywróć poprzednią migawkę za pomocą przycisku Przywróć migawkę :

    wprowadź opis zdjęcia tutaj

Jeśli chcesz się upewnić, że twoja migawka ma zawsze tę samą datę, prawdopodobnie zechcesz wyłączyć synchronizację czasu w Internecie w systemie Windows, odznaczając pole wyboru Synchronizuj z internetowym serwerem czasu w oknie dialogowym konfiguracji zegara.

Der Hochstapler
źródło
Myślę, że to doskonałe rozwiązanie i naprawia problem. Wygląda na to, że jeśli użyję migawki, nie muszę się martwić, że dysk będzie „niezmienny” - mam rację? Ponadto, chociaż nie potrzebuję tego, aby rozwiązać mój problem, jestem ciekawy co do celu komend VBoxManage, o których wspomniałem w poprzednim poście (i jak je uruchomić)
Martin K
Proszę zapoznać się z dokumentacją dotyczącą tego polecenia: virtualbox.org/manual/ch09.html#disabletimesync Nie widzę korzyści, jakie miałby niezmienny dysk lub co to właściwie oznacza w tym kontekście.
Der Hochstapler
Zgodnie z moim oryginalnym postem zapoznałem się już z dokumentacją, do której się odwołujesz, i próbowałem ją uruchomić - jednak nic nie zrobiło. Coś mi brakuje - ale co?
Martin K