如何保持与libvirt恢复KVM客人的时间?

在我的主机上,我使用libvirt和KVM guest。 当主机closures时,libvirt会暂停guest虚拟机。 主机启动时,libvirt会恢复guest虚拟机。 问题是,如果客人在24小时后暂停和恢复,则客人时间是过去24小时。

我认为可能是clocksource的问题,但它已经设置为“kvm-clock”。

$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource kvm-clock tsc hpet acpi_pm $ cat /sys/devices/system/clocksource/clocksource0/current_clocksource kvm-clock 

问题

我有同样的问题,我还没有find一个好的解决scheme。 这是我发现的:

问题是,恢复之后,系统和客户端上的硬件时钟是不同的:

 root @ guest:〜#date;  hwclock的
 Sat Oct 11 13:09:38 UTC 2014
 Sat Oct 11 13:10:42 2014 -0.454380 seconds

主持人,他们同意:

 root @ four:〜#date;  hwclock的
 Sat Oct 11 13:11:35 UTC 2014
 Sat Oct 11 13:11:36 2014 -1.000372秒

解决办法是在客户端恢复之后运行hwclock --hctosys 。 但是,我还没有find办法做到这一点,只是在客人系统的变化,因为客人没有注意到它被暂停和恢复。

QEmu客人代理

可以在guest 虚拟机上运行名为QEmu Guest Agent的软件,并通知主机从guest硬件时钟更新guest系统时钟。 但是,该页面提到,由于JSONparsing器的问题, guest代理使主机和guest虚拟机容易受到彼此的攻击 (至less我相信受影响的代码也在主机上运行,​​我不确定)。 无论如何,这里是如何设置:

  1. 为libvirt wiki中提到的代理设置virtio串行通道(另请参阅libvirt域格式文档 )。

  2. 在串行通道可用之后,在来宾上安装并启动QEmu Guest Agent。 (Debian: apt-get install --no-install-recommends qemu-guest-agent 。)

  3. 通过挂起,等待和恢复来触发时钟偏移。 然后在主机上运行以下命令来纠正它: virsh qemu-agent-command backup '{"execute":"guest-set-time"}'使用virsh qemu-agent-command的wiki页面不受支持 ,但是我还没有find任何其他的命令来完成这项工作。

我发现了两个关于在libvirt中自动执行从挂起恢复中调用guest-set-time讨论:

然而,据我所知,还没有实施。

我find了关于如何将命令提交给stoney-cloud.org上的访客代理的信息 。

我也尝试在libvirt定时器configuration中设置tickpolicy="catchup" ,但是这并没有解决问题。

NTP

使用代理的另一种方法是使用ntp守护程序或定期从cron作业调用ntpdate。 我不会推荐后者,因为它可能会导致时间倒退,这可能会混淆程序(例如, Dovecot IMAP服务器不会尝试处理时间倒退,并可以终止)。

我尝试了下面的ntp守护进程:

  • openntpd :在我的testing中,以每60分钟大约2秒的速度非常缓慢地校正时间。 时间偏移是120秒。 另外, 如果时间偏移量太大 , openntpd会抛出一个错误 ,在我的testing中,在这种情况下,完全不能纠正时间。 openntpd的优点:可以作为普通用户在chroot中运行。

  • chrony :在我的testing中,在30分钟内纠正 120秒的时间偏移。 chrony可以configuration为以普通用户身份运行。 chroot支持没有实现。 可以为每个NTP服务器configurationNTP服务器轮询间隔。

  • systemd-timesyncd :在我的testing中,在30秒内纠正 120秒的时间偏移。 默认情况下以普通用户身份运行。 但是,NTP服务器的轮询时间间隔增加到2048秒,所以在最坏的情况下,恢复后34分钟才能检测到挂起/恢复。 这似乎不是可configuration的。 另外,我观察了timesyncd向后的时间,这会导致与在cron中调用ntpdate相同的问题(请参阅上文)。

慢慢解决了这个问题。 Openntpd不适合,因为它的校正率太低,似乎不可configuration。 systemd-timesyncd也不能完全解决问题,因为它的轮询间隔是不可configuration的。

我testing了以下Debian版本的NTP守护进程:openntpd 20080406p-10,chrony 1.30-1和systemd 215-5 + b1。

kvm-clock将来宾时间同步到guest虚拟机启动时的主机时间。 你应该在客户端使用和ntp客户端,并关机/启动,而不是使用挂起/恢复。

来宾上的许多虚拟主机操作可能导致暂停 – 恢复。 这将对客人的系统时钟产生负面影响。 例如,克隆虚拟机会导致在克隆过程中暂停。 客人时钟后面。 为了让NTP同步你需要的时钟,然后重新启动客人 – 在所有情况下都不是一个好的解决scheme。 另外,你可以重新启动ntpd在客人,但也不是最佳的。 理想情况下,需要有一个事件(虚拟机恢复),您可以select使用这种types的更正来宾。

花了一些时间研究之后,我决定直接使用主机时钟作为CentOS 7客户OS系统时钟的参考。

而不是在客户机中运行ntpd,我决定每隔15分钟通过crontab设置客户机硬件时钟的客体系统时钟。 来宾的硬件时钟反映了虚拟化主机上的时间,虚拟化主机通过运行在虚拟化主机上的ntpd进行控制。 这为客户操作系统提供了可靠的时间。 最坏的情况下,时钟可能会closures15分钟,然后才能恢复客人的同步到适当的时间。

 # crontab -e 0,15,30,45 * * * * /sbin/hwclock --hctosys 

如果客人有一个事件可以启动时间同步,当客人恢复,但显然这是不可用的会更好。 crontab方法是一个解决方法,它每15分钟进行一次hwclock调用。 它完成了工作,但没有我想要的那么高雅。

我使用类似的方式在虚拟机暂停/恢复之后同步时间,但是我认为最好是尝试猜测,它应该在正确的方向上同步,并且比较短的差异更长,可以通过NTPD修复。

https://gist.github.com/jhrcz/7138803

PS。 新的6.7更新日志说这可以自动完成,只有kvm时钟时钟源。