在 Ubuntu 上使用 Chrony 提供 NTP 时间服务

在 Ubuntu 上使用 Chrony 提供 NTP 时间服务

从 Ubuntu 25.10 开始,系统默认安装 chrony,作为客户端保持时间同步。如果还要向其他设备提供 NTP 时间信息,就需要配置 NTP 服务器。

可选方案包括 chrony、现已弃用的 ntpd 和 open-ntp。Ubuntu 文档推荐使用 chrony。

NTP 守护进程 chronyd 会计算系统时钟的漂移和偏移,并持续调整时钟,避免大幅校正造成日志时间不一致等问题。它会消耗少量处理能力和内存,但对现代服务器而言通常可以忽略不计。

安装 chronyd

在终端中运行:

sudo apt install chrony

安装后会得到两个可执行程序:

  • chronyd:实际执行时间同步并通过网络时间协议提供服务的守护进程。
  • chronyc:与 chrony 守护进程交互的命令行界面。

启用网络时间协议服务

安装 chrony 后,可以配置下文介绍的专用硬件来同步本机时间。默认安装采取安全、保守的配置,服务于本机同步;要向其他设备提供 NTP 服务,还需要修改配置。

至少需要设置 allow 规则,指定允许 chrony 为哪些客户端或网络提供 NTP 服务。例如:

allow 1.2.3.4

更多访问控制和限制方法,请参阅 chrony.conf(5) 手册的“NTP server”部分。

查看 chrony 状态

使用 chronyc 可以查询守护进程状态。例如,运行 chronyc sources,查看当前可用及已选中的时间源。原文输出示例如下:

MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^+ gamma.rueckgr.at              2   8   377   135  -1048us[-1048us] +/-   29ms
^- 2b.ncomputers.org             2   8   377   204  -1141us[-1124us] +/-   50ms
^+ www.kashra.com                2   8   377   139  +3483us[+3483us] +/-   18ms
^+ stratum2-4.NTP.TechFak.U>     2   8   377   143  -2090us[-2073us] +/-   19ms
^- zepto.mcl.gg                  2   7   377     9   -774us[ -774us] +/-   29ms
^- mirrorhost.pw                 2   7   377    78   -660us[ -660us] +/-   53ms
^- atto.mcl.gg                   2   7   377     8   -823us[ -823us] +/-   50ms
^- static.140.107.46.78.cli>     2   8   377     9  -1503us[-1503us] +/-   45ms
^- 4.53.160.75                   2   8   377   137    -11ms[  -11ms] +/-  117ms
^- 37.44.185.42                  3   7   377    10  -3274us[-3274us] +/-   70ms
^- bagnikita.com                 2   7   377    74  +3131us[+3131us] +/-   71ms
^- europa.ellipse.net            2   8   377   204   -790us[ -773us] +/-   97ms
^- tethys.hot-chilli.net         2   8   377   141   -797us[ -797us] +/-   59ms
^- 66-232-97-8.static.hvvc.>     2   7   377   206  +1669us[+1686us] +/-  133ms
^+ 85.199.214.102                1   8   377   205   +175us[ +192us] +/-   12ms
^* 46-243-26-34.tangos.nl        1   8   377   141   -123us[ -106us] +/-   10ms
^- pugot.canonical.com           2   8   377    21    -95us[  -95us] +/-   57ms
^- alphyn.canonical.com          2   6   377    23  -1569us[-1569us] +/-   79ms
^- golem.canonical.com           2   7   377    92  -1018us[-1018us] +/-   31ms
^- chilipepper.canonical.com     2   8   377    21  -1106us[-1106us] +/-   27ms

也可以使用 chronyc sourcestats 查看时间源统计信息:

210 Number of sources = 20
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
==============================================================================
gamma.rueckgr.at           25  15   32m     -0.007      0.142   -878us   106us
2b.ncomputers.org          26  16   35m     -0.132      0.283  -1169us   256us
www.kashra.com             25  15   32m     -0.092      0.259  +3426us   195us
stratum2-4.NTP.TechFak.U>  25  14   32m     -0.018      0.130  -2056us    96us
zepto.mcl.gg               13  11   21m     +0.148      0.196   -683us    66us
mirrorhost.pw               6   5   645     +0.117      0.445   -591us    19us
atto.mcl.gg                21  13   25m     -0.069      0.199   -904us   103us
static.140.107.46.78.cli>  25  18   34m     -0.005      0.094  -1526us    78us
4.53.160.75                25  10   32m     +0.412      0.110    -11ms    84us
37.44.185.42               24  12   30m     -0.983      0.173  -3718us   122us
bagnikita.com              17   7   31m     -0.132      0.217  +3527us   139us
europa.ellipse.net         26  15   35m     +0.038      0.553   -473us   424us
tethys.hot-chilli.net      25  11   32m     -0.094      0.110   -864us    88us
66-232-97-8.static.hvvc.>  20  11   35m     -0.116      0.165  +1561us   109us
85.199.214.102             26  11   35m     -0.054      0.390   +129us   343us
46-243-26-34.tangos.nl     25  16   32m     +0.129      0.297   -307us   198us
pugot.canonical.com        25  14   34m     -0.271      0.176   -143us   135us
alphyn.canonical.com       17  11  1100     -0.087      0.360  -1749us   114us
golem.canonical.com        23  12   30m     +0.057      0.370   -988us   229us
chilipepper.canonical.com  25  18   34m     -0.084      0.224  -1116us   169us

部分 chronyc 命令涉及特权,访问限制见 man chrony.conf 的“Command and monitoring access”部分。本地管理员可使用 sudo 访问本地管理套接字 /var/run/chrony/chronyd.sock。

每秒脉冲(PPS)支持

Chrony 原生支持多种 PPS 类型,可以使用内核 PPS API 和精确时间协议(PTP)硬件时钟。多数通用 GPS 接收器可通过 GPSD 接入;GPSD 等来源可通过共享内存(SHM)或套接字提供数据,推荐使用套接字。

这些方式能为 chrony 增加高质量时间源,改善精度、抖动、漂移以及长短期准确性。不同类型的时钟通常各有所长,很难在所有指标上都表现完美。配置细节可参考文末 PPS/GPSD 资料。

让 GPSD 向 chrony 提供数据的配置示例

首先安装:

sudo apt install gpsd chrony

为了测试和调试配置,尤其是 GPS 接收状态,还应安装:

sudo apt install pps-tools gpsd-clients

GPS 设备通常通过串口通信。目前常见的 USB GPS 设备会在 USB 接口后使用串口转换器。若要利用这些设备提供 PPS,应注意大多数设备不会通过 USB 传递 PPS 信号。具体兼容情况请查阅 GPSD 硬件列表。原文以下示例使用 Navisys GR701-W。

插入设备或系统启动时,dmesg 应显示类似以下串口连接信息:

[   52.442199] usb 1-1.1: new full-speed USB device number 3 using xhci_hcd
[   52.546639] usb 1-1.1: New USB device found, idVendor=067b, idProduct=2303, bcdDevice= 4.00
[   52.546654] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[   52.546665] usb 1-1.1: Product: USB-Serial Controller D
[   52.546675] usb 1-1.1: Manufacturer: Prolific Technology Inc. 
[   52.602103] usbcore: registered new interface driver usbserial_generic
[   52.602244] usbserial: USB Serial support registered for generic
[   52.609471] usbcore: registered new interface driver pl2303
[   52.609503] usbserial: USB Serial support registered for pl2303
[   52.609564] pl2303 1-1.1:1.0: pl2303 converter detected
[   52.618366] usb 1-1.1: pl2303 converter now attached to ttyUSB0

示例中的设备是 ttyUSB0。要让 chrony 接收它提供的时间信息,应在 /etc/chrony/chrony.conf 中配置如下内容,并将 USB0 替换成实际设备对应的部分:

refclock SHM 0 refid GPS precision 1e-1 offset 0.9999 delay 0.2
refclock SOCK /var/run/chrony.ttyUSB0.sock refid PPS

随后重启 chrony,让套接字就绪并等待数据:

sudo systemctl restart chrony

接着在 /etc/default/gpsd 中指定由 gpsd 管理的设备:

DEVICES="/dev/ttyUSB0"

gpsd 的默认用途是 GPS 位置跟踪。通常它只是在套接字上等待客户端连接,不会持续占用 CPU;客户端发出请求后,它也只提供被请求的数据。

若要将 gpsd 用作提供 PPS 的守护进程,则应做两项设置:

  1. 即使没有客户端连接也立即开始工作:在 /etc/default/gpsd 中设置 GPSD_OPTIONS="-n"。
  2. 启用服务本身,不再等待客户端连接套接字后才启动:运行 sudo systemctl enable /lib/systemd/system/gpsd.service。

重启 gpsd 后,它会初始化来自 GPS 的 PPS;dmesg 会显示:

 pps_ldisc: PPS line discipline registered
 pps pps0: new PPS source usbserial0
 pps pps0: source "/dev/ttyUSB0" added

如果有多个 PPS 来源,可以用 ppsfind 识别它们分别属于哪个 GPS。示例中运行 sudo ppsfind /dev/ttyUSB0 会返回:

pps0: name=usbserial0 path=/dev/ttyUSB0

基础配置至此完成。下一步需要 GPS 获取定位锁定;cgps 或 gpsmon 应报告三维定位(3D fix),才能提供准确数据。原文运行 cgps 的结果片段为:

...
│ Status:         3D FIX (7 secs) ...

然后使用 ppstest 检查是否确实接收到 PPS 数据。运行 sudo ppstest /dev/pps0,输出类似:

trying PPS source "/dev/pps0"
found PPS source "/dev/pps0"
ok, found 1 source(s), now start fetching data...
source 0 - assert 1588140739.099526246, sequence: 69 - clear  1588140739.999663721, sequence: 70
source 0 - assert 1588140740.099661485, sequence: 70 - clear  1588140739.999663721, sequence: 70
source 0 - assert 1588140740.099661485, sequence: 70 - clear  1588140740.999786664, sequence: 71
source 0 - assert 1588140741.099792447, sequence: 71 - clear  1588140740.999786664, sequence: 71

此时 gpsd 已运行、GPS 已锁定,并已将数据提供给 chrony。接下来从 chrony 侧检查。

在 gpsd 启动之前,或尚未取得定位锁定时,这些来源属于新的、尚未受信任的来源,标记为 ?。若等待一段时间后仍保持此状态,说明 gpsd 没有向 chrony 提供数据,需要排查原因:

chronyc> sources

210 Number of sources = 10
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
#? GPS                           0   4     0     -     +0ns[   +0ns] +/-    0ns
#? PPS                           0   4     0     -     +0ns[   +0ns] +/-    0ns

随着数据积累,chrony 会将未知来源判定为可用或不可用。下面示例中,原始 GPS 时间偏差较大(±200 ms),而 PPS 较好(±63 μs):

chronyc> sources

210 Number of sources = 10
MS Name/IP address        Stratum Poll Reach LastRx Last sample
===============================================================================
#x GPS                         0    4   177    24 -876ms[ -876ms] +/- 200ms
#- PPS                         0    4   177    21 +916us[ +916us] +/- 63us
^- chilipepper.canonical.com   2    6    37    53  +33us[ +33us]  +/- 33ms

再过一段时间,由于硬件 PPS 输入更好,chrony 选择它作为同步源:

chronyc> sources

210 Number of sources = 10
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
#x GPS                           0   4   377    20   -884ms[ -884ms] +/-  200ms
#* PPS                           0   4   377    18  +6677ns[  +52us] +/-   58us
^- alphyn.canonical.com          2   6   377    20  -1303us[-1258us] +/-  114ms

PPS 也可能正常工作,但与已选中的服务器组合使用。各状态的含义见 man chronyc。例如:

chronyc> sources

210 Number of sources = 11
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
#? GPS                           0   4     0     -     +0ns[   +0ns] +/-    0ns
#+ PPS                           0   4   377    22   +154us[ +154us] +/- 8561us
^* chilipepper.canonical.com     2   6   377    50   -353us[ -300us] +/-   44ms

如果想知道通过 SHM 提供的 GPS 数据质量如何,也可以检查。chrony 不仅会判断来源好坏,还能通过 sourcestats 展示详细统计:

chronyc> sourcestats

210 Number of sources = 10
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
==============================================================================
GPS                        20   9   302     +1.993     11.501   -868ms  1208us
PPS                         6   3    78     +0.324      5.009  +3365ns    41us
golem.canonical.com        15  10   783     +0.859      0.509   -750us   108us

使用 ntpshmmon,还能跟踪 gpsd 或其他兼容 ntpd 的参考时钟通过共享内存发送的原始数据。运行 sudo ntpshmmon -o,原文示例为:

sudo ntpshmmon -o

ntpshmmon: version 3.20
#      Name          Offset       Clock                 Real                 L Prc
sample NTP1          0.000223854  1588265805.000223854  1588265805.000000000 0 -10
sample NTP0          0.125691783  1588265805.125999851  1588265805.000308068 0 -20
sample NTP1          0.000349341  1588265806.000349341  1588265806.000000000 0 -10
sample NTP0          0.130326636  1588265806.130634945  1588265806.000308309 0 -20
sample NTP1          0.000485216  1588265807.000485216  1588265807.000000000 0 -10

NTS 支持

Chrony 4.0(首次随 Ubuntu 21.04 Hirsute 提供)加入了 网络时间安全 NTS 支持。

NTS 服务器

配置 NTS 服务器需要证书,让服务器能够证明身份,并据此保护和验证时间服务通信。除所有 NTP 服务器配置都需要的 allow 规则外,还必须指定以下两个配置项。例如:

ntsservercert /etc/chrony/fullchain.pem
ntsserverkey /etc/chrony/privkey.pem

出于隔离考虑,chrony 默认以用户和组 _chrony 运行,因此必须允许该用户读取证书文件:

sudo chown _chrony:_chrony /etc/chrony/*.pem

然后运行 systemctl restart chrony 重启服务,即可提供基于 NTS 的时间服务。

运行中的 chrony 服务器会收集多种统计信息,包括已建立及被丢弃的 NTS 连接数。运行 sudo chronyc -N serverstats 查看:

sudo chronyc -N serverstats

NTP packets received       : 213
NTP packets dropped        : 0
Command packets received   : 117
Command packets dropped    : 0
Client log records dropped : 0
NTS-KE connections accepted: 2
NTS-KE connections dropped : 0
Authenticated NTP packets  : 197

也可以查看每个客户端的统计。原文说明文字写为 -p,示例命令则使用 -k;依 Chrony 4.0 官方手册,-k 才用于显示 NTS-KE 访问统计,而 -p 指定列出客户端所需的最少数据包或连接数。原命令如下:

sudo chronyc -N clients -k

    Hostname                      NTP   Drop Int IntL Last  NTS-KE   Drop Int  Last
    ===============================================================================
    10.172.196.173                197      0  10   -   595       2      0   5   48h
    ...

更复杂的场景还可使用更多 NTS 高级配置选项,详见 chrony.conf(5) 手册。

延伸阅读

来源:Canonical / Ubuntu Server documentation,How to serve the Network Time Protocol with Chrony。中文翻译保留全部命令与原文输出;输出为原文示例,并非本次实测结果。命令访问范围及 clients 参数说明按官方手册核正。版权归 Canonical 及 Ubuntu Server 文档贡献者所有。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容