再见 NTP,是时候拥抱下一代时间同步服务 Chrony 了!

article/2025/10/4 3:14:56


Chrony 是一个多功能的 NTP (Network Time Protocol) 实现,类 Unix 系统上 NTP 客户端和服务器的替代品。它可以通过 NTP 服务或者类似 GPS 时钟接收器的硬件级参考时钟来同步系统时钟,具有更好的时钟准确度,并且对于那些间歇性互联网连接的系统很有帮助。Chrony 是免费开源的,并且支持 GNU/LinuxBSD 衍生版(比如:FreeBSDNetBSD)、macOSSolaris 等。

Chrony 有两个核心组件:一个是 chronyd 守护进程,主要用于调整内核中运行的系统时间和时间服务器同步。它确定计算机增减时间的比率,并对此进行调整补偿。另一个是 chronyc,它提供一个用户界面,用于监控性能并进行多样化的配置。chronyc 可以在 chronyd 实例控制的计算机上工作,也可以在一台不同的远程计算机上工作。

Chrony 和 NTPD 精度对比测试

我们可以从 Chrony 的官方网站上可以看到与 NTPD 各维度详细对比:

从其测试结果上看似乎是各维度性能都可以吊打 NTPD。因此 Chrony 对自身的整体评价还是比较高的。

Chrony 相较于 NTPD 服务的优势

  1. 更快的同步只需要数分钟而非数小时时间,从而最大程度的减少时间和频率误差,这对于并非全天运行的台式计算机或系统而言非常有用。

  2. 能够更好的响应时间频率的快速变化,这对于具备不稳定时钟的虚拟机或导致时钟频率反复变化的节能技术而言非常有用。

  3. 在初始同步后,它并不会停止时钟,以防对需要系统时间保持单调的程序造成影响。

  4. 在应对临时非对称延迟时,(例如:大规模下载造成连接饱和时)提供了更好的稳定性。

  5. 无需对服务器进行定期轮询,因此具备间歇性网络连接的系统仍然可以快速同步时钟。

安装 Chrony

Centos 7.x 开始的最小发行版中都已经预装并开启了 Chrony。如果你的系统上没有安装 Chrony,你也可以使用下面的命令轻松安装它。

$ yum -y install chrony    # [On CentOS/RHEL]$ apt install chrony       # [On Debian/Ubuntu]$ dnf -y install chrony    # [On Fedora 22+]

安装完成后,你可以使用以下命令来检查 chronyd 的状态。

$ systemctl status chronyd     # [On SystemD]$ /etc/init.d/chronyd status   # [On Init]

如果要在开机引导时自动启用 Chrony 的守护程序,你可以使用以下命令来实现。

$ systemctl enable chrony       # [On SystemD]$ chkconfig --add chronyd       # [On Init]

配置 Chrony

Chrony 的默认配置文件为 /etc/chrony.conf,下面将介绍一些常用的配置项。

  1. server hostname [option]

server 指令用于指定要同步的 NTP 服务器。

server 0.centos.pool.ntp.org iburst

其中的 0.centos.pool.ntp.orgNTP 服务器的地址,默认有四组官方的 NTP 服务器。你也可以修改为自定义的时间服务器,例如:ntp1.aliyun.com

iburst 是参数, 一般用此参数即可。该参数的含义是在头四次 NTP 请求以 2s 或者更短的间隔,而不是以 minpoll x 指定的最小间隔,这样的设置可以让 chronyd 启动时快速进行一次同步。

其他的参数有 minpoll x 默认值是 6,代表 64smaxpoll x 默认值是 9,代表 512s

  1. driftfile file

Chrony 会根据实际时间计算修正值,并将补偿参数记录在该指令指定的文件里,默认为 driftfile /var/lib/chrony/drift

ntpd 或者 ntpdate 最大的区别就是,Chrony 的修正是连续的,通过减慢时钟或者加快时钟的方式连续的修正。而 ntpd 或者 ntpdate 搭配 Crontab 的校时工具是直接调整时间,会出现间断,并且相同时间可能会出现两次。因此,请放弃使用 ntpdntpdate 来校时。

  1. makestep threshold limit

此指令使 Chrony 根据需要通过加速或减慢时钟来逐渐校正任何时间偏移。例如:makestep 1.0 3,就表示当头三次校时,如果时间相差 1.0s, 则跳跃式校时。

  1. rtcsync

启用内核时间与 RTC 时间同步 (自动写回硬件)。

  1. logdir

该参数用于指定 Chrony 日志文件的路径。

  1. stratumweight

该参数用于设置当 chronyd 从可用源中选择同步源时,每个层应该添加多少距离到同步距离。默认情况下设置为 0,让 chronyd 在选择源时忽略源的层级。

基本上常用的参数就只有这几个了,通常默认的配置文件就可以直接使用了,下面我们来看一个修改完成后的配置文件内容。

# 这里只修改了 server 中的 NTP 服务器地址,如果网络环境良好可以使用默认配置server ntp1.aliyun.com iburstserver ntp2.aliyun.com iburst
driftfile /var/lib/chrony/driftmakestep 1.0 3rtcsynclogdir /var/log/chrony

使用 Chrony 客户端程序进行管理

  1. 检查 Chrony 是否实际同步

为了检查 Chrony 是否实际同步,我们将使用它的命令行程序 chronyc 来验证。

$ chronyc tracking
Reference ID : 78197314 (120.25.115.20)Stratum : 3Ref time (UTC) : Fri Jun 28 13:58:17 2019System time : 0.000042858 seconds slow of NTP timeLast offset : -0.000187823 secondsRMS offset : 0.001029734 secondsFrequency : 17.614 ppm slowResidual freq : +0.008 ppmSkew : 5.552 ppmRoot delay : 0.034440458 secondsRoot dispersion : 0.002149768 secondsUpdate interval : 64.1 secondsLeap status : Normal

这里主要关注 Update interval 这个参数, 说明最后两次更新的时间间隔是 64.1s。以上结果中的其它参数的含义分别是:

  • 引用 ID - 计算机当前同步的引用 ID 和名称。

  • Stratum - 连接参考时钟的计算机的跳数。

  • 参考时间 - 这是参考源的最后一次测量的 UTC 时间。

  • 系统时间 - 来自同步服务器的系统时钟延迟。

  • 最后一次偏移 - 上次时钟更新的估计偏移量。

  • RMS 偏移 - 偏移值的长期平均值。

  • 频率 - 如果 chronyd 没有纠正它,那么系统的时钟错误的速率。它以 ppm (百万分率)提供。

  • 残余频率 - 残余频率表示参考源的测量值与当前使用的频率之间的差异。

  • 偏斜 - 估计频率的误差界限。

  • 根延迟 - 网络路径延迟到计算机正在同步的层计算机的总和。

  • 跳跃状态 - 这是跳跃状态,可以具有以下值之一:正常、插入秒、删除秒或不同步。

  1. 显示所有 NTP 源服务器的信息

这里需要注意的是第二个参数,* 代表当前同步的源,- 代表通过组合算法计算后排除的源。

$ chronyc sources -v
210 Number of sources = 2
.-- Source mode '^' = server, '=' = peer, '#' = local clock. / .- Source state '*' = current synced, '+' = combined , '-' = not combined,| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.|| .- 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===============================================================================^* 120.25.115.20 2 6 37 12 +85us[ -960us] +/- 20ms^- 203.107.6.88 2 6 37 12 +262us[ +262us] +/- 21ms
  1. 查看 NTP 服务器的在线和离线状态

$ chronyc activity
  1. 查看 Chrony 服务的日志

$ journalctl -u chronyd
  1. 检查 NTP 访问是否对特定主机可用

$ chronyc accheck
  1. 该命令会显示有多少 NTP 源在线/离线

$ chronyc activity
  1. 手动添加一台新的 NTP 服务器

$ chronyc add server
  1. 在客户端报告已访问到服务器

$ chronyc clients
  1. 手动移除 NTP 服务器或对等服务器

$ chronyc delete
  1. 手动设置守护进程时间

$ chronyc settime
  1. 校准时间服务器,显示系统时间信息

$ chronyc tracking
  1. 检查 NTP 访问是否对特定主机可用

$ chronyc accheck
  1. 查看时间同步源

$ chronyc sources -v
  1. 查看时间同步源状态

$ chronyc sourcestats -v

Chrony 客户端程序的功能非常强大,远不止上面介绍这些。不但支持命令行模式,而且还支持交互模式。如果你想了解更多 Chrony 客户端程序的使用方法,可以使用 man chronyc 命令获取更多帮助。

使用 Chrony 作为 NTP 服务器

要将 Chrony 作为一个 NTP 服务器,方法很简单。

首先,你需要修改 /etc/chrony.conf 文件,并添加以下配置即可。

# 对于安全要求比较高的,这里可以限制谁能访问本机提供的 NTP 服务。allow 192.168.1.0/24
# 设置 chronyd 监听在哪个网络接口bindcmdaddress 0.0.0.0
# 这个地方很重要,如果服务器本身也不能同步时间,那么就用本地时间替代,层级为 10local stratum 10

其次,重启 Chronyd 服务,以加载新的配置。

$ systemctl restart chronyd

Chronyd 服务启动成功后,会监听以下两个端口。

  • 端口 123/udp 为标准的 NTP 监听端口,如果要对外提供 NTP Server 功能,必须开启防火墙和监听地址为外部可访问地址。如需修改,你可以通过配置 port 参数来修改。

  • 端口 323/udp 为默认的管理端口。如需修改,你可以通过配置 cmdport 参数来修改。

最后,修改防火墙设置,以放行对 123/udp 的请求,这里以 CentOS 7Firewalld 为例。

$ firewall-cmd --zone=public --add-port=123/udp --permanent$ firewall-cmd --reload

延伸阅读

一些可用的公共 NTP 服务

公共 NTP 服务网上很多,但国内环境下最好用的应该还属阿里云的公网 NTP 服务。

一些时间相关的概念介绍

  1. GMT、UTC、CST、DST 时间

  • UTC 整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时 (UTC, Universal Time Coordinated)。

  • GMT 格林威治标准时间 (Greenwich Mean Time) 指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。( UTCGMT 时间基本相同)

  • CST 中国标准时间 (China Standard Time)

  • GMT + 8 = UTC + 8 = CST

  • DST 夏令时 (Daylight Saving Time) 指在夏天太阳升起的比较早时,将时间拨快一小时,以提早日光的使用。(中国不使用)

  1. 硬件时间和系统时间

  • 硬件时间:RTC (Real-Time Clock)CMOS 时间,一般在主板上靠电池供电,服务器断电后也会继续运行。仅保存日期时间数值,无法保存时区和夏令时设置。

  • 系统时间:一般在服务器启动时复制 RTC 时间,之后独立运行,保存了时间、时区和夏令时设置。

一些设置时区和时间的命令

  1. 查看当前系统时区

# 直接使用 timedatectl 命令也等同于以下命令$ timedatectl status      Local time: Fri 2018-2-29 13:31:04 CST  Universal time: Fri 2018-2-29 05:31:04 UTC        RTC time: Fri 2018-2-29 08:17:20       Time zone: Asia/Shanghai (CST, +0800)     NTP enabled: yesNTP synchronized: yes RTC in local TZ: no      DST active: n/a
  1. 设置当前系统时区

如果你当前的时区不正确,请按照以下操作设置。

# 查看所有可用的时区$ timedatectl list-timezones
# 查看上海可用时区$ timedatectl list-timezones | grep -E "Asia/S.*"Asia/SakhalinAsia/SamarkandAsia/SeoulAsia/ShanghaiAsia/SingaporeAsia/Srednekolymsk
# 设置当前系统为 Asia/Shanghai 上海时区$ timedatectl set-timezone Asia/Shanghai
# 设置完时区后,在强制同步下系统时钟$ chronyc -a makestep200 OK
  1. 显示系统的当前时间和日期

$ timedatectl set-time "YYYY-MM-DD HH:MM:SS"$ timedatectl set-time "YYYY-MM-DD"$ timedatectl set-time "HH:MM:SS"
  1. 修改当前日期时间

# 可以只修改其中一个$ timedatectl set-time "2019-10-31 15:50:00"
  1. 设置硬件时间

# 硬件时间默认为 UTC,下面两条命令效果等同$ timedatectl set-local-rtc 1$ hwclock --systohc --localtime
  1. 启用或者禁止 NTP 时间同步

# yes 或 no,1 或 0 也可以$ timedatectl set-ntp yes/no$ timedatectl set-ntp true/flase

参考文档

  1. http://www.google.com

  2. https://url.cn/5RYX5Ob

  3. https://chegva.com/3265.html

  4. https://blog.gnuers.org/?p=1483

  5. https://yq.aliyun.com/articles/503151

  6. http://tswblog.com/article/linux/chrony/

  7. https://www.cnblogs.com/cloudos/p/NTP.html

  8. https://www.itsfun.tk/better-ntp-server-chrony/

  9. https://www.mnstory.net/2018/12/09/chrony-ntp-date-sync/

  10. https://www.howtoing.com/install-chrony-in-centos-ubuntu-linux

你可能还喜欢

点击下方图片即可阅读

公网端口不够用,用这款神器轻松搞定它!


http://chatgpt.dhexx.cn/article/OyLixIpE.shtml

相关文章

chrony 时间同步详解

一、 简介 Chrony是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件。它能让计算机保持系统时钟与时钟服务器(NTP)同步,因此让你的计算机保持精确的时间,Chrony也可以作为服务端软件为其他计算机提供时间同步服务。 Chr…

Linux中的Chrony时间同步服务

目录 一、时间同步 1.概念 2.时间同步在运维工作中的作用 3.时间同步完成方法 (1)NTP时间服务(centos 6 ) (2)Chrony时间服务 二、Chrony时间服务 1.Chrony介绍 2.Chrony的优点 三、Chrony安装 …

配置chrony时间同步服务

一、chrony简介 chrony 的优势: 更快的同步,从而最大程度减少了时间和频率误差,对于并非全天 24 小时运行的虚拟计算机而言非常有用 能够更好地响应时钟频率的快速变化,对于具备不稳定时钟的虚拟机或导致时钟频率发生变化的节能技…

乐优商城项目

目录 3.4.创建父工程 3.5.创建EurekaServer 3.5.1.创建工程 3.5.2.添加依赖 3.5.3.编写启动类 3.5.4.配置文件 3.6.创建Zuul网关 3.6.1.创建工程 3.6.2.添加依赖 3.6.3.编写启动类 3.6.4.配置文件 3.6.5.项目结构 3.7.创建商品微服务 3.7.1.微服务的结构 3.7.5.…

Java之Spring Data Elasticsearch一篇文章从入门到实战

Elasticsearch提供的Java客户端有一些不太方便的地方: 很多地方需要拼接Json字符串,在java中拼接字符串有多恐怖你应该懂的需要自己把对象序列化为json存储查询到结果也需要自己反序列化为对象 因此,我们这里就不讲解原生的Elasticsearch客…

【Elasticsearch】整合Spring Data Elasticsearch

整合Spring Data Elasticsearch 如何查看官方文档(了解) 官方文档:Java High Level REST Client | Java REST Client [6.8] | Elastic 下面是获得文档的方式(可以不用看): 步骤一:查询“文档…

ElasticSearch高级篇

注:该文档是网上资源,该文档通俗易懂,我已经按照文档学习完了,后期我会加入自己的实践内容。 0.学习目标 独立安装Elasticsearch会使用Rest的API操作索引会使用Rest的API查询数据会使用Rest的API聚合数据掌握Spring Data Elastics…

自己挖坑自己填 spring-data-elasticsearch 4.0.0.M4 简单实践

前几天安装了elasticsearch7.6.1,今天准备实践下spring-data-elasticsearch,没想到4.0改动大资料少,全靠官方文档撑着 文章目录 搭建环境编写yml配置创建实体类 基于Spring Data的CRUD直接从方法名称派生查询自定义的查询 ElasticsearchRestTemplate的使用indexOperations 索引…

Elasticsearch集群,java操作es

今日内容 集群和分布式Elasticsearch集群Elasticsearch客户端 java代码取操作ES有三种方式 1、es提供的原生的操作方式 在es 8.0后会移除 2、es提供的rest风格的操作方式 3、SpringDataElasticSearch的方式 第一章 集群和分布式 集群和分布式的概念有联系也有区别,我…

数据结构(Java)-排序算法-插入排序

插入排序法思想: 插入排序的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它依次与有序表元素进行比…

ES基础篇-11-Spring提供的elasticsearch组件:Spring Data Elasticsearch

1. 简介 1.1.什么是SpringDataElasticsearch SpringDataElasticsearch(以后简称SDE)是Spring Data项目下的一个子模块。 查看 Spring Data的官网:http://projects.spring.io/spring-data/ Spring Data 的使命是给各种数据访问提供统一的编…

91-Lucene+ElasticSeach核心技术

LuceneElasticSeach 什么是全文检索: 数据分类: 我们生活中的数据总体分为两种:结构化数据和非结构化数据 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等 非结构化数据:指…

SpringBoot集成Elasticseach

目录 一、Elasticseach介绍 1.简单介绍 2.对比关系: 3.详细说明: 4.查出数据的解释 二、SpringBoot集成Elasticseach 1.引入依赖 2.添加配置 3.创建pojo类与索引对应 4.SpringData封装了基础的增删改查,自定义增删改查 5.测试方法-…

Windows系统下载安装MinGW(包括32位和64位)

一、MinGW简介 MinGW是是将GCC编译器和GNU Binutils移植到Win32平台下的产物,包括一系列头文件(Win32API)、库和可执行文件。MinGW是从Cygwin(1.3.3版)基础上发展而来。GCC支持的语言大多在MinGW也受支持,其…

MySQL寻找特定字符后的字符串

“日边清梦断,镜里朱颜改” 在操作数据库的某些情况下,我们需要对其中一字段的最后几个字做修改,如下图,把老师改为学生 我找了半天,好像没找到mysql中有合适的函数,能找到最后一个/符号并且修改后面的字符串.需要用好几个函数嵌套使用.如下: select 处理前 as status,org…

支付宝支付功能的实现

支付宝支付功能实现 一.环境准备 二.配置沙箱环境 1.浏览器搜索 支付宝开放平台 2.找到开发服务,选择沙箱 3.根据文档提示,一步步配置 4.配置完成后的样子 5.下载好支付宝手机开放平台助手,可以获取应用私钥 **注意:**应用公…

针对Spring/Gradle启动失败的一些通用解决方案

文章目录 0 前言1 更改Gradle JVM的Java JDK1.1 执行JUnit测试时,Gradle报错 0 前言 当你对Spring/Gradle启动失败的错误信息一筹莫展时,不妨试试以下这些通用的解决方案 1 更改Gradle JVM的Java JDK Settings -> Build, Execution, Deployment -&…

13123

111 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注脚注释也是必不…

编译JSqlparser

这个东西是用来解析sql的。既然要编译源码,第一步当然要下载源码了。 要下源码当然是到世界最大同志网站了: https://github.com/JSQLParser/JSqlParser 项目导入idea,缺少源码,原来需要javacc来生成代码。 自然我们需要安装javacc这个东西&…

jsqlparser:修改语法定义(JSqlParserCC.jjt)实现UPSERT支持Phoenix语法ON DUPLICATE KEY IGNORE

最近在用jsqlparser4.5解析SQL时遇到了一个问题, 如下是apache phoenix的UPSERT语句 UPSERT INTO TEST (ID, COUNTER) VALUES (123, 0) ON DUPLICATE KEY IGNOREON DUPLICATE KEY IGNORE即为当主键重复时忽略,这与MySQL的IGNORE语法不同: …