如何使用libvirt保持恢复的KVM guest虚拟机的时间?


18

在主机上,我正在使用libvirt和KVM guest虚拟机。当主机关闭时,libvirt会挂起guest虚拟机。主机启动时,libvirt恢复来宾。问题是,例如,如果来宾被暂停并在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

Answers:


11

问题

我遇到了同样的问题,但是找不到很好的解决方案。这是我发现的:

问题在于,恢复后,客户机上的系统时钟和硬件时钟时间不同:

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解析器的问题,来宾代理使主机和来宾容易受到彼此的攻击(至少我相信受影响的代码也在主机上运行,​​我不确定)。无论如何,这是设置方法:

  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"}'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。


3

来宾上的许多虚拟化主机操作都可能导致暂停-恢复。这将对来宾的系统时钟产生负面影响。例如,克隆VM会导致克隆时暂停。之后的访客时钟落后了。要使NTP同步时钟,您需要重新启动客户机,这肯定不是在所有情况下都很好的解决方案。或者,您可以只在来宾中重新启动ntpd,但这也不是最佳选择。理想情况下,需要有一个事件(VM恢复),您可以选择使用该事件对来宾进行这种更正。

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

我决定不每隔15分钟通过crontab设置来宾的硬件时钟为来宾系统时钟,而是在来宾中运行ntpd。来宾的硬件时钟反映了虚拟化主机上的时间,该时间由虚拟化主机上运行的ntpd控制。这为我在来宾操作系统中提供了可靠的时间。最坏的情况是,时钟在关闭来宾后可能会关闭15分钟,然后才同步到正确的时间。

# crontab -e

0,15,30,45 * * * * /sbin/hwclock --hctosys

最好在来宾处有一个事件,该事件将在恢复来宾时启动时间同步,但是显然不可用。crontab方法是一种变通方法,因为它每15分钟进行一次hwclock调用。它完成了工作,但没有我想要的那么优雅。


2

kvm-clock将来宾时间与来宾启动时的主机时间同步。您应该在来宾中使用和ntp客户端,并使用shutdown / startup而不是使用suspend / resume。


是的,我可以确认它在启动时是同步的,因为当我关闭/启动guest虚拟机时,一切都很好。由于许多原因,使用ntp并不是一种解决方案(这是一种解决方法,当时间差很大时,它会感到恐慌,需要访问时间服务器)。我正在寻找一种解决暂停/恢复问题的方法,因为这是libvirt中一个有趣,不错的默认选项。
赫里斯托(Hristo Hristov)

暂停是1)将VM状态迁移到文件,以及2)销毁。从挂起状态恢复时,VM状态将恢复(从文件迁移回VM内存)。此状态将包括当前时间戳。因此,是的,这是默认设置,但是,否,计时仍然很重要,时间必须从某个地方开始,这是NTP应该进入的地方。我怀疑其他时钟源会有所帮助,但是您可以尝试使用acpi_pm。
dyasny 2011年


4
@布莱恩·凯恩(Brian Cain)这是一个非常有争议的观点,尤其是在声明背后没有任何解释或推理的情况下。:提供profflink docs.redhat.com/docs/en-US/...
dyasny

2

2015年以来,libvirt支持来宾时间同步。在Debian拉伸,后来找选项SYNC_TIME/etc/default/libvirt-guests

# If non-zero, try to sync guest time on domain resume. Be aware, that
# this requires guest agent with support for time synchronization
# running in the guest. For instance, qemu-ga doesn't support guest time
# synchronization on Windows guests, but Linux ones. By default, this
# functionality is turned off.
#SYNC_TIME=1

您可以使用以下方法从主机系统中测试时间同步:

virsh qemu-agent-command INSERT_YOUR_DOMAIN_HERE '{"execute":"guest-set-time"}'

该命令应{"return":{}}成功返回。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.