问题
我遇到了同样的问题,但是找不到很好的解决方案。这是我发现的:
问题在于,恢复后,客户机上的系统时钟和硬件时钟时间不同:
root @ guest:〜#日期; 时钟
2014年10月11日星期六13:09:38 UTC
2014年10月11日星期六13:10:42 -0.454380秒
在主机上,他们同意:
root @ four:〜#日期; 时钟
2014年10月11日星期六13:11:35 UTC
2014年10月11日星期六13:11:36 -1.000372秒
解决方案是hwclock --hctosys
在恢复后在来宾上运行。但是,我还没有找到一种仅通过更改来宾系统上的操作来实现此目的的方法,因为来宾没有注意到它已被挂起并恢复。
QEmu嘉宾代理
可以在客户机上运行称为QEmu客户机代理的软件,并可以从主机通知从客户机硬件时钟更新客户机系统时钟。但是,该页面提到由于JSON解析器的问题,来宾代理使主机和来宾容易受到彼此的攻击(至少我相信受影响的代码也在主机上运行,我不确定)。无论如何,这是设置方法:
如libvirt Wiki中所述,为代理设置一个virtio串行通道(另请参见libvirt域格式文档)。
串行通道可用后,在客户机上安装并启动QEmu Guest Agent。(Debian :apt-get install --no-install-recommends qemu-guest-agent
。)
通过挂起,等待和恢复来触发时钟偏移。然后在主机上运行以下命令来纠正:virsh qemu-agent-command backup '{"execute":"guest-set-time"}'
Wiki页面,使用virsh qemu-agent-command
是不支持的,但我还没有发现任何其他命令,没有工作。
我发现了两个有关在libvirt中自动执行guest-set-time
从suspend暂停调用的讨论:
但是,据我所知,尚未执行任何操作。
我在stoney-cloud.org Wiki上找到了有关如何向来宾代理提交命令的信息。
我也尝试过tickpolicy="catchup"
在libvirt计时器配置中进行设置,但这不能解决问题。
NTP
使用代理的替代方法是使用ntp守护程序或从cron作业定期调用ntpdate。我不建议使用后者,因为它可能导致时间倒退,这可能会使程序感到困惑(例如,Dovecot IMAP服务器不会尝试处理时间倒退并可能终止)。
我尝试了以下ntp守护程序:
openntpd:在我的测试中,以每60分钟约2秒的速度非常缓慢地校正时间。时间偏移为120秒。另外,如果时间偏移太大,openntpd会引发错误,并且在我的测试中,在这种情况下完全无法校正时间。openntpd的优点:可以在chroot中以常规用户身份运行。
chrony:在我的测试中,在30分钟内校正了120秒的时间偏移。可以将chrony配置为以普通用户身份运行。chroot支持未实现。可以为每个NTP服务器配置NTP服务器轮询间隔。
systemd-timesyncd:在我的测试中,将30秒内的时间偏移为120秒。默认情况下以普通用户身份运行。但是,NTP服务器的轮询间隔最多增加2048秒,因此,在最坏的情况下,要等到恢复后的34分钟才能检测到挂起/恢复。这似乎是不可配置的。另外,我观察到timesyncd向后移动时间,这导致了与在cron中调用ntpdate相同的问题(请参见上文)。
chrony解决了这个问题。Openntpd不适合,因为它的校正率太低并且似乎不可配置。systemd-timesyncd也不能完全解决问题,因为它的轮询间隔是不可配置的。
我测试了以下Debian版本的NTP守护程序:openntpd 20080406p-10,chrony 1.30-1和systemd 215-5 + b1。