正在读此文:在虚拟机中运行 NTP 服务器有哪些限制?(2010)
和这个:https://github.com/geerlingguy/ansible-role-ntp
我不确定我到底在安装什么。特别是如果我在虚拟机内安装的话。
我读到虚拟机可以从主机系统同步时钟...但我以前从未听说过,也不知道在哪里可以找到相关配置。我个人的经验仅限于 VirtualBox。
如果我在虚拟机服务器(比如说 Ubuntu 服务器)上安装 NTP,据我所知,我只安装了一个能够与外部 NTP 服务器同步的工具,以防止其时间漂移太大。
就是这种情况吗,还是还有其他情况?我是否安装了 NTP 服务器,然后...没有人同步?因为所有虚拟机都会安装它,并且不会配置任何虚拟机来查看特定服务器。
如果我想要的是:
- 设置时区
- 设置好一切,使时间漂移最小化
- 在虚拟机或物理机上
我需要知道什么?我需要做什么?
因为过去我只是在 VirtualBox/ 中运行的虚拟机上安装了 NTP普罗克斯莫克斯/VMware多年来一直运行良好。我记得我曾多次检查各种虚拟机上的时间,但从未遇到过虚拟机上显示的时间与本地时钟不符的情况。
答案1
简短回答:通常,如果您要安装 NTP 守护程序,则安装的功能既可以同步本地时钟,也可以通过网络向客户端提供时间。但是,这其中有一些微妙之处,您还问了其他一些问题,我也会尝试回答。
(以下信息假设 VM 客户机基于 Linux;相同的建议可能不适用于 Windows 客户机。)
- 首先,你链接的问题和所有答案都是完全错误今天。这个问题是 13 年前提出的,最近的答案是 10 年前的。根据我的回答这里,现代虚拟机解决方案在此期间已大大提高了其功能,并且虚拟机通常是完全可接受的 NTP 客户端和服务器,在普通硬件上可实现低于 1 毫秒的精度。(我的建议是反对该问题以及所有表示虚拟机中的时间同步不起作用的答案,但不幸的是,这可能不会阻止它出现在搜索结果中。我可能会在完成此处的工作后为该问题写一个新的答案。)如果您想了解有关虚拟机中时间同步中断的更多神话,请查看我的博客文章。
- VM 确实可以通过特定于虚拟机管理程序的机制将其时钟与主机系统同步,这最初是因为 VM 中的时间同步较差而提供的。但是,它不再是必要的,并且通常比使用 NTP 获得的结果更差。在 VMware 和 Hyper-V 上,应关闭此功能;我认为 KVM 和 Xen 上不提供此功能(至少默认情况下不提供);我不确定 VirtualBox 是否提供此功能。
- 如果您在 VM 服务器(假设提供 KVM 虚拟机管理程序的 Ubuntu 服务器)上安装 NTP,则您会将该服务器的时钟与外部源同步(前提是这些源可访问)。您应该至少包含 4 个远程源(如果您安装了
chrony
或 则默认为 4 个ntp
),并且通过安装其中一个软件包,您可以通过不断校正这些外部源来保持该主机的系统时间规范。 - 您的虚拟机将使用其主机的系统时间作为其系统时间的种子,但由于它们运行自己独立的内核,因此它们也有自己独立的(虚拟化)系统时钟,这也必须受到约束。
- 时区完全独立于您的时间同步服务。内核和 NTP 使用 UTC;时区是用户空间问题。
- 默认情况下,Ubuntu 不使用 或
chrony
,ntp
而是使用systemd-timesyncd
,它只是一个 SNTP 客户端,不能作为 NTP 服务器。默认情况下,它chrony
会忽略所有网络请求,因此只能充当 NTP 客户端,但可以使用简短指令将其配置为服务器(见下文)。 的默认配置ntp
略有不同,它允许远程客户端通过网络同步时间,但不允许查询任何服务器详细信息。
综上所述,对于独立的虚拟机服务器及其上运行的虚拟机来说,合理的设置可能是让它们都使用NTP 池单独地,并让虚拟机使用主机作为额外的时间源。如果主机很好地跟踪池源,那么大多数客户端可能大部分时间都会与服务器同步(因为到达它的网络延迟很低),但会将池服务器作为主机 NTP 服务的质量检查。
假设是 Ubuntu 和 chrony,服务器的配置可以从默认开始:
# Default chrony.conf on Ubuntu, sans comments and blank lines
confdir /etc/chrony/conf.d
pool ntp.ubuntu.com iburst maxsources 4
pool 0.ubuntu.pool.ntp.org iburst maxsources 1
pool 1.ubuntu.pool.ntp.org iburst maxsources 1
pool 2.ubuntu.pool.ntp.org iburst maxsources 2
sourcedir /run/chrony-dhcp
sourcedir /etc/chrony/sources.d
keyfile /etc/chrony/chrony.keys
driftfile /var/lib/chrony/chrony.drift
ntsdumpdir /var/lib/chrony
logdir /var/log/chrony
maxupdateskew 100.0
rtcsync
makestep 1 3
leapsectz right/UTC
然后添加以下行以允许来自本地子网的访客,假设它使用192.0.2.0/24
和2001:db8:0:2::/64
作为其 IPv4 和 IPv6 地址:
allow 192.0.2.0/24
allow 2001:db8:0:2::/64
类似地,虚拟机将以相同的默认配置启动,并添加此行以将服务器作为源,假设服务器可以通过 DNS 解析为vmhost.local
:
server vmhost.local iburst
或者,如果您在本地 DHCP 服务器中提供 NTP 服务器,则使用 chrony 的虚拟机应该会在默认配置下自动选择该服务器。