Linux系统时间服务——Chrony服务器

前言

时间同步的重要性

  • 由于IT系统中,准确的计时非常重要,有很多种原因需要准确计时:
    • 在网络传输中,数据包括和日志需要准确的时间戳
    • 各种应用程序中,如订单信息,交易信息等 都需要准确的时间戳

Linux系统的两种时钟

系统时钟(System Clock)

  • 系统时钟是操作系统运行时维护的时间,通常是从硬件时钟读取的,并在运行时不断更新
  • 系统时钟的时间是由操作系统内核管理的,计时基于 CPU 的时钟周期。
  • 系统时间是相对的,系统重启后将重置为硬件时钟的时间
  • 系统时钟在计算时区、时间同步和系统调度等方面起着关键作用

相关命令

date #查看系统时间
date -s "YYYY-MM-DD HH:MM:SS" #设置系统时间

硬件时钟 (RTC - Real Time Clock)

  • 硬件时钟写入主板的BIOS程序,是主板上独立的时钟芯片,由主板的电池供电(通常是 CMOS 电池),即使系统断电或关机,它也能保持计时
  • 主要作用是在系统开机时提供一个基础的时间,系统启动后通常会从硬件时钟读取当前时间,初始化系统时钟

相关命令

hwclock --show #查看硬件时钟时间
hwclock --set --date="YYYY-MM-DD HH:MM:SS" #设置硬件时钟
hwclock --systohc #将系统时间写入硬件时钟

Chrony介绍

  • chrony是一个开源的自由软件,它能帮助你保持系统时钟与时钟服务器(NTP)同步,因此让你的时间保持精确。
  • chrony由两个程序组成,分别是chronyd和chronyc
    • chronyd:是一个后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步。它确定计算机增减时间的比率,并对此进行补偿。
    • chronyc:提供了一个用户界面,用于监控性能并进行多样化的配置。它可以在chronyd实例控制的计算机上工作,也可以在一台不同的远程计算机上工作
  • 注意:Chrony与NTP都是时间同步软件,两个软件不能够同时开启,会出现时间冲突,openeuler中默认使用chrony作为时间服务器,不再支持NTP软件包

NTP

  • NTP:(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步。
  • NTP基于UDP报文进行传输,使用的UDP端口号为123
  • NTP可以对网络内所有具有时钟的设备进行时钟同步,使网络内所有设备的时钟保持一致,从而使设备能够提供基于统一时间的多种应用,对于运行NTP的本地系统,既可以接受来自其他时钟源的同步,又可以作为时钟源同步其他的时钟,并且可以和其他设备互相同步。
  • NTP的其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms

Chronyc相关命令

服务管理相关命令

systemctl start chronyd #启动 Chrony 服务

systemctl stop chronyd #停止 Chrony 服务

systemctl restart chronyd #重启 Chrony 服务

systemctl status chronyd #检查 Chrony 服务状态

chronyc 基本命令

chronyc sources #检查时间源的状态
  显示 NTP 时间源的基本信息(例如,阶层、偏移量和可达性)。

chronyc sourcestats #查看时间源的详细统计信息
  提供每个时间源的详细同步性能统计数据,如偏移标准差、频率误差等。

chronyc -a makestep #强制系统时间与 NTP 服务器同步
  如果系统时间与服务器时间偏差过大,使用此命令可立即进行时间同步(跳步调整)。

chronyc tracking #显示同步状态
  显示系统的当前时间跟踪状态,包括系统的时间偏移、频率漂移等。

chronyc activity -v #检查时间源活动情况
  显示所有时间源的当前活动状态,如在线、离线、突发模式等。

chronyc hwclock #设置系统时钟与硬件时钟同步
  将当前的系统时钟时间写入硬件时钟 (RTC)。

chronyc enable <source> #启用某个时间源

chronyc disable <source> #禁用某个时间源

时间校正和控制命令

chronyc adjtime <time> #调节时间
  手动调整系统时钟的偏移,`<time>` 为调整的时间(单位为秒)。

chronyc makestep #跳步调整时间
  使用该命令将系统时间立即与 NTP 服务器的时间同步,而不是通过逐渐调整。

NTP 时间源管理

chronyc add server <server_name> iburst #添加新的 NTP 服务器
  添加一个新的 NTP 服务器到 Chrony 配置中,并立即进行时间同步(`iburst` 选项用于快速同步)。

chronyc delete server <server_name> #删除 NTP 服务器

chronyc reload sources #刷新 NTP 服务器列表
  重新加载时间源配置文件,更新时间源列表。

调试和监控命令

chronyc ntpdata #查看 NTP 源的偏移统计数据
  显示每个时间源的原始 NTP 数据,如延迟、偏移、抖动等。

chronyc -a tracking #查看系统时钟与 NTP 服务器的偏差

chronyc rtcdata #检查时间源的计时特性
  显示硬件时钟的相关信息(RTC),包括漂移和同步状态。

chronyc -a manualcorr <offset_in_seconds> #查看当前的偏移量(毫秒级)
  手动调整系统时钟的偏移,偏移量可以是正负的时间差。

日志和事件

journalctl -u chronyd #显示 Chrony 守护进程的日志
  查看 Chrony 服务的运行日志和时间同步情况

保存和重启相关操作

chronyc hwclock --systohc #将当前系统时间保存到硬件时钟
  将系统时间写入 RTC 硬件时钟,确保关机后时间保持正确。

chronyc reload #重新加载 Chrony 配置
  当配置文件(例如 `/etc/chrony.conf`)更改后,使用此命令使修改生效。

其他命令

chronyc lastsync #查看 NTP 源的最后偏移时间
  显示系统最近一次同步的时间和偏移值。

chronyc estimate #检查系统时间和 NTP 源时间的精确度
  估计系统时间和 NTP 服务器时间之间的偏差。

Chrony相关内容解析

chrony.conf配置文件解析

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (https://www.pool.ntp.org/join.html).
'pool 2.rhel.pool.ntp.org iburst

- 使用 `rhel`(Red Hat Enterprise Linux)特定的 NTP 服务器池
- `iburst` 选项表示在连接服务器失败时,客户端会快速发送一组请求以尽快获取响应。这有助于加快初次同步的速度。
# Use NTP servers from DHCP.
'sourcedir /run/chrony-dhcp

- 该设置允许 Chrony 从 DHCP 分配的 NTP 服务器列表中获取时间源。如果 DHCP 服务器提供了 NTP 服务器信息,它会被自动使用。
- `sourcedir` 选项指示 Chrony 自动加载从指定目录中找到的 NTP 服务器配置。
# Record the rate at which the system clock gains/losses time.
'driftfile /var/lib/chrony/drift

- 这个文件记录系统时钟的漂移速率。Chrony 会根据这个文件的内容调整时钟,以提高长期时间同步的准确性。
- 通过记录系统时钟的增减变化,Chrony 可以更好地在不依赖外部时间源的情况下维持系统时钟的准确性。
# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
'makestep 1.0 3
- 这允许在系统启动或 Chrony 启动后的前三次时间更新中,如果系统时钟与 NTP 服务器的时间差超过 1 秒,直接“跳步”同步(即一次性纠正时间)。
- 在前三次更新后,Chrony 通常只会逐渐调整系统时钟,而不进行大幅度的跳步调整。
# Enable kernel synchronization of the real-time clock (RTC).
'rtcsync

- 启用这个选项后,Chrony 会将系统时间同步到硬件时钟(RTC,Real-Time Clock),确保系统重启时仍能保持较为准确的时间。
# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *

- 这是一个可选的配置,用于启用网络接口的硬件时间戳功能,以提高时间同步的精度。如果网络接口支持该功能,开启硬件时间戳有助于更精确地记录时间。
- 由于它被注释掉(`#`),此时它没有生效。你可以取消注释来启用它。
# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2

- **作用**:如果启用,`minsources` 指定系统需要从至少 **2** 个 NTP 服务器接收到时间数据后,才会调整系统时钟。
- **注释掉表示**:没有强制要求多个 NTP 服务器。
# Allow NTP client access from local network.
#allow 192.168.0.0/16

- **作用**:允许 IP 范围 `192.168.0.0/16` 的客户端连接到此 Chrony 服务器进行时间同步。如果取消注释,它将允许来自该 IP 地址范围的设备连接。
- **注释掉表示**:默认情况下,不允许本地网络的客户端访问 NTP 服务。
# Serve time even if not synchronized to a time source.
#local stratum 10

- **作用**:如果启用,当 Chrony 没有同步到任何外部时间源时,它会根据自身的系统时钟提供时间,成为一个 **本地时间源**,其阶层(Stratum)值设为 10。阶层值较高表示该时间源不太可靠。
- **注释掉表示**:Chrony 不会在未同步到外部时间源时提供时间。
# Require authentication (nts or key option) for all NTP sources.
#authselectmode require

- **作用**:如果启用,Chrony 将要求对所有 NTP 源进行身份验证。`nts`(Network Time Security)或 `key` 选项可以用来验证 NTP 服务器的身份,以确保时间来源的可靠性。
- **注释掉表示**:没有强制身份验证。
# Specify file containing keys for NTP authentication.
'keyfile /etc/chrony.keys

- **作用**:指定用于 NTP 身份验证的密钥文件的路径。Chrony 使用此文件中的密钥来验证和加密 NTP 服务器之间的通信。
- **默认启用**:需要身份验证时,该文件存储了 NTP 客户端和服务器之间共享的密钥。
# Save NTS keys and cookies.
'ntsdumpdir /var/lib/chrony

- **作用**:指定保存 NTS(Network Time Security)密钥和 cookies 的目录路径。NTS 是一种增强 NTP 安全性的协议,防止攻击者伪造时间源。
- **默认启用**:存储 NTS 的临时文件。
# Insert/delete leap seconds by slewing instead of stepping.
#leapsecmode slew

- **作用**:启用后,Chrony 会通过**调节(slew)**的方式插入或删除闰秒,而不是突然调整时间(即步进)。调节是逐渐调整时钟速度,而不是一次性跳跃。
- **注释掉表示**:Chrony 默认为**步进**模式来处理闰秒。
# Get TAI-UTC offset and leap seconds from the system tz database.
'leapsectz right/UTC

- **作用**:Chrony 使用系统的 `tz`(时区)数据库来获取 TAI-UTC 偏移和闰秒信息,确保系统时钟与全球标准时间保持同步。`right/UTC` 是一种更精确的时区处理方法,跟踪闰秒。
- **启用状态**:Chrony 将从时区数据库中获取相关信息。
# Specify directory for log files.
'logdir /var/log/chrony

- **作用**:指定 Chrony 的日志文件保存路径,默认路径为 `/var/log/chrony`- **启用状态**:日志文件存储在 `/var/log/chrony` 目录中。
# Select which information is logged.
#log measurements statistics tracking

- **作用**:启用后,Chrony 会记录有关时间同步的各种详细信息,如测量值、统计数据、跟踪信息等。
- **注释掉表示**:不会记录这些详细的日志信息。

查看时间源的状态

[root@localhost ~]#  chronyc  sources  -v

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current best, '+' = combined, '-' = not combined,
| /             'x' = may be in error, '~' = too variable, '?' = unusable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^- makaki.miuku.net              3   9   157   295    +18ms[  +19ms] +/-   75ms
^- ntp.wdc2.us.leaseweb.net      2   9   377   235  +2844us[+3923us] +/-  238ms
^+ ntp5.flashdance.cx            2   9   377   744    +27ms[  +28ms] +/-  164ms
^* tock.ntp.infomaniak.ch        1   9   377    36  +1574us[+2677us] +/-   90ms

chronyc sources输出分析

符号含义

  • M:服务器模式
  • S:服务器状态
符号含义
^ 服务器
= 对等体
# 本地时钟
* 当前最佳的时间源
+ 次级最佳,与最佳组合使用,但不是主要时间源
- 能使用但未组合使用的时间源
x 可能出现错误(与大多数有较大差异)的时间源
~ 波动较大的时间源
? 断开链接,无法使用的时间源

字段含义

  • Name/IP address:该字段显示时间源的域名或 IP 地址
  • Stratum: NTP 时间服务器的阶层(Stratum)表示时间源离真实时间源的距离,数字越小越接近时间源。 Stratum 1:直接从一个精确的硬件时钟(如 GPS、原子钟)获取时间。 Stratum 2:从 Stratum 1 的服务器获取时间,以此类推
  • Poll: 这是时间源的轮询间隔,以 2 的幂次表示(单位为秒)。例如,Poll 值为 9,表示轮询间隔为 2^9=512 秒。 所有服务器的轮询间隔都是 9,即每 512 秒轮询一次。chronyd会根据当时的情况自动改变轮询频率。
  • Reach : 这是一个八进制值,表示最近对该时间源的连接状态。该值范围是 0 到 377(八进制),其中 377 表示最近八次尝试都成功连接到该源。
  • LastRx : 表示上一次从该时间源成功接收到时间样本的时间,单位是秒。例如: tock.ntp.infomaniak.ch 的 LastRx 值为 36,表示 36 秒前接收到时间样本。 makaki.miuku.net 的 LastRx 值为 295,接收到样本的时间稍长。
  • Last sample: Last Sample 列显示最近一次从时间源接收到的时间样本的偏移量、测量的偏移量和估算误差:经过chroncy调整过的偏差[实际系统时钟与时间源之间测得的偏移量]。(+/- zzzz):表示偏移估计的误差范围。数值越小,时间同步越准确,+便宜表示系统时钟比时间源快

查看时间源的详细状态

chronyc sourcestats输出分析

[root@localhost ~]#  chronyc  sourcestats  -v
                             .- Number of sample points in measurement set.
                            /    .- Number of residual runs with same sign.
                           |    /    .- Length of measurement set (time).
                           |   |    /      .- Est. clock freq error (ppm).
                           |   |   |      /           .- Est. error in freq.
                           |   |   |     |           /         .- Est. offset.
                           |   |   |     |          |          |   On the -.
                           |   |   |     |          |          |   samples. \
                           |   |   |     |          |          |             |
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
==============================================================================
makaki.miuku.net            3   3   130   -159.586  95588.516    -17ms    14ms
ntp.wdc2.us.leaseweb.net    4   3   195    +22.966    457.776  +5844us  2219us
ntp5.flashdance.cx          3   3   194    +14.040   3093.718   +113us   659us
tock.ntp.infomaniak.ch      4   4   195    -49.956    969.404    -13ms  3592us

主要字段:

  • NP:测量集中样本点的数量,表示从该时间源收集到的时间样本数。
  • NR:残差的数量,表示具有相同符号的连续测量点的数量,数字越高表示波动越小
  • Span:测量集的时间跨度,显示从该时间源收集数据的总时间。
  • Frequency:估算的时钟频率误差(ppm),反映系统时钟的漂移,+表示系统实践比时间源快
  • Freq Skew:频率偏差,表明频率测量的不确定性,数字越小稳定性越高
  • Offset:时间偏移量,表示系统时间与该时间源的时间差,+表示系统实践比时间源快
  • Std Dev:标准偏差,表示时间同步的精度,数值越小表示同步约精确及稳定