在 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 的守护进程,则应做两项设置:
- 即使没有客户端连接也立即开始工作:在
/etc/default/gpsd中设置GPSD_OPTIONS="-n"。 - 启用服务本身,不再等待客户端连接套接字后才启动:运行
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) 手册。











暂无评论内容