时间同步

在配置集群等服务时,需要保持多台主机的时间统一。

本文不涉及配置 NTP 服务器对外服务,而是如何配置 NTP 客户端。

对于简单的时间同步, systemd 自带的 NTP 客户端就足以满足要求,但如果有多一点的需求 ( 例如你需要连接一个硬件来提供时钟 ) ,则需要安装 ntpd 服务。

systemd-timesyncd

当系统安装后,只要安装时网络畅通,则 Debian 会自动配置 systemd-timesyncd 并与 Debian 的官方时间服务器同步。

要增加 NTP 服务器,则需要修改 /etc/systemd/timesyncd.conf

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See timesyncd.conf(5) for details.

[Time]
#NTP=
#FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

添加服务器需要取消 NTP= 这一行的注释,并填入 NTP 服务器地址。

例如:

NTP=pool.ntp.org 0.asia.pool.ntp.org 1.asia.pool.ntp.org 2.asia.pool.ntp.org

多服务器间用空格分割。

保存更改后,重启 systemd-timesyncd 服务

$ systemctl restart systemd-timesyncd

之后验证配置

使用 timedatectl show-timesync --all

root@debian:~# timedatectl show-timesync --all
LinkNTPServers=
SystemNTPServers=0.asia.pool.ntp.org 1.asia.pool.ntp.org
FallbackNTPServers=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org
ServerName=0.asia.pool.ntp.org
ServerAddress=139.59.15.185
RootDistanceMaxUSec=5s
PollIntervalMinUSec=32s
PollIntervalMaxUSec=34min 8s
PollIntervalUSec=1min 4s
NTPMessage={ Leap=0, Version=4, Mode=4, Stratum=4, Precision=-24, RootDelay=86.166ms, RootDispersion=14.190ms, Reference=A29FC801, OriginateTimestamp=Tue 2020-12-22 19:34:01 CST, ReceiveTimestamp=Tue 2020-12-22 19:34:02 CST, TransmitTimestamp=Tue 2020-12-22 19:34:02 CST, DestinationTimestamp=Tue 2020-12-22 19:34:02 CST, Ignored=no PacketCount=1, Jitter=0 }
Frequency=7623778

NTP 服务器选择顺序如下:

  • systemd-networkd.service(8) 中针对每个接口的配置,或者 DHCP 服务优先。

  • /etc/systemd/timesyncd.conf 中定义的 NTP服务器会在运行时被添加到针对每个接口的服务器列表中,守护进程会轮流连接这些服务器直到某个有应答。

  • 如果上两步没有取到 NTP 服务器, 那么就是用 FallbackNTP= 中定义的服务器。

要启用并运行:

$ timedatectl set-ntp true

同步需要一点时间,可能会卡住。

查看状态使用:

$ timedatectl timesync-status

ntpd

如果需要更多的特性,或需要同时部署 NTP 服务器,则需要安装 ntpd 软件包。

ntpd 与 系统自带的 systemd-timesyncd 有冲突,需要停止自带服务。

作为客户端接收时间

systemd 自带的 timedatectl 只能控制系统自带的 systemd-timesyncd,使用 timedatectl set-ntp true 会停止 ntpd 服务。

$ timedatectl set-ntp false

安装 ntpd 服务

$ apt-get install ntp

修改配置文件 /etc/ntp.conf

在 23 行处可修改原始服务器地址为所需的服务器地址:

# pool.ntp.org maps to about 1000 low-stratum NTP servers.  Your server will
# pick a different set every time it starts up.  Please consider joining the
# pool: <http://www.pool.ntp.org/join.html>
pool 0.debian.pool.ntp.org iburst
pool 1.debian.pool.ntp.org iburst
pool 2.debian.pool.ntp.org iburst
pool 3.debian.pool.ntp.org iburst

例如修改为:

server ntp1.aliyun.com
server ntp2.aliyun.com

重启服务生效:

$ systemctl restart ntpd

使用 ntpq -p 查看同步状态

root@debian:~# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 0.debian.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.000
 1.debian.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.000
 2.debian.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.000
 3.debian.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.000
-tick.ntp.infoma .GPS.            1 u  146  128  176  225.512  -11.584   0.508
+203.107.6.88    100.107.25.114   2 u   12   64  377   29.612   -9.788   0.910
+119.28.183.184  100.122.36.196   2 u   17   64  337   66.883   -8.777   1.218
*202.118.1.130   .PTP.            1 u   77   64  376   44.633    9.074   0.494
-119.28.206.193  100.122.36.4     2 u   73  128  277   69.470   -8.139   5.240

delay, offset 和 jitter 不应该为零,ntpd 同步的服务器前有星号,ntpd 可能等待几分钟后才会进行同步

作为服务器下发时间

对 ntpd 进行服务器配置需要对配置文件进行修改

在 33-55 行带有配置示例:

# By default, exchange time with everybody, but don't allow configuration.
restrict -4 default kod notrap nomodify nopeer noquery limited
restrict -6 default kod notrap nomodify nopeer noquery limited

# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1

# Needed for adding pool entries
restrict source notrap nomodify noquery

# Clients from this (example!) subnet have unlimited access, but only if
# cryptographically authenticated.
#restrict 192.168.123.0 mask 255.255.255.0 notrust


# If you want to provide time to your local subnet, change the next line.
# (Again, the address is an example only.)
#broadcast 192.168.123.255

为确保失去网络也能提供同步服务,需要增加一个本地时间作为时间源:

server 127.0.0.1
fudge 127.0.0.1 stratum 10

接下来新增策略,允许局域网内的主机与本机同步时间,例如本例中我的局域网 IP 为 192.168.50.0/24,则可以写为

restrict 192.168.50.0 mask 255.255.255.0 nomodify

此处的 nomodify 意为不允许客户端使用 ntpqntpdc 修改服务器配置。

所有的选项可以通过 ntp.conf(5) 查看。

重启服务后通过 ss -nutlp | grep ntp 查看服务是否正常监听

root@debian:~# vim /etc/ntp.conf
root@debian:~# systemctl restart ntp
root@debian:~# ss -nutlp | grep ntp
udp   UNCONN 0      0                        192.168.50.157:123         0.0.0.0:*                        users:(("ntpd",pid=3783,fd=19))
udp   UNCONN 0      0                             127.0.0.1:123         0.0.0.0:*                        users:(("ntpd",pid=3783,fd=18))
udp   UNCONN 0      0                               0.0.0.0:123         0.0.0.0:*                        users:(("ntpd",pid=3783,fd=17))
udp   UNCONN 0      0      [fe80::20c:29ff:fe70:453]%ens192:123            [::]:*                        users:(("ntpd",pid=3783,fd=21))
udp   UNCONN 0      0                                 [::1]:123            [::]:*                        users:(("ntpd",pid=3783,fd=20))
udp   UNCONN 0      0                                  [::]:123            [::]:*                        users:(("ntpd",pid=3783,fd=16))

如果具有 123 端口上的 udp 报文监听则说明服务正常运行。

接下来使用另一台客户机与此主机进行同步测试。这台主机为另一台服务器,运行 Ubuntu 20.04 LTS

panxiao81@homelinux:~$ sudo vim /etc/systemd/timesyncd.conf
[sudo] password for panxiao81:
panxiao81@homelinux:~$ systemctl restart systemd-timesyncd
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to restart 'systemd-timesyncd.service'.
Authenticating as: panxiao81
Password:
==== AUTHENTICATION COMPLETE ===
panxiao81@homelinux:~$ timedatectl timesync-status
       Server: 192.168.50.157 (192.168.50.157)
Poll interval: 2min 8s (min: 32s; max 34min 8s)
         Leap: normal
      Version: 4
      Stratum: 2
    Reference: CA760182
    Precision: 1us (-24)
Root distance: 30.112ms (max: 5s)
       Offset: +5.737ms
        Delay: 218us
       Jitter: 2.168ms
 Packet count: 2
    Frequency: +224.757ppm

也可使用 chrony 使用和提供 NTP 服务,此处不再赘述,RHEL 8 中的软件源现在默认自带 chrony 配置与 ntpd 大同小异。

chrony

作为服务器

chrony 配置对比 ntpd 更为简单

对于 Debian,配置文件存放在 /etc/chrony/chrony.conf

仅需要简单的使用 allow 即可

allow 10.10.100.0/24

如果再简单一点,允许所有主机与其同步时间,只要

allow all

需要使用本地时间的场合,也只需要简单的加一句 local 即可

local stratum 10

客户端

正常在配置文件里写入 server pool.ntp.org iburst

查看当前时间服务器使用 chronyc sources

正常情况下 Chrony 会步进同步时钟,其与 NTPd 的工作方式很不相同,并没有一个真正意义上与 ntpdate 作用类似的强制同步方式

但如果需要的话,使用 chronyc -a makestep

如果 chronyd 没有运行,正如 ntpdate 使用的那种情况,则可以使用 chronyd -q 'server pool.ntp.org iburst' 手工同步时间。

参考资料:[ArchWiki:Network Time Protocol daemon (简体中文)](https://wiki.archlinux.org/index.php/Network_Time_Protocol_daemon_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87))

Red Hat Documentation:CONFIGURING NTP USING THE CHRONY SUITE

最后更新于