Как сохранить время на возобновленном госте KVM с помощью libvirt?

18

На моем хосте я использую libvirt и KVM guest. Когда хост выключается, libvirt приостанавливает гостя. Когда хост запускается, libvirt возобновляет гостя. Проблема заключается в том, что если гость отстранен и возобновлен, например, через 24 часа, то время для гостя составляет 24 часа.

Я подумал, что, возможно, проблема в источнике часов, но он уже установлен на "kvm-clock".

$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource
kvm-clock tsc hpet acpi_pm 

$ cat /sys/devices/system/clocksource/clocksource0/current_clocksource
kvm-clock
Христо Христов
источник

Ответы:

11

Проблема

У меня та же проблема, и я не нашел хорошего решения. Вот что я нашел:

Проблема в том, что после возобновления системные и аппаратные часы на гостевой машине отличаются:

root @ guest: ~ # date; Hwclock
Сб 11 окт 13:09:38 UTC 2014
Сб 11 октября 13:10:42 2014 - 0,454380 секунд

На хосте они согласны

root @ four: ~ # дата; Hwclock
Сб 11 окт 13:11:35 UTC 2014
Сб 11 окт 13:11:36 2014 -1.000372 секунды

Решением было бы запустить hwclock --hctosysгостя после его возобновления. Однако я не нашел способа сделать это с изменениями только в гостевой системе, так как гость не замечает, что она приостановлена ​​и возобновлена.

Гостевой агент QEmu

Существует возможность запуска программного обеспечения под названием QEmu Guest Agent на госте и уведомления от хоста об обновлении часов гостевой системы с часов гостевого оборудования. Однако на странице упоминается, что гостевой агент делает хост и гостя уязвимыми для атак друг друга из-за проблем с анализатором JSON (по крайней мере, я считаю, что уязвимый код также запускается на хосте, я не уверен в этом ). В любом случае, вот как это настроить:

  1. Настройте последовательный канал virtio для агента, как указано в вики libvirt (см. Также документацию по формату домена libvirt ).

  2. После того, как последовательный канал станет доступным, установите и запустите гостевой агент QEmu. (Debian:. apt-get install --no-install-recommends qemu-guest-agent)

  3. Запустите смещение часов путем приостановки, ожидания и возобновления. Затем выполните следующую команду на хосте, чтобы исправить это: virsh qemu-agent-command backup '{"execute":"guest-set-time"}'страница вики, которая использует, virsh qemu-agent-commandне поддерживается , но я не нашел другой команды, которая выполняет эту работу.

Я нашел две дискуссии об автоматизации в libvirt, призывающем к guest-set-timeвозобновлению из suspend:

Тем не менее, ничего не было реализовано, насколько я мог видеть.

Я нашел информацию о том, как отправлять команды гостевому агенту на вики-сайте stoney-cloud.org .

Я также попытался установить tickpolicy="catchup"в конфигурации таймера libvirt, но это не решило проблему.

NTP

Альтернативой использованию агента может быть использование демона ntp или периодический вызов ntpdate из задания cron. Я бы не рекомендовал последнее, так как это может привести к тому, что время уходит назад, что может запутать программы (например, сервер Dovecot IMAP не пытается обрабатывать время, идущее в обратном направлении, и может завершиться).

Я пробовал следующие ntp демоны:

  • openntpd : очень медленно корректирует время со скоростью около 2 секунд за 60 минут в моем тесте. Смещение по времени составило 120 секунд. Кроме того, openntpd выдает ошибку, если смещение по времени слишком велико и, в моем тесте, полностью не корректирует время в этом случае. Преимущества openntpd: Может работать как обычный пользователь в chroot.

  • chrony : исправляет временное смещение в 120 секунд за 30 минут в моем тесте. Chrony может быть настроен для работы в качестве обычного пользователя. поддержка chroot не реализована. Интервал опроса NTP-сервера можно настроить для каждого NTP-сервера.

  • systemd-timesyncd : исправляет смещение по времени на 120 секунд за 30 секунд в моем тесте. Работает как обычный пользователь по умолчанию. Однако интервал опроса NTP-серверов увеличивается до 2048 секунд, поэтому приостановка / возобновление не будет обнаруживаться в течение 34 минут после возобновления в худшем случае. Кажется, это не настраивается. Кроме того, я наблюдал, как timesyncd изменяет время назад, что вызывает те же проблемы, что и вызов ntpdate в cron (см. Выше).

хроника решает проблему. Openntpd не подходит, потому что его уровень коррекции слишком низок и, кажется, не настраивается. systemd-timesyncd также не решает проблему полностью, потому что интервал опроса не настраивается.

Я протестировал следующие версии Debian демонов NTP: openntpd 20080406p-10, chrony 1.30-1 и systemd 215-5 + b1.

Милан
источник
3

Многие операции хоста виртуализации с гостем могут привести к паузе - возобновлению. Это отрицательно скажется на системных часах у гостя. Например, клонирование виртуальной машины приводит к паузе во время клонирования. Гостевые часы потом уже позади. Чтобы заставить NTP синхронизировать часы, вам нужно перезапустить гостя - наверняка не всегда хорошее решение. В качестве альтернативы вы можете просто перезапустить ntpd в гостевой системе, но это тоже не оптимально. В идеале должно быть доступно событие (ВМ возобновлено), которое вы могли бы по желанию использовать для этого типа исправления для гостя.

Потратив некоторое время на изучение этого, я решил использовать часы хоста напрямую в качестве эталона для системных часов гостевой ОС CentOS 7.

Вместо того, чтобы запускать ntpd в гостевой системе, я решил, что каждые 15 минут через crontab я буду устанавливать часы гостевой системы из аппаратных часов гостя. Аппаратные часы гостя отражают время на хосте виртуализации, который управляется через ntpd, запущенный на хосте виртуализации. Это обеспечивает мне надежное время в гостевой ОС. В худшем случае часы могут быть выключены на срок до 15 минут, после чего они синхронизируются с нужным временем после возобновления работы гостя.

# crontab -e

0,15,30,45 * * * * /sbin/hwclock --hctosys

Было бы намного лучше иметь событие, доступное в гостевой системе, которое инициировало бы синхронизацию времени, когда гость был возобновлен, но, очевидно, это недоступно. Подход crontab - это обходной путь в том, что он делает вызов hwclock каждые 15 минут. Он выполняет свою работу, но не так элегантно, как хотелось бы.

zman58
источник
2

kvm-clock синхронизирует время гостя с временем хоста при запуске гостя . Вы должны использовать и клиент ntp в гостевой системе, и выключение / запуск вместо использования приостановки / возобновления.

dyasny
источник
Да, я могу подтвердить, что он синхронизируется при запуске, потому что когда я делаю выключение / запуск гостя, все в порядке. Использование ntp не является решением по многим причинам (это обходной путь, он паникует, когда разница во времени огромна, он требует доступа к серверу времени). Я ищу способ решить проблему с приостановкой / возобновлением, потому что это интересный, красивый и стандартный вариант в libvirt.
Христо Христов
Приостановить это 1) перенести состояние виртуальной машины в файл и 2) уничтожить. Когда вы возвращаетесь из режима ожидания, состояние виртуальной машины восстанавливается (переносится из файла обратно в память виртуальной машины). Это состояние будет включать текущую метку времени. Так что да, это по умолчанию, но нет, время все еще имеет значение, и время должно прийти откуда-то, и именно здесь NTP должен прийти. Я сомневаюсь, что другой источник часов поможет, но вы можете попробовать с acpi_pm.
Дясный
Вы не должны использовать NTP в гостевой .
Брайан Кейн
4
Cain это @ Брайан является весьма спорным, особенно без объяснения или рассуждения за утверждением. Предоставить profflink: docs.redhat.com/docs/en-US/…
десяный
2

libvirt поддерживает синхронизацию гостевого времени с 2015 года . На Debian Stretch и позже ищите опцию SYNC_TIMEв /etc/default/libvirt-guests:

# If non-zero, try to sync guest time on domain resume. Be aware, that
# this requires guest agent with support for time synchronization
# running in the guest. For instance, qemu-ga doesn't support guest time
# synchronization on Windows guests, but Linux ones. By default, this
# functionality is turned off.
#SYNC_TIME=1

Вы можете проверить синхронизацию времени из хост-системы с помощью:

virsh qemu-agent-command INSERT_YOUR_DOMAIN_HERE '{"execute":"guest-set-time"}'

Эта команда должна вернуться {"return":{}}в случае успеха.

Jakob
источник
0

Я использую аналогичный способ для синхронизации времени после приостановки / возобновления виртуальной машины, но я думаю, что лучше попытаться угадать, что она должна синхронизироваться в правильном направлении и длиннее короткой разницы, которая может быть исправлена ​​NTPD.

https://gist.github.com/jhrcz/7138803

PS. Новый журнал изменений Centos 6.7 говорит, что это может быть сделано автоматически только с источником часов kvm-clock.

Ян Горачек
источник