Як зберегти час для відновленого гостя KVM за допомогою libvirt?


18

В хості я використовую libvirt та KVM гість. Коли господар зупиняється, 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: ~ # дата; годинник
Сб 11 жовтня 13:09:38 UTC 2014
Сб 11 жовтня 13:10:42 2014 -0,454380 секунд

Про господаря вони погоджуються:

root @ four: ~ # дата; годинник
Сб 11 жовтня 13:11:35 UTC 2014
Сб 11 жовтня 13:11:36 2014 -1.000372 секунд

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

QEmu Guest Agent

Існує можливість запустити програмне забезпечення під назвою QEmu Guest Agent для гостя та сповістити від хоста про оновлення годинника гостьової системи з годинникового апаратного годинника гостя. Однак на сторінці згадується, що гостьовий агент робить хоста і гостя вразливими для атак один на одного через проблеми з аналізатором JSON (принаймні, я вважаю, що порушений код також працює на хості, я не впевнений у цьому ). У будь-якому випадку, ось як це налаштувати:

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

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

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

Я знайшов дві дискусії щодо автоматизації в рамках libvirt заклику до guest-set-timeрезюме від призупинення:

Однак поки що нічого не було реалізовано, наскільки я міг бачити.

Я знайшов інформацію про те, як подати команди гостьовому агенту на вікі сайту 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 у кроні (див. Вище).

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

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


3

Багато операцій хосту віртуалізації з гостем може призвести до паузи - відновлення. Це негативно вплине на системний годинник у гостя. Наприклад, клонування VM призводить до паузи під час клонування. Гостьовий годинник після цього позаду. Для того, щоб NTP синхронізував годинник, потрібно перезапустити гостя - не завжди хороше рішення у всіх випадках. Альтернативно, ви можете просто перезапустити ntpd у гості, але це також не є оптимальним. В ідеалі має бути доступна подія (відновлена ​​VM), яку ви необов'язково можете використовувати для виправлення цього виду для гостя.

Провівши деякий час на дослідження цього, я вирішив використати хост-годинник безпосередньо як орієнтир для системного годинника гостьової ОС CentOS 7.

Замість того, щоб запускати ntpd у гостях, я вирішив, що кожні 15 хвилин я встановлюватиму через кронтаб, годинниковий системний годинник від апаратного годинника гостя. Апаратний годинник гостя відображає час на хості віртуалізації, який управляється через ntpd, що працює на хості віртуалізації. Це забезпечує мені надійний час у гостьовій ОС. Найгірший випадок, годинник може вимкнутись протягом 15 хвилин, перш ніж він синхронізується до належного часу після відновлення гостя.

# crontab -e

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

Було б набагато краще, щоб у гостя була доступна подія, яка би ініціювала синхронізацію часу, коли гість відновився, але, мабуть, цього немає. Підхід crontab є вирішенням того, що він робить дзвінок на годинниковий годинник кожні 15 хвилин. Це робить роботу, але не настільки елегантно, як хотілося б.


2

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


Так, я можу підтвердити, що він синхронізується при запуску, тому що коли я роблю вимкнення / запуск гостя, все нормально. Використання ntp не є рішенням з багатьох причин (це врегулювання, воно панікує, коли різниця в часі величезна, він вимагає доступу до сервера часу). Я шукаю спосіб вирішити проблему з призупиненням / відновленням, оскільки це цікавий, приємний і типовий варіант у libvirt.
Христо Христов

призупинити 1) перенести стан VM у файл та 2) знищити. Після відновлення призупинення стан VM відновлюється (мігрується з файлу назад у пам'ять VM). Цей стан буде включати поточну мітку часу. Так, так, це за замовчуванням, але ні, терміни все ще мають значення, і час має прийти звідкись, і саме тут повинен з'явитися NTP. Я сумніваюся, інше джерело годинника допоможе, але ви можете спробувати з acpi_pm.
діасний


4
@Brian Cain це дуже сперечається, особливо без пояснень чи міркувань, що стоять за цим твердженням. Щоб надати profflink: docs.redhat.com/docs/en-US/…
dyasny

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":{}}успіх.


0

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

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

PS. Новий змінний центр centos 6.7 стверджує, що це можна зробити автоматично, лише з кінцевим годинниковим джерелом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.