我有两台 16.04 服务器。timedatectl
两台机器上都显示网络时间已开启,NTP 已同步。两台机器都使用 UTC。然后我使用命令将日期设置为下个月的随机日期date
。
在第一台服务器上,后续调用date
显示时间更改确实已生效。timedatectl
还显示新日期。网络时间仍然开启,但 NTP 已同步 = 否。
在第二台服务器上,后续调用date
不会显示新时间,也不会显示timedatectl
。网络时间仍然打开,NTP 也同步。
这是怎么回事?应该怎么回事?
我在两台机器上都做了一个实验,ps -la | grep ntp
看看是否有其他东西在管理时间,但是什么也没有出现。
接受新日期且不重新同步的机器正在虚拟盒中运行,但我安装了客户机附加组件,因此我认为它将与 NTP 同步兼容。我不确定另一台机器的详细信息 - 它是一台 Laravel Forge 机器。
答案1
你问了很多好问题,我会尽力回答,但我也建议你读一下这篇文章unix.stackexchange linux 上及时问答。它应该为您提供比您提出的具体问题更深入的背景信息。
一些背景信息
timedatectl
是一个与之交互的程序systemd-timesyncd
,它是由systemd
。运行man timedatectl
以获取程序的易读描述。例如,Network time on: yes
仅表示systemd-timesyncd
服务已启用。就是这样。
这也解释了为什么你看不到ps faux |grep ntp
任何返回内容。内置的 ntp 客户端称为systemd-timesyncd
。
date
是一个查询和操作系统日期和时间的程序。这是您的操作系统认为的当前时间。如果您使用参数运行此程序-s
,它将允许您调整系统时间
关于您的样品机
机器-1您说的是一台运行 virtualbox 的机器。这样您就可以正常设置系统时钟(如果您愿意,甚至可以设置虚拟硬件时钟)。
您所描述的听起来很正常,您已将时钟偏差了一天,ntp 客户端将无法再正确同步。这就是该ntpdate
命令在 ubuntu 中存在很长时间的原因,它是一次性命令,用于使时钟对齐,并将其交给 ntp 客户端。 systemd-timesyncd
现在已内置此功能,但它仅在启动时运行,而不是一直运行。
机器-2你说的是Laravel Forge 教程机器。我不确定那具体是什么。如果你运行sudo date -s '2018-04-18 12:00:00'
,它允许你这样做吗?它说了什么?可能是你没有能力更改该服务器上的系统时钟。例如,它可能是某种容器(docker、lxd)。
答案2
在第二台服务器上(我无法更改日期),发布sudo timedatectl set-ntp off
解决了该问题。稍后,当我想重新同步时间时,我会发布sudo timedatectl set-ntp on
并等待片刻。这很有意义。