如何使用 libvirt 在恢复的 KVM 来宾上保持时间?

Hri*_*tov 20 virtualization time-synchronization libvirt kvm-virtualization

在我的主机上,我使用 libvirt 和 KVM 来宾。当主机关闭时,libvirt 挂起来宾。当主机启动时,libvirt 恢复来宾。问题是,如果访客暂停并在 24 小时后恢复,那么访客时间是过去的 24 小时。

我认为问题可能出在时钟源上,但它已经设置为“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
Run Code Online (Sandbox Code Playgroud)

小智 14

问题

我有同样的问题,我还没有找到好的解决方案。这是我发现的:

问题是恢复后,guest上的系统和硬件时钟时间不同:

root@guest:~# date; hwclock
Sat Oct 11 13:09:38 UTC 2014
Sat Oct 11 13:10:42 2014  -0.454380 seconds
Run Code Online (Sandbox Code Playgroud)

在主持人身上,他们同意:

root@four:~# date; hwclock
Sat Oct 11 13:11:35 UTC 2014
Sat Oct 11 13:11:36 2014  -1.000372 seconds
Run Code Online (Sandbox Code Playgroud)

解决方案是hwclock --hctosys在来宾恢复后运行。但是,我还没有找到仅在来宾系统上进行更改的方法,因为来宾没有注意到它已暂停和恢复。

QEmu 访客代理

有可能在来宾上运行称为QEmu 来宾代理的软件,并从主机通知来从来宾硬件时钟更新来宾系统时钟。但是,该页面提到由于 JSON 解析器的问题,来宾代理使主机和来宾容易受到彼此的攻击(至少我相信受影响的代码也在主机上运行,​​我不确定) )。无论如何,这是设置方法:

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

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

  3. 通过挂起、等待和恢复触发时钟偏移。然后在主机上运行以下命令来更正它:virsh qemu-agent-command backup '{"execute":"guest-set-time"}'The wiki page that using virsh qemu-agent-commandis unsupported,但我还没有找到任何其他命令来完成这项工作。

我发现了两个关于在 libvirt 中自动化调用guest-set-timeon resume from 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。


dya*_*sny 2

kvm-clock 在来宾启动时将来宾时间与主机时间同步。您应该在来宾中使用 ntp 客户端,并关闭/启动而不是使用挂起/恢复。

  • @Brian Cain,这是很有争议的,尤其是在声明背后没有任何解释或推理的情况下。提供 profflink:http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Virtualization_for_Servers/2.2/html/Administration_Guide/chap-Virtualization-KVM_guest_timing_management.html (4认同)