У меня есть виртуальная машина QEMU-KVM с гостевой Windows 10, в которой иногда требуется установить дату на несколько лет назад и запустить некую длительную задачу, в течение которой дата должна оставаться в прошлом. Я отключаю интернет-синхронизацию, выставляю нужную дату и ожидаю, что оно будет держаться, пока я не верну всё обратно. Вместо этого в некий момент происходит сброс времени на текущую реальную дату. В журнале вижу событие, что "System time synchronized with the hardware clock. Process: '' (PID 4).". Проверка показала, что эта синхронизация происходит с периодичностью ровно в 1 час. Попытался проследить через Process Monitor, но ничего странного в этот момент не ловится. Ну то есть видно, что да, псевдо-процесс System в ожидаемый момент времени вдруг берёт и лезет в реестр в раздел настроек времени и часовых поясов и начинает что-то там читать (аналогичные действия выполняет cmd.exe, когда я запускаю там команду date для смены даты), но вот конкретного триггера этой деятельности я обнаружить не могу.
Смотрел в планировщик задач, там в разделе Time Synchronization две задачи: ForceSynchronizeTime с неизвестным кастомным обработчиком и SynchronizeTime, стартующая сервис w32time. Согласно колонке Last Run Time, ни та, ни другая в момент авто-синхронизации не запускались. На всякий случай задизейблил обе. Ожидаемо, не помогло.
Гуглил. Рекомендуют установить параметр RealTimeIsUniversal в реестре, включающий UTC-время в биосе вместо локального. Установил, не помогло.
Также на одном ресурсе видел предложение остановить гостевого агента Qemu; попробовал, не помогло.
Пока обхожусь костылём с фоновым процессом, ежесекундно мониторящим дату и переставляющим её обратно, если обнаруживает синхронизацию, а все операции в моём скрипте, зависящие от текущей даты, обернул в цикл-повтор при возникновении ошибки. Но это ужасно криво. Хотелось бы найти способ вообще избавиться от этого сброса даты. Куда ещё можно ткнуться?
Здравствуйте, aik, Вы писали:
CF>>Куда ещё можно ткнуться?
aik>https://www.qemu.org/docs/master/system/invocation.html
aik>-rtc [base=utc|localtime|datetime][,clock=host|rt|vm][,driftfix=none|slew]
aik>Полно опций, неужто не работает?
Должно работать, я так делал, всё отлично работало.
Re[2]: Windows: запретить синхронизацию времени по аппаратному источнику
Не совсем понимаю, при чём тут опции запуска? У меня смена даты выполняется изнутри гостя. Система может вообще не знать, что она виртуальная, ей просто надо выставить текущую дату назад, выполнить задачу, вернуть дату обратно. Всё это автоматизированно, в пределах одной сессии, без перезагрузки.
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re[3]: Windows: запретить синхронизацию времени по аппаратному источнику
Здравствуйте, CaptainFlint, Вы писали:
CF>Не совсем понимаю, при чём тут опции запуска? У меня смена даты выполняется изнутри гостя. Система может вообще не знать, что она виртуальная, ей просто надо выставить текущую дату назад, выполнить задачу, вернуть дату обратно. Всё это автоматизированно, в пределах одной сессии, без перезагрузки.
Мне показалось проблема что винда сама вытаскивает время из железа. Если ей подсунуть -rtc vm, она не сможет вернуть дату на место сама, а ты сможешь, из своего скрипта, вернуться к начальной дате.
Re[4]: Windows: запретить синхронизацию времени по аппаратному источнику
Здравствуйте, aik, Вы писали:
aik>Мне показалось проблема что винда сама вытаскивает время из железа. Если ей подсунуть -rtc vm, она не сможет вернуть дату на место сама, а ты сможешь, из своего скрипта, вернуться к начальной дате.
Ага, вроде, разобрался. Я думал, речь о подсовывании таймера со сдвинутым временем, а оказалось, опция отдаёт приоритет гостю на управление таймером. Кажется, это должно помочь, да. Пришлось, правда, расковырять по исходникам теги либвирта, чтобы понять, как заставить его передать именно такую опцию в командную строку qemu-kvm. Оказалось, это <timer name='rtc' track='guest'/>. Добавил, запустил — кажется, работает, не сбрасывает.