我在 Hyper-V 主机和客户端上设置 NTP 时遇到问题。我没有使用域控制器(几乎所有建议都是针对我没有使用的 DC 给出的)。
在所有服务器上,我都使用 Windows 时钟来设置 ntp 客户端名称(右键单击,调整日期/时间、Internet 时间、更改设置,输入 NTP 服务器名称)。
这似乎不起作用。或者说,每天晚上到星期一凌晨 1 点,时间都会被强制调整(导致各种问题,例如数据库备份损坏)。
我已经弄乱了 w32tm(读取状态、配置,尝试取消注册并重新注册)。我终于让 w32tm /query /config 确认它使用了 ntp 服务器:
我曾让 w32tm /query /source 说这样的话:
本地 CMOS 时钟 time.windows.com,0x9(实际上是不同的主机,但与本报告无关)自由运行的系统时钟 VM IC 时间同步提供程序(仅适用于 Hyper-V 客户端)
我最终让 w32tm 报告“time.windows.com,0x9”,但后来它自动更改为“自由运行的系统时钟”。我不知道为什么。我认为自由运行不是我想要的。
我想我完全搞不懂 Hyper-V 主机和客户端上的时间设置,真的需要一些帮助。我找到了一些指南,但它们相互矛盾(或者只是谈论域控制器设置)。
Hyper-V 客户端上的 w32tm 对配置有如下说明:
C:\Windows\system32>w32tm /query /configuration
[Configuration]
EventLogFlags: 2 (Local)
AnnounceFlags: 10 (Local)
TimeJumpAuditOffset: 28800 (Local)
MinPollInterval: 10 (Local)
MaxPollInterval: 15 (Local)
MaxNegPhaseCorrection: 54000 (Local)
MaxPosPhaseCorrection: 54000 (Local)
MaxAllowedPhaseOffset: 1 (Local)
FrequencyCorrectRate: 4 (Local)
PollAdjustFactor: 5 (Local)
LargePhaseOffset: 50000000 (Local)
SpikeWatchPeriod: 900 (Local)
LocalClockDispersion: 10 (Local)
HoldPeriod: 5 (Local)
PhaseCorrectRate: 1 (Local)
UpdateInterval: 360000 (Local)
[TimeProviders]
NtpClient (Local)
DllName: C:\Windows\system32\w32time.DLL (Local)
Enabled: 1 (Local)
InputProvider: 1 (Local)
AllowNonstandardModeCombinations: 1 (Local)
ResolvePeerBackoffMinutes: 15 (Local)
ResolvePeerBackoffMaxTimes: 7 (Local)
CompatibilityFlags: 2147483648 (Local)
EventLogFlags: 1 (Local)
LargeSampleSkew: 3 (Local)
SpecialPollInterval: 604800 (Local)
Type: NTP (Local)
NtpServer: time.windows.com,0x9 (Local)
VMICTimeProvider (Local)
DllName: C:\Windows\System32\vmictimeprovider.dll (Local)
Enabled: 1 (Local)
InputProvider: 1 (Local)
NtpServer (Local)
DllName: C:\Windows\system32\w32time.DLL (Local)
Enabled: 0 (Local)
InputProvider: 0 (Local)
上述配置导致“自由运行的系统时钟”,我觉得这至少很奇怪。
Windows 时间和 Hyper-V 时间同步服务均正在运行。
目前没有针对时间服务的组策略生效。
关于如何解决此问题有什么建议?
答案1
这是我最终做的事情,也是我认为正确的做法:
Hyper-V 主机(物理服务器)设置为与所选时间服务器同步,每个 Hyper-V 客户机设置为仅与主机同步。以下更改与默认设置不同。
主机设置
首先使用以下命令停止时间服务:
net stop w32time
注册表更改(基础HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\
):
w32time\Config\AnnounceFlags
=10
w32time\Parameters\NtpServers
=0.dk.pool.ntp.org,0x1 1.dk.pool.ntp.org,0x1 2.dk.pool.ntp.org,0x1 3.dk.pool.ntp.org,0x1
w32time\TimeProviders\NtpClient\SpecialPollInterval
=900
(15分钟)w32time\TimeProviders\NtpServer\Enabled
=1
有些使用 AnnounceFlags=5,但与域控制器的关联(在这种情况下未设置)导致 ntp 服务器不宣布自己(观察;不是事实),因此 AnnounceFlags 设置为 10(有关 AnnounceFlags 的更多信息)
ntpservers 上的 0x1 = 使用特殊轮询间隔(而不是标准 ntp 轮询间隔)。(有关 0x1、0x2、0x4 和 0x8 的更多信息)。使用 SpecialPollInterval 不是必需的,但似乎建议这样做(可能主要是针对客人,而对主人则不太推荐)。如果您决定不使用 SpecialPollInterval,则必须限制 MinPollInterval 和 MaxPollInterval。它们的默认值为 10(1024 秒)和 15(32768 秒);我建议改为使用 6(64 秒)和 10(1024 秒)。
确保服务器有网络连接时启动时间服务:
sc triggerinfo w32time start/networkon stop/networkoff
默认设置是使用域控制器(此设置中不存在)启动(和停止)时间服务。如果忘记此步骤,每次启动时都会停止时间服务器(在自动启动后不久)。这个问题很难追踪。
并再次启动服务:
net start w32time
现在主机将每 15 分钟轮询一次 ntp 时间服务器,并充当其他客户端的 ntp 服务器。我已对 udp:123 加设防火墙,以确保仅允许访客进入。
服务器可能需要最多 15 分钟(SpecialPollInterval)才能向全世界(来宾)宣布其作为可靠时间服务器的功能。这意味着来宾可以在服务启动后自由运行 15-20 分钟。
来宾设置
客户机的漂移 (远) 大于主机 (彼此之间也存在差异),并且需要相对较短的轮询间隔。因此,使用远程 ntp 服务器并不理想,而且由于我们手头有一个可靠的 ntp 服务器 (刚刚配置),我们将使用它 (并且只使用它)。所有客户机都可以使用虚拟网络访问主机。
确保 Hyper-V 时间集成服务已安装并正在运行。使用此设置,它将在虚拟服务器启动时使用,也将在从保存恢复时使用。它不会用作时间源。
使用以下命令停止时间服务:
net stop w32time
进行必要的注册表更改(基础HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\
):
w32time\Config\AnnounceFlags
=10
w32time\Parameters\NtpServers
=192.168.0.100,0x9
w32time\TimeProviders\NtpClient\SpecialPollInterval
=300
(5分钟)w32time\TimeProviders\NtpServer\Enabled
=0
w32time\TimeProviders\VMICTimeProvider\Enabled
=0
确保服务器有网络连接时启动时间服务:
sc triggerinfo w32time start/networkon stop/networkoff
并再次启动服务:
net start w32time
结论
通过这种设置,主人和客人都可以很好地控制时间。
答案2
对于 hyper-v 客户机,您有两个选项 - 启用时间同步并同步到主机(反过来可以同步到 ntp 服务器),或者让每个客户机直接同步到 NTP。
要与主机同步,请转到 Hyper-V 管理器,在集成服务下,确保已选中时间同步。确保已安装来宾集成服务(此时可以删除并重新安装它们),并且重置 w32time
Microsoft 不建议关闭时间同步,但它可能会导致您的问题,所以我建议尝试一下。转到 Hyper-V 管理器并关闭时间同步。然后像配置任何独立物理主机一样配置 w32time。同样,在所有这些麻烦之后,最好先重置 w32time。
微软博客对 Hyper-V 中时间同步的工作原理进行了很好的描述。如果你还没有读过,我建议你读一读