Sur mon hôte, j'utilise Libvirt et un invité KVM. Lorsque l'hôte se ferme, Libvirt suspend l'invité. Lorsque l'hôte démarre, Libvirt reprend l'invité. Le problème est que si l'invité est suspendu et repris après 24 heures par exemple, le temps de l'invité est de 24 heures dans le passé.
Je pensais que peut-être que le problème est avec l'horlogèse, mais il est déjà prêt à "kvm-horloge" déjà.
$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource
kvm-clock tsc hpet acpi_pm
$ cat /sys/devices/system/clocksource/clocksource0/current_clocksource
kvm-clock
J'ai le même problème et je n'ai pas trouvé une bonne solution. Voici ce que j'ai trouvé:
Le problème est que, après le CV, les temps d'horloge du système et du matériel sur l'invité sont différents:
[.____] racine @ invité: ~ # date; hwclock Sam 11 oct. 13:09:38 UTC 2014 [.____] SAT 11 13:10:42 2014 -0,454380 secondes [.____]
Sur l'hôte, ils sont d'accord:
[.____] racine @ quatre: ~ # date; Hwclock SAT US 11 13:11:35 UTC 2014 [.____] SAT 11 13:11:36 2014 -1.000372 secondes [.____]
La solution serait de courir hwclock --hctosys
sur l'invité après avoir été repris. Cependant, je n'ai pas trouvé de moyen de le faire avec des changements sur le système invité uniquement, car l'invité ne remarque pas qu'il est suspendu et repris.
Il est possible d'exécuter un logiciel appelé Agent invité QEM sur l'invité et notifiez à partir de l'hôte pour mettre à jour l'horloge système invité à partir de l'horloge matérielle invité. Cependant, la page mentionne que le agent invité rend l'hôte et l'invité vulnérable aux attaques Les uns des autres en raison de problèmes avec un analyseur JSON (au moins, je pense que le code concerné est également exécuté sur le Host, je ne suis pas sûr de ça). Quoi qu'il en soit, voici comment définir cela:
Configurez un canal de série Virtio pour l'agent comme mentionné dans le Libvirt Wiki (voir aussi Libvirt Domain Format Documentation ).
Une fois que le canal de série est disponible, installez et démarrez l'agent de la clientèle QEMU sur l'invité. (Debian: apt-get install --no-install-recommends qemu-guest-agent
.)
Déclencher l'horloge offset en suspensant, en attente et en reprenant. Puis exécutez la commande suivante sur l'hôte pour le corriger: virsh qemu-agent-command backup '{"execute":"guest-set-time"}'
La page wiki qui utilise virsh qemu-agent-command
is non pris en charge, mais je n'ai trouvé aucune autre commande qui fait le travail.
J'ai trouvé deux discussions sur l'automatisation de Libvirt l'appel à guest-set-time
sur CV de suspension:
Cependant, rien n'a encore été mis en œuvre autant que je puisse voir.
J'ai trouvé des informations sur la manière de soumettre des commandes à l'agent invité sur wiki de stoney-cloud.org .
J'ai aussi essayé de définir tickpolicy="catchup"
Dans la section Configuration de la minuterie Libvirt Mais cela n'a pas résolu le problème.
Une alternative à l'utilisation de l'agent serait d'utiliser un démon NTP ou d'appeler périodiquement NTPDate d'un travail cron. Je ne recommanderais pas ce dernier, car il peut causer le temps d'aller en arrière, ce qui peut confondre des programmes (par exemple, le Dovecot iMap Server n'essaye pas de gérer le temps en arrière et peut terminer) .
J'ai essayé les démons NTP suivants:
OpenNTPD : Corrige le temps très lentement à une vitesse d'environ 2 secondes par 60 minutes dans mon test. Le décalage de temps était de 120 secondes. De plus, OpenNTPD jette une erreur si le décalage de l'heure est trop grand et, dans mon test, ne parvient pas complètement à corriger le temps dans ce cas. Avantages de OpenNTPD: Peut exécuter comme utilisateur régulier dans Chroot.
Chrony : corrige un décalage de temps de 120 secondes en 30 minutes dans mon test. Chrony peut être configuré pour fonctionner comme utilisateur régulier. Le support de chroot n'est pas implémenté. NTP Intervalle d'interrogation du serveur peut être configuré pour chaque NTP Server.
Systemd-Timesyncd : corrige un décalage de temps de 120 secondes en 30 secondes dans mon test. Fonctionne comme utilisateur régulier par défaut. Cependant, l'intervalle de vote de NTP a augmente jusqu'à 2048 secondes, de sorte qu'une suspension/reprise ne serait détectée que 34 minutes après le CV dans le pire des cas. Cela ne semble pas Soyez configurable. De plus, j'ai observé TimesynCD étape le temps reculé, ce qui provoque les mêmes problèmes que d'appeler NTPDate dans un cron (voir ci-dessus).
chrony résout le problème. OpenNTPD ne convient pas car son taux de correction est trop bas et ne semble pas être configurable. SystemD-Timeyncd ne résout pas entièrement le problème, car son intervalle de vote n'est pas configurable.
J'ai testé les versions debian suivantes du NTP Daemons: OpenNTPD 20080406P-10, Chrony 1.30-1 et SystemD 215-5 + B1.
De nombreuses opérations hôtes de virtualisation sur l'invité peuvent entraîner une pause - CV. Cela affectera négativement l'horloge système à l'invité. Par exemple, clonage A VM a entraîné une pause pendant le clonage. L'horloge invitée est ensuite derrière. Pour obtenir NTP Pour synchroniser l'horloge que vous devez ensuite redémarrer. l'invité - pas une bonne solution dans tous les cas à coup sûr. Une alternative, vous pouvez simplement redémarrer NTPD dans l'invité, mais cela n'est pas optimal non plus. Idéalement, il doit être un événement (VM repris) disponible que vous pouviez éventuellement utiliser pour cela. type de correction à l'invité.
Après avoir passé du temps à la recherche de ce temps, j'ai décidé d'utiliser l'horloge hôte directement comme référence pour l'horloge Système Centos 7 Guest OS.
Au lieu de courir NTPD dans l'invité, j'ai décidé que toutes les 15 minutes, je serais définie, via Crontab, l'horloge système invité de l'horloge matérielle de l'invité. L'horloge matérielle de l'invité reflète l'heure à l'hôte de virtualisation contrôlé via NTPD en cours d'exécution sur l'hôte de virtualisation. Cela me fournit une heure fiable dans le système d'exploitation invitée. Le pire des cas, l'horloge peut être éteinte jusqu'à 15 minutes avant qu'il ne soit syncronisé au bon moment après avoir repris l'invité.
# crontab -e
0,15,30,45 * * * * /sbin/hwclock --hctosys
Il serait beaucoup mieux de disposer d'un événement disponible à l'invité qui initierait une synchronisation temporelle lorsque l'invité a repris, mais apparemment non disponible. L'approche de crontab est une solution de contournement en ce sens qu'elle fait appel à une hwwlock tous les 15 minutes. Cela fait le travail, mais pas aussi élégamment que je voudrais.
kvm-horloge synchronise le temps d'invité pour accueillir du temps sur invité startup. Vous devez utiliser et client NTP dans l'invité, et arrêt/démarrage au lieu d'utiliser la suspension/CV.
libvirt prend en charge la synchronisation des heures de visite depuis 2015 . Sur Debian Stretch et rechercher ultérieurement l'option SYNC_TIME
dans /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
Vous pouvez tester la synchronisation du temps dans le système hôte avec:
virsh qemu-agent-command INSERT_YOUR_DOMAIN_HERE '{"execute":"guest-set-time"}'
Cette commande devrait revenir {"return":{}}
sur le succès.
J'utilise des voies similaires pour synchroniser la durée après VM Suspendre/CV, mais je pense qu'il est préférable d'essayer de deviner, qu'il devrait se synchroniser dans la bonne direction et que c'est plus long que la différence courte, qui pourrait être corrigée par NTPD .
https://gist.github.com/jhrcz/71388
Ps. New Centos 6.7 Changelog dit que cela pourrait être fait Automaticaly avec une seule source d'horloge Horloge KVM.