强制 systemd timesyncd 立即与 NTP 服务器同步时间

man*_*tor 24 ntp systemd systemd-timesyncd

我已将 systemd timesyncd 配置为从 NTP 服务器获取时间:

/etc/systemd/timesyncd.conf > NTP=ca.pool.ntp.org
systemctl restart systemd-timesyncd.service 
timedatectl set-ntp true
Run Code Online (Sandbox Code Playgroud)

状态如下:

$ timedatectl status
...
Network time on: yes
NTP synchronized: no
Run Code Online (Sandbox Code Playgroud)

正如输出所暗示的那样,时间尚未同步。有人可以帮我解决以下问题吗?

  • timesyncd 与 NTP 同步需要多长时间?它以什么时间间隔执行此操作,我可以在哪里检查和更改它们?
  • 在紧急情况下:我可以只手动设置时间还是可以强制 timesyncd 立即与 NTP 服务器同步?

Joh*_*Mee 20

无需安装更多软件包...关闭 NTP,手动将时间设置为足够接近,然后重新打开 NTP:

将 NTP 服务设置为非活动状态

$ timedatectl set-ntp false
Run Code Online (Sandbox Code Playgroud)

手动设置时间

从挂钟、手机、互联网获取大致的本地时间。它不需要完美,因为我们稍后会重新打开 ntp...

$ sudo timedatectl set-time "2019-06-22 13:41:00"
Run Code Online (Sandbox Code Playgroud)

设置 NTP 服务处于活动状态

$ sudo timedatectl set-ntp true
Run Code Online (Sandbox Code Playgroud)

等待。

等待几分钟。如果timedatectl中的响应没有改变,那么您有网络问题。

john@mybox:~$ timedatectl
               Local time: Sat 2019-06-22 13:49:53 AEST
           Universal time: Sat 2019-06-22 03:49:53 UTC
                 RTC time: Sat 2019-06-22 03:49:54
                Time zone: Australia/Sydney (AEST, +1000)
System clock synchronized: no
              NTP service: active
          RTC in local TZ: no
Run Code Online (Sandbox Code Playgroud)

当“系统时钟同步:否”已调整到足以被视为“同步”时,它将变为“是”。就像是:

john@mybox:~$ timedatectl 
               Local time: Wed 2020-07-22 09:50:32 AEST  
           Universal time: Tue 2020-07-21 23:50:32 UTC   
                 RTC time: Tue 2020-07-21 23:50:32       
                Time zone: Australia/Sydney (AEST, +1000)
System clock synchronized: yes                           
              NTP service: active                        
          RTC in local TZ: no  
Run Code Online (Sandbox Code Playgroud)

john@mybox:~$ timedatectl timesync-status
       Server: 91.189.91.157 (ntp.ubuntu.com)  
Poll interval: 1min 4s (min: 32s; max 34min 8s)
         Leap: normal                          
      Version: 4                               
      Stratum: 2                               
    Reference: 8CCBCC4D                        
    Precision: 1us (-24)                       
Root distance: 64.781ms (max: 5s)              
       Offset: -88.040ms                       
        Delay: 754.084ms                       
       Jitter: 78.200ms                        
  Packet count: 8                               
     Frequency: -187.812ppm  
Run Code Online (Sandbox Code Playgroud)

故障排除

$ cat /etc/systemd/timesyncd.conf
[Time]
NTP=pool.ntp.org

$ timedatectl timesync-status
       Server: 13.210.208.89 (au.pool.ntp.org)
Poll interval: 8min 32s (min: 32s; max 34min 8s)
 Packet count: 0

$ grep systemd-timesyncd /var/log/syslog | tail
Jun 22 14:13:09 meebox systemd-timesyncd[8333]: Timed out waiting for reply from 103.214.220.220:123 (au.pool.ntp.org).
Run Code Online (Sandbox Code Playgroud)

我的 ntp 数据包被公司防火墙阻止。


Joh*_*ald 16

要使用实际的 NTP 实现,您需要安装和配置一个,chrony或者可能是ntpd. 如果您需要对时间性能进行任何监控,请执行此操作。我会假设chrony。

添加iburst到您的poolserver 配置中的行以加速最初的几个数据包。可能还需要几分钟才能稳定下来,请耐心等待。

chronyc tracking将显示当前偏移量。了解您的要求是什么,一秒精度可以轻松容忍数十毫秒的偏移。

chronyc makestep将立即进行当前调整。通常不需要。


timesyncd是一个SNTP客户端,可以设置时间,但不会逐渐和连续地对其进行训练,也不会根据质量过滤远程NTP服务器。(它也不能与时间硬件或 PTP 对话,只能与 NTP 协议对话。)比重复好一点ntpdate,我的意思是不是很好的时钟。就个人而言,我在大多数服务器上都替换了它。

关于使用 timesyncd 设置时间的唯一方法是手动:timedatectl set-time "2019-01-15 00:40:16". 它没有强大的方法来规范和监控时钟。通过基本 NTP 统计数据timedatectl timesync-status是一个相对较新的东西,我认为 Red Hat 7 或 Ubuntu 18.04 中没有该选项。

systemd 将“同步”定义为是否曾使用 NTP 告诉 Linux 调整时钟。具体来说,如果内核纪律调用 adjtimex() 没有错误返回,而不是初始状态。查看源代码,systemd/src/basic/time-util.c。

  • 谢谢你的回答,约翰。那么实际上我可以禁用 systemd-timesyncd 并仅使用 chrony 吗?我不太确定我是否理解为什么 systemd 有一个 NTP 选项,并且如果它实际上无法同步时间,则称为 timeSYNCd ?“systemd 将“同步”定义为 NTP 内核规则调用 adjtimex() 无错误返回,而不是初始状态”——这对我来说不是很清楚。 (2认同)
  • @chevallier systemd-timesyncd 非常简单,对于最常见的情况来说已经足够了,例如具有实时时钟的服务器,该服务器预计会在网络上 24x7 全天候运行。您的情况并不常见,因此您可能不应该使用它。chrony 在处理网络连接中断和长时间关闭(例如笔记本电脑)或根本没有 RTC(例如嵌入式设备)方面要好得多。 (2认同)