O problema
Eu tenho o mesmo problema e não encontrei uma boa solução. Aqui está o que eu encontrei:
O problema é que, após a retomada, os horários do sistema e do hardware no convidado são diferentes:
root @ convidado: ~ # data; hwclock
11 de outubro de 13:09:38 UTC 2014
Sáb 11 de outubro 13:10:42 2014 -0.454380 segundos
No host, eles concordam:
raiz @ quatro: ~ # data; hwclock
Sábado, 11 de janeiro de 2013 13:11:35 UTC 2014
Sáb 11 de outubro 13:11:36 2014 -1.000372 segundos
A solução seria executar hwclock --hctosys
no convidado depois que ele fosse retomado. No entanto, não encontrei uma maneira de fazer isso com alterações apenas no sistema de convidados, pois o convidado não percebe que foi suspenso e retomado.
QEmu Guest Agent
Existe a possibilidade de executar um software chamado QEmu Guest Agent no convidado e notificar do host para atualizar o relógio do sistema convidado a partir do relógio do hardware convidado. No entanto, a página menciona que o agente convidado torna o host e o convidado vulneráveis a ataques um do outro devido a problemas com um analisador JSON (pelo menos eu acredito que o código afetado também seja executado no host, não tenho certeza disso ) De qualquer forma, veja como configurar isso:
Configure um canal serial virtio para o agente, conforme mencionado no wiki libvirt (consulte também a documentação do formato de domínio libvirt ).
Depois que o canal serial estiver disponível, instale e inicie o QEmu Guest Agent no convidado. (Debian:. apt-get install --no-install-recommends qemu-guest-agent
)
Ative o deslocamento do relógio suspendendo, aguardando e retomando. Em seguida, execute o seguinte comando no host para corrigi-lo: virsh qemu-agent-command backup '{"execute":"guest-set-time"}'
A página wiki que virsh qemu-agent-command
está usando não é suportada , mas não encontrei nenhum outro comando que faça o trabalho.
Eu encontrei duas discussões sobre como automatizar, dentro do libvirt, a chamada para guest-set-time
suspender o resumo:
No entanto, nada foi implementado ainda, tanto quanto pude ver.
Encontrei informações sobre como enviar comandos para o agente convidado no wiki do stoney-cloud.org .
Eu também tentei definir tickpolicy="catchup"
a configuração do timer libvirt, mas isso não resolveu o problema.
NTP
Uma alternativa ao uso do agente seria usar um daemon ntp ou chamar o ntpdate periodicamente a partir de uma tarefa cron. Eu não recomendaria o último, pois isso pode atrasar o tempo, o que pode confundir os programas (por exemplo, o servidor IMAP do Dovecot não tenta lidar com o tempo que está atrasado e pode terminar).
Eu tentei os seguintes daemons NTP:
openntpd : corrige o tempo muito lentamente a uma taxa de cerca de 2 segundos por 60 minutos no meu teste. O deslocamento de tempo foi de 120 segundos. Além disso, o openntpd gera um erro se o deslocamento de tempo for muito grande e, no meu teste, falhar completamente na correção do horário nesse caso. Vantagens do openntpd: Pode ser executado como usuário comum no chroot.
chrony : Corrige um desvio de tempo de 120 segundos em 30 minutos no meu teste. O chrony pode ser configurado para ser executado como usuário comum. O suporte chroot não está implementado. O intervalo de pesquisa do servidor NTP pode ser configurado para cada servidor NTP.
systemd-timesyncd : corrige um deslocamento de tempo de 120 segundos em 30 segundos no meu teste. Executa como usuário regular por padrão. No entanto, o intervalo de pesquisa dos servidores NTP aumenta até 2048 segundos, para que uma suspensão / retomada não seja detectada até 34 minutos após a retomada, na pior das hipóteses. Isso não parece ser configurável. Além disso, observei que timesyncd retrocede o tempo, causando os mesmos problemas que chamar ntpdate em um cron (veja acima).
chrony resolve o problema. O Openntpd não é adequado porque sua taxa de correção é muito baixa e não parece ser configurável. O systemd-timesyncd também não resolve completamente o problema, porque seu intervalo de pesquisa não é configurável.
Testei as seguintes versões Debian dos daemons NTP: openntpd 20080406p-10, chrony 1.30-1 e systemd 215-5 + b1.
A libvirt suporta a sincronização do horário do convidado desde 2015 . No Debian Stretch e depois procure a opção
SYNC_TIME
em/etc/default/libvirt-guests
:Você pode testar a sincronização de horário no sistema host com:
Este comando deve retornar
{"return":{}}
com sucesso.fonte
Uso uma maneira semelhante para sincronizar o tempo após a suspensão / retomada da VM, mas acho melhor tentar adivinhar, que ela deve ser sincronizada na direção certa e é maior que a curta diferença, que pode ser corrigida pelo NTPD.
https://gist.github.com/jhrcz/7138803
PS. O novo changelog do centos 6.7 diz que isso pode ser feito automaticamente, apenas com a fonte de clock kvm-clock.
fonte