Linux服务器时间系列(一)——了解服务器时间

说在前面

本篇文章主要针对Linux服务器时间(包含系统时间和硬件时间)进行介绍,同时对服务器时间存在的时间偏移问题给出目前应用较多的解决方案,并且对相关的解决方案进行原理介绍和命令介绍。希望对各位读者有所帮助。

一、硬件/系统时间的查询

Linux的服务器时间可以分为硬件时间和系统时间,我们在服务器上面跑的时间默认用的都是系统时间。简单理解的话,硬件时间主要用途是作为开机时的时间存档加载到系统时间上面,而系统时间则是开机后由内核维护,保存在内存中的一个计时器。

1、系统时间(Software Clock)

系统时间由内核维护,开机后会读取硬件时间作为默认的系统时间,后续用户可以自行设置系统时间,需要注意的是对于系统时间的修改,默认情况下是不会回写到硬件时间上面的。
我们可以通过date命令来快速查询当前Linux系统的系统时间

date
date +"%Y-%m-%d %H:%M:%S"
2、硬件时间(RTC / CMOS Time)

硬件时间见名知义,就是硬件维护的时间,主板上存在一颗纽扣电池供电的“电子表”,掉电也继续走,但精度差,(据说每天漂移几秒到几十秒,但这点笔者未能找到比较可信的参考,不过大部分文章倒是都有提到硬件时间存在漂移的问题)。
我们可以使用hwclock命令来查看当前Linux系统的硬件时间

hwclock --show  # 查看当前硬件时间
hwclock -w      # 把当前系统时间写入到硬件时间上(内核->主板)
hwclock -s      # 把当前硬件时间写入到系统时间上(主板->内核)

二、服务器时间的修正/修改

需要注意的是,在没有人为介入的情况下,无论是硬件时间还是系统时间实际上都会随着系统运行时间的变长而偏移量逐渐变大,这点在硬件时间上尤为明显,虽然系统时间累积的漂移量很低,但是如果一旦出现系统重启的问题,就会因为读取硬件时间而导致漂移量变大。
为了解决这个问题,我们必须要有方式去定期手动修正系统时间可能产生的偏移量,下面我们来介绍几种主流的方案。

需要注意的是,在没有人为介入的情况下,无论是硬件时间还是系统时间实际上都会随着系统运行时间的变长而偏移量逐渐变大,这点在硬件时间上尤为明显,虽然系统时间累积的漂移量很低,但是如果一旦出现系统重启的问题,就会因为读取硬件时间而导致漂移量变大。
为了解决这个问题,我们必须要有方式去定期手动修正系统时间可能产生的偏移量,下面我们来介绍几种主流的方案。

(一)使用date命令临时修正(只适用于临时解决)

发现系统时间存在漂移时,我们可以使用date命令来临时对系统时间进行修正,这种场景适用于本身服务器不能连接外网,且没有自建ntp服务器等情况。

date -s "2025-10-14 15:30:00"  # 手动设置系统时间
hwclock -w  # 将系统时间回写到硬件时间
(二)使用ntpdate命令修正(借助ntp服务器)

由于系统时间的偏移量修正是普遍的问题,借助ntp服务来修正系统时间是从早期乃至现在也还是一种常见的技术方案。首先,目前市面上存在一些公共的ntp服务提供者(比如cn.pool.ntp.org),他们通过硬件和其他技术手段,保证了他们维护了一个准确的时间,并对外提供服务,ntpdate命令实现的原理是我们通过获取第三方服务返回的时间作为准确的时间源,来修正当前的系统时间。
如果是内网环境的话,一般是会先在一台服务器上面搭建ntp服务(对外获取正确的时间同步到本地),再作为统一的服务出口提供给内网所有的服务器使用。
介绍完ntp服务后,我们再来聊一下ntp服务的一些使用细节:

  1. ntpdate是一次性的校正工具,会直接将系统时间校正到正确的时间,可能存在时间跳变的问题
  2. ntpdate命令不能做到定时自动校正,所以比较常见的做法是结合crontab命令来做成定时任务进行系统时间校正

接下来我们开始正式说一下ntpdate命令的使用,首先需要在本地服务器下载ntp客户端ntpdate

which ntpdate   # 下载之前可以先看看本地是否已经有了ntpdate命令了
yum install ntp #  没有的话就安装一个

下载完成后,我们可以通过以下命令来查看当前系统时间和ntp服务时间的差异,以及同步工作

# 只查询本地系统时间和ntp服务时间的偏移量,这里的ntpserver可以是ip也可以是域名
ntpdate -q ntpserver  

# 根据ntp服务时间修正当前系统时间,-u参数可以改成改用 非特权端口(123→1024+)发包/收包,避免因为权限或者防火墙问题被拦截
# 如果本身就有root权限,且防火墙没有特别要求的话,这里的-u可以不用加
ntpdate -u ntpserver

执行结果如下:

# ntpdate -q 10.10.10.10
server 10.10.10.10, stratum 4, offset 112.800209, delay 0.02657
18 Oct 12:58:39 ntpdate[9442]: step time server 10.10.10.10 offset 112.800209 sec

# ntpdate 10.10.10.10
18 Oct 13:03:40 ntpdate[13402]: step time server 10.10.10.10 offset 112.804155 sec
拓展:将ntpdate配置到定时任务中

这里配置了每隔2小时的20分,就会自动做一次ntp服务的自动同步,且同时回写到硬件时间上面

20 */2 * * * /usr/sbin/ntpdate -u 10.10.10.10 && /sbin/hwclock -w > /dev/null 2>&1
(三)使用chronyc进行时间修正

ntpdate工具固然好用,但目前chronyc工具也同样被广泛使用,这个工具自2009年随 Chrony 项目诞生,2014年RHEL/CentOS 7开始把 chrony 设为默认 NTP 实现,chronyc 随之成为系统标配工具。
chrony套件中一共有2个核心的成员:chronycchronyd。后者是 Chrony 套件里的常驻守护进程,负责持续收发 NTP 包、计算漂移、平滑调频,让系统时钟长期保持亚毫秒精度;前者是则是客户端工具,让用户可以进行ntp换源、实时读数、故障排除等操作。

1、chronyd(chrony daemon)

由于守护进程的特性,使得chrony天然就支持定时从ntp服务器中获取时间更新到系统时间上面。ntpdate命令是在执行命令的时候手动传入IP参数来指定ntp服务器的,chronyd则是通过读取/etc/chrony.conf配置来实现。

我们可以来看一下缺省的chrony.conf配置文件
server声明一台远端 NTP 服务器,接下来再配置ntp服务器的源,国内可以改成用阿里的ntp源(ntp.aliyun.com),最后是配置同步源的策略,一般默认的iburst就可以满足日常需要了。(首次上线或者服务断网重连的时候,会同时发8 个包,发完后恢复普通轮询,后续不再高速发包)。

server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
同步策略介绍
选项 含义 示例
iburst 初始 8 连发,秒级首同步 server ntp.aliyun.com iburst
burst 每次轮询都发 8 包,用于高抖动链路 server x.x.x.x burst
minpoll N 最小轮询间隔 2^N 秒 (默认 6→64 s) server x minpoll 4 # 16 s
maxpoll N 最大轮询间隔 2^N 秒 (默认 10→1024 s) server x maxpoll 8 # 256 s
prefer 同等条件下优先选此源 server x prefer
trust 永久信任,不做 falseticker 检测 server x trust
nomodify 禁止远程用 ntpdc/ntpq 改配置 allow 192.168/24 nomodify
noselect 算样本但不选为当前源(调试对比) server x noselect

到这里可能有读者会问,有多个ntp源的情况下,chrony怎么知道要选择哪个ntp服务器作为最终的ntp源呢?

chrony会实时给所有源打分——谁分最低(最稳定、最靠近真实时间)就把谁选为“当前源”(带 * 号),其余好的留作候补(+),差的直接剔除(-)。因此 “最后用的源”可能动态变化,甚至同时 合并多个源 做加权平均。

chronyd的启动及日常运维
systemctl enable --now chronyd     # 一次性完成启机+自启
systemctl restart chronyd          # 修改配置后重载
systemctl status  chronyd          # 看运行状态
2、chronyc(chrony client)

chronyc使用的前提是chronyd服务存在,本质上chronyc工具就是需要依赖chronyd才能完成工作的。我们可以利用这个工具来进行时间偏移量的查看、ntp数据源重载、手动调整时间等操作。

需求 命令
看总览 chronyc tracking
看上游 chronyc sources -v
立即跳变(>0.1 s) chronyc makestep 0.1 -1
禁止步进(只微调) chronyc maxupdateskew 100
重新加载上游 chronyc reload sources
统计漂移 chronyc sourcestats -v

需要注意的是chronyc不会直接把直接同步到硬件时间上,所以有这个需求的话,还是要结合hwclock来实现。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容