Можно ли заставить Virtualbox VM всегда запускаться с одного и того же времени, если да, то как?

9

Я пытаюсь использовать VB для настройки виртуальной машины Windows 7 для использования в учебном курсе. Я хочу, чтобы виртуальная машина всегда запускалась с одинаковыми условиями, в частности:

  1. ВМ всегда запускается в одну и ту же дату и время
  2. Диск остается неизменным в результате предыдущего упражнения

Я разработал, как настроить диск как «неизменяемый», который должен заботиться о (2), но я не могу запустить виртуальную машину одновременно. После некоторого осмотра я нашел это:

После установки и запуска гостевые дополнения Virtualbox попытаются синхронизировать время гостя со временем хоста. Это можно предотвратить, запретив гостевой службе читать часы хоста:

VBoxManage setextradata "Имя виртуальной машины" "VBoxInternal / Устройства / VMMDev / 0 / Config / GetHostTimeDisabled" 1

Я попробовал это с выключенной виртуальной машиной и запустил ее, но она, похоже, ничего не делает. На той же странице документации также упоминается параметр «--timesync-set-start», однако я не вижу упоминания о формате для установки даты и времени. Помощь будет приветствоваться.

Мартин К
источник
С "похоже, что он ничего не делает", вы имеете в виду "системное время и дата все равно синхронизируются с хостом"?
Сопалахо де Арриерес
Должно ли это быть решением для вас установить время и дату после загрузки Windows (я имею в виду несколько секунд спустя)? Я думаю, что простой сценарий .cmd должен сделать это.
Сопалахо де Арриерес
Сама Windows также может быть настроена на синхронизацию времени с интернет-сервером времени.
Турбьёрн Равн Андерсен

Ответы:

16

Вам нужно выполнить следующие действия, чтобы время гостя осталось прежним:

1. Отключите синхронизацию времени вашей виртуальной машины:

1.1 Отключить хост для гостя Timesync

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

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

Чтобы вернуться назад:

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

1.2 Отключить GuestAddition Timesync

Используйте regedit.exe для изменения реестра.

Найдите эту ветку: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ VBoxService

Измените значение в ImagePathс

system32\VBoxService.exe

в

system32\VBoxService.exe --disable-timesync

Перезагрузите виртуальную машину или перезапустите службу «Служба гостевых дополнений VirtualBox».

2. Отключите синхронизацию времени Windows.

Проверьте настройки времени. Отключить синхронизацию времени в Интернете.

Источник: http://www.ppq.ch/snippets/15-vobxtime

Madwyn
источник
Спасибо. Ваша «1.2 Отключить GuestAddition Timesync» - единственная опция, которая, кажется, работает для меня. Изменения хоста продолжали отменяться VirtualBox. Я бы посмотрел на файл после того, как запустил виртуальную машину, и новые xml-записи extradata были удалены.
Graymatter
5

Следующие шаги будут работать, если на хост-компьютере установлена ​​Windows / Linux.

  1. Если "целевой машиной" является Windows: откройте "целевую виртуальную машину" и примените "Панель управления -> Дата и время -> Время в Интернете -> Изменить настройки -> Отключить" Синхронизировать с сервером времени в Интернете "".

  2. Скопируйте строки ниже как файл «yourfilename.ps1» (Windows) / «yourfilename.sh» (Linux) на хост-компьютере. Отредактируйте этот файл, как описано в шаге 3. 4. 5.


ВЕДУЩИЕ: ОКНА

$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

ВЕДУЩИЙ: 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. Обновите "vbox_path", указав путь установки VirtualBox. (Хост: Windows)
  2. Обновите «vm_name» с именем VirtualBox Image, которое будет запущено.
  3. Обновите «start_utc» с помощью http://www.epochconverter.com/ . Целевая машина будет запускаться всегда со временем start_utc. Конвертер эпох
  4. Откройте «Windows PowerShell» из меню «Пуск» от имени администратора . (Хост: Windows)
  5. Выполните следующую команду и ответьте на вопрос как [Y]. (Хост: Windows)

    Set-ExecutionPolicy RemoteSigned
    
  6. Запустите правой кнопкой мыши «yourfilename.ps1» и выберите «Запускать с PowerShell», чтобы запустить целевой компьютер. (Хост: Windows)

  7. Запустите команду Linux Terminal execute ниже, чтобы запустить целевой компьютер (хост: Linux)

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

Примечание. Всегда используйте шаг 8 (Хост: Windows) / шаг 9 (Хост: Linux) для запуска целевой виртуальной машины.

Онур Турхан
источник
Для пользователей, у которых есть хост Linux, я создал скрипт bash на основе этого ответа, который вы можете найти здесь: gist.github.com/breautek/be83414034b973d53691645d6e178bb4 Просто сохраните его как startvm.sh chmod +x startvm.shи используйте ./startvm.shдля его запуска. Вероятно, будет работать и на Mac-хосте, но я его не проверял.
Норман Бро
1

Чтобы ответить на оригинальный вопрос OP (MartinK): возможно ли, чтобы виртуальная машина Virtualbox всегда запускалась в одно и то же время, если да, то как?

Это возможно просто

(a) Установка свойства «GetHostTimeDisabled» = 1 с использованием команды VBoxManage в командной строке (в автономном режиме, т.е. перед запуском ВМ)

(b) Запустите виртуальную машину с сохраненного снимка, сделанного ранее. (в желаемое время начала)

Больше никаких команд не требуется, каждый раз, когда это работает. (проверено на гостевой Windows в Windows Hosts)

Этот ответ ближе к более раннему ответу Оливера Зальцбурга, за исключением того, что он пропустил настройку параметра «GetHostTimeDisabled». OfCourse Internet Time Sync (NTP) должна быть отключена в сохраненном снимке.

Bhishmar
источник
0

Используйте снимки.

  1. Чтобы создать новый снимок, просто используйте кнопку « Сделать снимок» в обзоре снимков :

    введите описание изображения здесь

  2. Назовите снимок и сохраните его.

  3. Если вы хотите загрузить фиксированное состояние позднее, вернитесь к предыдущему снимку с помощью кнопки « Восстановить снимок» :

    введите описание изображения здесь

Если вы хотите убедиться, что ваш снимок всегда имеет одну и ту же дату, вы, вероятно, захотите отключить синхронизацию времени в Интернете в Windows, сняв флажок Синхронизировать с сервером времени в Интернете в диалоговом окне настройки часов.

Der Hochstapler
источник
Я думаю, это отличное решение, и оно решает проблему для меня. Тогда кажется, что если я использую снимок, мне не нужно беспокоиться о том, чтобы сделать диск «неизменяемым» - я прав? Кроме того, хотя мне это и не нужно для решения моей проблемы, мне любопытно узнать о назначении команд VBoxManage, о которых я упоминал в предыдущем посте (и о том, как заставить их работать)
Martin K,
Пожалуйста, обратитесь к документации по этой команде: virtualbox.org/manual/ch09.html#disabletimesync. Я не вижу, какую пользу принесет неизменный диск или что он на самом деле означает в этом контексте.
Der Hochstapler
Что касается моего первоначального поста, я уже просмотрел документацию, на которую вы ссылаетесь, и попытался заставить ее работать - однако она ничего не сделала. Я должен что-то упустить - но что?
Мартин К