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 o reinício, os tempos do relógio do sistema e do hardware no convidado são diferentes:
root@guest:~# date; hwclock Sat Oct 11 13:09:38 UTC 2014 Sat Oct 11 13:10:42 2014 -0.454380 seconds
No host, eles concordam:
root@four:~# date; hwclock Sat Oct 11 13:11:35 UTC 2014 Sat Oct 11 13:11:36 2014 -1.000372 seconds
A solução seria executar hwclock --hctosys
no convidado depois que ele fosse retomado. No entanto, não encontrei uma maneira de fazer isso apenas com alterações no sistema convidado, pois o convidado não percebe que está suspenso e reiniciado.
QEmu Guest Agent
Existe a possibilidade de executar um software chamado QEmu Guest Agent no convidado e notificar o host para atualizar o relógio do sistema convidado a partir do relógio de 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, acredito que o código afetado também seja executado no host, Não tenho certeza sobre isso). De qualquer forma, veja como configurar isso:
-
Configure um canal serial virtio para o agente, como mencionado no wiki libvirt (veja também 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
.) -
Acione 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 da wiki que usavirsh qemu-agent-command
é sem suporte , mas não encontrei nenhum outro comando que faça o trabalho.
Eu encontrei duas discussões sobre como automatizar dentro da libvirt a chamada para guest-set-time
no currículo da suspensão:
No entanto, nada foi implementado até onde pude ver.
Encontrei informações sobre como enviar comandos para o agente convidado em wiki de stoney-cloud.org .
Eu também tentei definir tickpolicy="catchup"
na configuração do temporizador 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 um cron job. Eu não recomendaria este último, pois ele pode causar um retrocesso no tempo, o que pode confundir programas (por exemplo, o servidor Dovecot IMAP não faz isso) t tente lidar com o tempo que vai para trás 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, openntpd gera um erro se o deslocamento de tempo for muito grande e, no meu teste , falha completamente em corrigir o tempo nesse caso. Vantagens do openntpd: Pode ser executado como usuário regular no chroot.
-
chrony : Corrige um deslocamento de tempo de 120 segundos em 30 minutos no meu teste. O chrony pode ser configurado para ser executado como usuário regular. O suporte a 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. Funciona como usuário regular por padrão. No entanto, o intervalo de pesquisa de servidores NTP aumenta até 2048 segundos, de modo que uma suspensão / retomada não seria detectada até 34 minutos após o reinício no pior dos casos. Isso não parece ser configurável. Além disso, observei o timesyncd rebaixando o tempo, o que causa os mesmos problemas que chamar o ntpdate em um cron (veja acima).
chrony resolve o problema. Openntpd não é adequado porque sua taxa de correção é muito baixa e não parece configurável. systemd-timesyncd não resolve totalmente o problema, porque o seu intervalo de pesquisa não é configurável.
Eu testei as seguintes versões Debian dos daemons NTP: openntpd 20080406p-10, chrony 1.30-1 e systemd 215-5 + b1.