我的 Ubuntu 16.04 上的 RTC 时间变得很乱。几分钟后,RTC 时间就完全不对了。
奇怪的是,如果我禁用 NTP 服务(timedatectl set-ntp false 和 service ntp stop)并修复一次时间(hwclock -w),RTC 时间始终是正确的。本地时间(真正正确的时间)始终是正确的。
我的配置:
- 具有 Hyper-V(Windows Server 2012 R2)的根服务器具有正确的 ntp 时间。
- Hyper-V VM 设置中的时间同步已禁用。(否则,我每 5 秒就会在 /var/log/syslog 上收到此“时间已更改”消息)
- 访客:Ubuntu 16.04
没有 NTP 服务:
timedatectl
Local time: Fri 2017-03-03 12:07:35 CET
Universal time: Fri 2017-03-03 11:07:35 UTC
RTC time: Fri 2017-03-03 11:07:35
Time zone: Europe/Berlin (CET, +0100)
Network time on: no
NTP synchronized: no
RTC in local TZ: no
使用 NTP 服务(service ntp start):
timedatectl
Local time: Fri 2017-03-03 12:09:15 CET
Universal time: Fri 2017-03-03 11:09:15 UTC
RTC time: Fri 2017-03-03 11:09:29
Time zone: Europe/Berlin (CET, +0100)
Network time on: no
NTP synchronized: yes
RTC in local TZ: no
及更高版本(启用 NTP):
timedatectl
Local time: Fri 2017-03-03 13:12:28 CET
Universal time: Fri 2017-03-03 12:12:28 UTC
RTC time: Fri 2017-03-03 12:52:58
Time zone: Europe/Berlin (CET, +0100)
Network time on: no
NTP synchronized: yes
RTC in local TZ: no
甚至更晚(启用 NTP):
timedatectl
Local time: Fri 2017-03-03 13:42:16 CET
Universal time: Fri 2017-03-03 12:42:16 UTC
RTC time: Fri 2017-03-03 12:51:46
Time zone: Europe/Berlin (CET, +0100)
Network time on: no
NTP synchronized: yes
RTC in local TZ: no
如果我使用“timedatectl set-ntp true”而不是 ntpd,也会发生同样的事情。这只发生在 Hyper-V 上。我在 esxi 上的 Ubuntu 16.04 没有这个问题。为什么 NTP 服务会更改 RTC 时间时钟?我该如何修复它?
主要问题是,RTC 时间在启动时使用,启动后时间倒退。如果发生时间跳跃,某些服务就会出现问题,无法正常工作。
答案1
你可以尝试PTP 计时:
[...] 为了解决这个问题,Linux-4.11 中引入了一个解决方案:用于 KVM 和 Hyper-V 的 PTP 设备。这些设备实际上与 PTP 时间同步协议无关,并且不与网络设备配合使用,但它们将自己显示为 PTP (/dev/ptp*) 设备,因此它们可被现有的时间同步软件使用。[...]
答案2
问题在于,Linux 假定 RTC 存储 UTC 时间,然后根据操作系统内设置的时区进行调整,而 Windows(包括 Hyper-V)假定 RTC 存储本地时间,而本地时间几乎总是与 UTC+0 不同。默认情况下,Microsoft Hyper-V 为所有新创建的虚拟机启用了“将客户机时间与主机同步”虚拟机管理程序服务标志。这与在客户机内运行 NTP 相结合,产生了 NTP 认为 RTC 相差几个小时的情况,并尝试通过不仅将时钟设置为正确值(在客户机中)而且还调整时钟速度来修复该问题,因为它假定 RTC 自行向前或向后移动,没有任何外部影响。正确的解决方案是完全禁用客户机时间同步,并让 NTP 在客户机内运行以定期修复任何本地时钟差异。