Il problema
Ho lo stesso problema e non ho trovato una buona soluzione. Ecco cosa ho trovato:
Il problema è che dopo il ripristino, i tempi di clock dell'hardware e del sistema sul guest sono diversi:
root @ guest: ~ # date; hwclock
Sab 11 ott 13:09:38 UTC 2014
Sab 11 ott 13:10:42 2014-0,454380 secondi
Sull'host, concordano:
root @ four: ~ # date; hwclock
Sab 11 ott 13:11:35 UTC 2014
Sab 11 ott 13:11:36 2014 -1.000372 secondi
La soluzione sarebbe eseguire hwclock --hctosys
sul guest dopo che è stato ripreso. Tuttavia, non ho trovato un modo per farlo solo con modifiche sul sistema guest, poiché l'ospite non nota che è sospeso e ripreso.
QEmu Guest Agent
Esiste la possibilità di eseguire un software chiamato QEmu Guest Agent sul guest e di avvisare dall'host di aggiornare l'orologio del sistema guest dall'orologio hardware del guest. Tuttavia, la pagina menziona che l' agente guest rende l'host e l'ospite vulnerabili agli attacchi reciproci a causa di problemi con un parser JSON (almeno credo che il codice interessato sia eseguito anche sull'host, non ne sono sicuro ). Ad ogni modo, ecco come configurarlo:
Imposta un canale seriale virtio per l'agente come menzionato nel wiki libvirt (vedi anche la documentazione sul formato del dominio libvirt ).
Una volta disponibile il canale seriale, installare e avviare QEmu Guest Agent sul guest. (Debian:. apt-get install --no-install-recommends qemu-guest-agent
)
Attiva l'offset dell'orologio sospendendo, aspettando e riprendendo. Quindi esegui il seguente comando sull'host per correggerlo: virsh qemu-agent-command backup '{"execute":"guest-set-time"}'
La pagina wiki che utilizza nonvirsh qemu-agent-command
è supportata , ma non ho trovato nessun altro comando che funzioni.
Ho trovato due discussioni sull'automazione all'interno di libvirt della chiamata a guest-set-time
su riprendi dalla sospensione:
Tuttavia, nulla è stato ancora implementato per quanto ho potuto vedere.
Ho trovato informazioni su come inviare comandi all'agente guest sul wiki di stoney-cloud.org .
Ho anche provato a impostare tickpolicy="catchup"
la configurazione del timer libvirt ma questo non ha risolto il problema.
NTP
Un'alternativa all'utilizzo dell'agente sarebbe quella di usare un demone ntp o di chiamare periodicamente ntpdate da un cron job. Non consiglierei quest'ultimo, poiché può far tornare indietro il tempo, il che può confondere i programmi (ad esempio, il server IMAP Dovecot non cerca di gestire il tempo che va indietro e può terminare).
Ho provato i seguenti demoni ntp:
openntpd : corregge il tempo molto lentamente a una velocità di circa 2 secondi per 60 minuti nel mio test. La differenza oraria era di 120 secondi. Inoltre, openntpd genera un errore se la differenza di tempo è troppo grande e, nel mio test, in questo caso non riesce a correggere completamente l'ora. Vantaggi di openntpd: può essere eseguito come utente normale in chroot.
chrony : nel mio test corregge un time offset di 120 secondi in 30 minuti. chrony può essere configurato per essere eseguito come utente normale. il supporto chroot non è implementato. L'intervallo di polling del server NTP può essere configurato per ciascun server NTP.
systemd-timesyncd : nel mio test corregge un time offset di 120 secondi in 30 secondi. Viene eseguito come utente normale per impostazione predefinita. Tuttavia, l'intervallo di polling dei server NTP aumenta fino a 2048 secondi, in modo che una sospensione / ripresa non venga rilevata fino a 34 minuti dopo la ripresa nel caso peggiore. Questo non sembra essere configurabile. Inoltre, ho osservato timesyncd fare un passo indietro nel tempo, il che causa gli stessi problemi di chiamare ntpdate in un cron (vedi sopra).
chrony risolve il problema. Openntpd non è adatto perché il suo tasso di correzione è troppo basso e non sembra essere configurabile. systemd-timesyncd non risolve del tutto il problema, poiché il suo intervallo di polling non è configurabile.
Ho testato le seguenti versioni Debian dei demoni NTP: openntpd 20080406p-10, chrony 1.30-1 e systemd 215-5 + b1.