我是否需要在每个 VM 中运行 NTP 服务器?

我是否需要在每个 VM 中运行 NTP 服务器?

客人难道不能以某种方式继承主人的系统时间吗?

在同一台机器上多次运行相同的守护进程以获得相同的结果似乎毫无意义,但我在阅读 KVM 或 Xen 文章时没有发现任何与时间相关的内容。我的理解是,客户机在启动时会获取主机时间,但随后可能会出现偏差。对吗?

答案1

这是正确的。应该注意的是,时间不仅“可以”流逝,而且将要由于定时器中断之间的间隔(操作系统的计时通常以此为基础)根据虚拟机管理程序的需要进行拉长和压缩,因此会发生漂移。

大多数虚拟化平台(Hyper-V 集成服务、VMWare 工具)中常用的解决方法是在客户机上运行守护程序,定期将时钟与 VM 主机同步。正如 Hauke 在对您的问题的评论中指出的那样,KVM 还提供了一个半虚拟化时钟,需要在客户机操作系统上加载相应的驱动程序才能工作。

进一步阅读:

VMWare 虚拟机中的计时(vmware.com)
KVM 客户机时钟同步(s19n.net)

答案2

在理想情况下,您的 VM 客户端会保持完美的时间,或至少与主机提供的时间一样完美。不幸的是,我们并不生活在一个完美的世界中。

根据我对几乎所有已知的虚拟机管理程序的经验,我总是在虚拟机中运行 NTP 客户端,无一例外。我通常的设置是使用 -g 选项的 ntpd,或者在旧系统之前启动 ntpdate,以调整时钟(在系统启动时可能会远远不同步)。

KVM 具有近乎完美的设置,其半虚拟化实时时钟;具有适当驱动程序(至少是所有最新的 Linux)的客户机将与主机一样保持时间。但这里仍然会出现问题:例如,主机可能没有运行 NTP,主机可能设置了错误的时区,主机的时钟可能完全错误,等等。

VMware 和 Hyper-V 处于中间位置。它们都具有一个在客户机上运行的工具,用于定期将时钟与主机同步,但同样,这很容易受到主机时钟现有问题的影响。

我测试的 Hyper-V 服务器上的虚拟机也表现出一些奇怪的行为:即使使用集成服务,虚拟机时钟的漂移速度也会超过 500 ppm,从而导致 ntpd 无法正常工作(如果时钟漂移得比这个快,它就会认为它疯了)我不得不将这些客人换成慢性的, 这使得此值予以调整。

Xen 在这方面表现最差;它完全没有同步在客户机中运行 NTP 是必需的。(我听说最新版本的 Xen 具有某种同步功能,但我个人还没有使用过它。)

如果主机管理程序不受您的控制(例如公共云),情况会变得更糟。在主机时钟方面,您完全受制于提供商,如果他们不努力保持同步,您就会失败。

综上所述,如果您需要一个半精确的时钟,那么在虚拟机中运行 NTP 客户端也是非常必要的。注意:如果您运行的是 Windows 虚拟机,请获取第三方 NTP 客户端,该客户端可以连续调整时钟;Windows 自带的客户端只能调整时钟,这实在是太糟糕了一个星期一次,这实在太荒谬了。

答案3

我建议使用 NTP,因为它广为人知,而且已经存在很长时间了。调整时钟并不是一件容易的事。NTP 解决了这个问题。

VMware 的官方说法是使用一种机制,优先使用 NTP因为它更细粒度,调整时间时采用较小的步长。内部 VMware 解决方案采用较大的步长。当您同时运行两者时,它们可能会相互冲突。内部 VMware 解决方案采用较大的步长,然后 NTP 进行调整并将其向后退一点。

然而实际上我们同时运行这两项操作但我还没有发现任何问题。

$ ntpq   
ntpq> peers
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
something.org  172.2.1.5          2 u   57   64  377    1.597   -2.409   5.952


$  vmware-toolbox-cmd  timesync status
Enabled


$ vmware-toolbox-cmd help timesync
timesync: functions for controlling time synchronization on the guest OS
Usage: vmware-toolbox-cmd timesync <subcommand>

Subcommands:
  enable: enable time synchronization
  disable: disable time synchronization
  status: print the time synchronization status

答案4

我想知道为什么到目前为止的答案中没有提到这个方面:

VM 为您提供虚拟机,与任何其他机器均不相关(这是理论),因此您甚至可以自由地将任何 VM 设置为任意时间。

这可能是某些环境不同步虚拟机时间的原因定期到主机。(有些系统确实在时间来回跳跃方面表现不佳)

另一点是开机时间VM:您实际上并不期望日期是纪元的开始,如 1970 年 1 月 1 日。相反,您希望启动时间“继续”您离开 VM 时的时间(可能需要虚拟 RTC 芯片)。因此,如果您将时钟提前(假设)两个小时,然后重新启动,您实际上并不希望启动时间往回跳两个小时,对吗?然而,并非所有环境都能很好地完成这项工作。

总结一下:

如果您希望所有虚拟机都具有正确的时间,您可以使用 NTP 同步每个虚拟机(并禁用任何其他机制)。优点是 NTP 甚至允许监控同步的时间是否正确。

或者,可以选择同步 VM 主机的时钟,然后使用 VM 环境提供的某些机制将 VM 与主机的时钟同步。

最后评论:

由于 CPU 大量过度使用,任何虚拟机都很难保持正确的时间。假设您的主机有四个 CPU,并且您为四个虚拟机配置了两个 CPU。然后每个虚拟机运行两个进程,全速读取 CPU 的周期计数器 (TSC)。它们应该看到哪些值,虚拟机主机如何帮助它们做到这一点?

相关内容