Das Problem
Ich habe das gleiche Problem und habe keine gute Lösung gefunden. Folgendes habe ich gefunden:
Das Problem ist, dass nach dem Fortsetzen die System- und Hardware-Uhrzeiten auf dem Gast unterschiedlich sind:
root @ guest: ~ # date; hwclock
Sa Okt 11 13:09:38 UTC 2014
Sat Oct 11 13:10:42 2014 -0.454380 Sekunden
Auf dem Host sind sie sich einig:
root @ four: ~ # date; hwclock
Sa 11.10. 13:11:35 UTC 2014
Sat Okt 11 13:11:36 2014 -1.000372 Sekunden
Die Lösung wäre, hwclock --hctosys
auf dem Gast zu laufen, nachdem er wieder aufgenommen wurde. Ich habe jedoch keine Möglichkeit gefunden, dies nur mit Änderungen am Gastsystem zu tun, da der Gast nicht bemerkt, dass es angehalten und fortgesetzt wird.
QEmu Guest Agent
Es besteht die Möglichkeit, auf dem Gast eine Software namens QEmu Guest Agent auszuführen und vom Host zu benachrichtigen, dass die Systemuhr des Gasts von der Hardwareuhr des Gasts aktualisiert werden soll. Auf der Seite wird jedoch erwähnt, dass der Gastagent den Host und den Gast aufgrund von Problemen mit einem JSON-Parser für gegenseitige Angriffe anfällig macht (zumindest glaube ich, dass der betroffene Code auch auf dem Host ausgeführt wird, da bin ich mir nicht sicher ). Wie auch immer, hier ist, wie man das einrichtet:
Richten Sie für den Agenten einen virtuellen seriellen Kanal ein, wie im libvirt-Wiki beschrieben (siehe auch Dokumentation zum libvirt-Domain-Format ).
Nachdem der serielle Kanal verfügbar ist, installieren und starten Sie den QEmu Guest Agent auf dem Gast. (Debian:. apt-get install --no-install-recommends qemu-guest-agent
)
Lösen Sie den Zeitversatz durch Anhalten, Warten und Fortsetzen aus. Führen Sie dann den folgenden Befehl auf dem Host aus, um ihn zu korrigieren: virsh qemu-agent-command backup '{"execute":"guest-set-time"}'
Die verwendete Wiki-Seite virsh qemu-agent-command
wird nicht unterstützt , aber ich habe keinen anderen Befehl gefunden, der die Aufgabe erledigt.
Ich fand zwei Diskussionen über die Automatisierung des Aufrufs zum guest-set-time
Fortsetzen des Suspendierens in libvirt :
Soweit ich sehen konnte, wurde jedoch noch nichts implementiert.
Ich habe im Wiki von stoney-cloud.org Informationen darüber gefunden, wie ich Befehle an den Gastagenten übermitteln kann .
Ich habe auch versucht, tickpolicy="catchup"
die libvirt-Timer-Konfiguration einzustellen, aber das hat das Problem nicht gelöst.
NTP
Eine Alternative zur Verwendung des Agenten besteht darin, einen ntp-Daemon zu verwenden oder ntpdate von einem Cron-Job aus regelmäßig aufzurufen. Letzteres würde ich nicht empfehlen, da es dazu führen kann, dass die Zeit nach hinten läuft , was Programme verwirren kann (zum Beispiel versucht der Dovecot IMAP-Server nicht, die Zeit nach hinten zu handhaben und kann terminieren).
Ich habe die folgenden NTP-Daemons ausprobiert:
openntpd : Korrigiert die Zeit in meinem Test sehr langsam mit einer Geschwindigkeit von ungefähr 2 Sekunden pro 60 Minuten. Der Zeitversatz betrug 120 Sekunden. Außerdem gibt openntpd einen Fehler aus, wenn der Zeitversatz zu groß ist und in meinem Test die Zeit in diesem Fall nicht vollständig korrigiert werden kann. Vorteile von openntpd: Kann als normaler Benutzer in chroot ausgeführt werden.
chronisch : Korrigiert in meinem Test einen Zeitversatz von 120 Sekunden in 30 Minuten. chrony kann so konfiguriert werden, dass es als normaler Benutzer ausgeführt wird. Chroot-Unterstützung ist nicht implementiert. Das NTP-Server-Abfrageintervall kann für jeden NTP-Server konfiguriert werden.
systemd-timesyncd : Korrigiert in meinem Test einen Zeitversatz von 120 Sekunden in 30 Sekunden. Läuft standardmäßig als normaler Benutzer. Das Abfrageintervall von NTP-Servern erhöht sich jedoch auf 2048 Sekunden, sodass im schlimmsten Fall eine Unterbrechung / Wiederaufnahme erst 34 Minuten nach der Wiederaufnahme erkannt wird. Dies scheint nicht konfigurierbar zu sein. Außerdem habe ich beobachtet, dass timesyncd die Zeit zurückspringt, was die gleichen Probleme verursacht wie das Aufrufen von ntpdate in einem Cron (siehe oben).
chrony löst das problem. Openntpd ist nicht geeignet, weil seine Korrekturrate zu niedrig ist und nicht konfigurierbar zu sein scheint. Auch systemd-timesyncd löst das Problem nicht vollständig, da das Abfrageintervall nicht konfigurierbar ist.
Ich habe die folgenden Debian-Versionen der NTP-Dämonen getestet: openntpd 20080406p-10, chrony 1.30-1 und systemd 215-5 + b1.
libvirt unterstützt die Zeitsynchronisation von Gästen seit 2015 . Auf Debian Stretch und später suchen Sie nach einer Option
SYNC_TIME
in/etc/default/libvirt-guests
:Sie können die Zeitsynchronisierung vom Host-System aus testen mit:
Dieser Befehl sollte
{"return":{}}
bei Erfolg zurückkehren.quelle
Ich verwende eine ähnliche Methode für die Synchronisierung der Zeit nach dem Anhalten / Fortsetzen der VM, aber ich denke, es ist besser zu raten, dass die Synchronisierung in die richtige Richtung erfolgen sollte und länger als eine kurze Differenz ist, die durch NTPD behoben werden könnte.
https://gist.github.com/jhrcz/7138803
PS. Laut dem neuen Änderungsprotokoll von Centos 6.7 könnte dies automatisch mit nur einer kvm-Clock-Quelle erfolgen.
quelle