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:标准偏差,表示时间同步的精度,数值越小表示同步约精确及稳定
合集:
RHCE
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗