Linux 操作系统的计时方式主要是由 1970/01/01 开始计算总秒数,因此,如果你还记得 date 这个指令的话, 会发现它有个 +%s 的参数,可以取得总秒数,这个就是软件时钟。但,如同前面说的,计算机硬件主要是以 BIOS 内部的时间为主要的时间依据 (硬件时钟),而偏偏这个时间可能因为 BIOS 内部芯片本身的问题,而导致 BIOS 时间与标准时间 (UTC) 有一点点的差异存在!所以为了避免主机时间因为长期运作下所导致的时间偏差,进行时间同步 (synchronize) 的工作就显的很重要了!
- 软件时钟:由 Linux 操作系统根据 1970/01/01 开始计算的总秒数;
- 硬件时钟:主机硬件系统上面的时钟,例如 BIOS记录的时间;
那么怎么让时间同步化呢?想一想,如果我们选择几部主要主机 (Primary server) 调校时间,让这些 Primary Servers 的时间同步之后,再开放网络服务来让 Client 端联机,并且提供 Client 端调整自己的时间,不就可以达到全部的计算机时间同步化的运作了吗!那么什么协议可以达到这样的功能呢?那就是 Network Time Protocol ,另外还有 Digital Time Synchronization Protocol (DTSS) 也可以达到相同的功能!
网络时间协议NTP(Network Time Protocol)是TCP/IP协议族里面的一个应用层协议,用来使客户端和服务器之间进行时钟同步,提供高精准度的时间校正。NTP服务器从权威时钟源(例如原子钟、GPS)接收精确的协调世界时UTC,客户端再从服务器请求和接收时间。
NTP基于UDP报文进行传输,使用的UDP端口号为123。
NTP官方网站
NTP允许客户端从服务器请求和接收时间,而服务器又从权威时钟源(例如原子钟、GPS)接收精确的协调世界时UTC。
NTP以层级来组织模型结构,层级中的每层被称为Stratum。通常将从权威时钟获得时钟同步的NTP服务器的层数设置为Stratum 1,并将其作为主时间服务器,为网络中其他的设备提供时钟同步。而Stratum 2则从Stratum 1获取时间,Stratum 3从Stratum 2获取时间,以此类推。时钟层数的取值范围为1~16,取值越小,时钟准确度越高。层数为1~15的时钟处于同步状态;层数为16的时钟被认为是未同步的,不能使用的。
由于 NTP 时间服务器采用类似阶层架构 (stratum) 来处理时间的同步化, 所以他使用的是类似一般 server/client 的主从架构。网络社会上面有提供一些主要与次要的时间服务器, 这些均属于第一阶及第二阶的时间服务器 (stratum-1, stratum-2) ,如下所示:
- 主要时间服务器:http://support.ntp.org/bin/view/Servers/StratumOneTimeServers
- 次要时间服务器:http://support.ntp.org/bin/view/Servers/StratumTwoTimeServers
NTP最典型的授时方式是Client/Server方式,如下图所示:
同步原理:
- 客户端首先向服务端发送一个NTP请求报文,其中包含了该报文离开客户端的时间戳t1;
- NTP请求报文到达NTP服务器,此时NTP服务器的时刻为t2。当服务端接收到该报文时,NTP服务器处理之后,于t3时刻发出NTP应答报文。该应答报文中携带报文离开NTP客户端时的时间戳t1、到达NTP服务器时的时间戳t2、离开NTP服务器时的时间戳t3;
- 客户端在接收到响应报文时,记录报文返回的时间戳t4。
- 整个过程结束以后,服务端只知道t1,t2,t3三个时间戳,客户端则知道t1,t2,t3,t4四个时间戳,如下图所示:
客户端用上述4个时间戳参数就能够计算出2个关键参数:
- 延迟 (NTP报文从客户端到服务器的往返延迟delay)
- 偏差 (客户端与服务端之间的时间差offset)
根据方程组:
可以解得时间偏差为:
NTP客户端根据计算得到的offset来调整自己的时钟,实现与NTP服务器的时钟同步。
设备可以采用多种NTP工作模式进行时间同步:
- 单播服务器/客户端模式
- 对等体模式
- 广播模式
- 组播模式
- 多播模式
关于NTP工作模式的详细介绍请参考:https://support.huawei.com/enterprise/zh/doc/EDOC/e20379e
NTP 服务器也是一个很容易就可以架设成功的玩意儿,不过这个软件在不同的 distribution 上面可能有不一样的名称, 你要作的其实就是将他安装起来之后,规定一部上层 NTP 服务器来同步化你的时间即可啊! 如果你只是想要进行你自己单部主机的时间同步化,别架设 NTP ,直接使用 NTP 客户端软件即可喔!
这里推荐两个NTP网站帮助读者老爷们更加深入理解:
NTP好站1
NTP好站2
下面以CentOS为例,安装ntpd并实现时间同步,ntpd为一个时间同步守护进程,用于校正本地系统与时钟源服务器之前的时间,完整实现了NTP协议。ntpd 默认为客户端运行方式
参数详解:
- iburst:快速同步,iburst 选项会在客户端初始化时,连续地发送8个NTP请求。这样做是为了加速时钟同步的过程,因为通常在初始化时,时钟可能与服务器的时间相差较大。通过连续发送多个请求,客户端可以更快地收敛到与服务器的时间一致,从而减少时钟的偏差;
- minpoll 4:设置最小同步间隔为4秒;
- maxpoll4:设置最大同步间隔为4秒;
- prefer:设置优先使用本服务器;
- driftfile:因为预设的NTP Server本身的时间计算是依据BIOS的芯片震荡周期频率来计算的,但是这个数值与上层Time Server不见得一致。所以NTP 守护进程(ntpd) 会自动的去计自己主机的频率与上层Time server的频率,并且将两个频率的误差记录下来,记录下来的文件就是在driftfile后面接的完整文件名当中;
- restrict:管理权限控制 如果你没有在 parameter 的地方加上任何参数的话,这表示该IP或网段不受任何限制,没有限制需求不要配置restrict, 默认是不限制的。
- ignore: 拒绝所有类型的NTP联机;
- nomodify: 客户端不能使用ntpc与ntpq这两个程序来修改服务器的时间参数,但客户端仍可透过这个主机来进行网络校时;
- noquery: 客户端不能使用ntpq,ntpc等指令来查询时间服务器,等于不提供NTP的网络校时;
- notrap: 不提供trap这个远程事件登录(remote event logging)的功能;
- notrust: 拒绝没有认证的客户端;
- fudge 设置时间服务器的层级 fudge必须和server一块用, 而且是在server的下一行;
- stratum:层级 0~15(0:表示顶级 ,10:通常用于给局域网主机提供时间服务)
允许10.220.5.0/24网段主机进行时间同步
开放本机的所有权限 本机不受任何限制
允许上层时间服务器主动修改本机时间
改新端口号,直接在ip后面追加新端口号即可
指定ntp服务器地址
拒绝所有来源访问
这个指令可以列出我们的 NTP 服务器有跟上层联机否。由上述的输出结果可以知道,时间有校正约 1486毫秒,且每隔 64 秒会主动去更新时间喔!
- remote:亦即是 NTP 主机的 IP 或主机名啰~注意最左边的符号
- 『 * 』代表目前正在作用当中的上层 NTP
- 『 + 』代表也有连上线,而且可作为下一个提供时间更新的候选者
- 『 o 』PPS 节点
- 『 # 』良好的远程节点或服务器但是未被使用
- 『 - 』表示为不合格的ntp服务器
- 『 x 』已不再使用
- 『 』被丢弃的
- refid:参考的上一层 NTP 主机的地址
- st:层次 远程节点或服务器的 stratum 层级
- t:远程NTP服务器的时钟类型。u 表示未确定,s 表示本地挂钟,l 表示本地原子钟,f 表示外部参考源。
- when:几秒钟前曾经做过时间同步化更新的动作 (默认单位为秒, “h”表示小时,“d”表示天)
- poll:下一次更新在几秒钟之后
- reach:已经向上层 NTP 服务器要求更新的次数
- delay:延迟从本地到远程节点或服务器通信的往返时间(毫秒)
- offset:时间补偿结果 主机与远程节点或服务器时间源的时间偏移量,(毫秒)
- jitter:Linux 系统时间与 BIOS 硬件时间的差异时间(毫秒)
NTP 协议是高精度的,使用的精度小于纳秒(2的 -32 次方)。主机的时间精度和其他参数(受硬件和操作系统限制)使用命令 查看。
- precision 为四舍五入值,且为 2 的幂数。因此精度为 2precision (秒)
- rootdelay – 与同步网络中主同步服务器的总往返延时。注意这个值可以是正数或者负数,取决于时钟的精度。
- rootdisp – 相对于同步网络中主同步服务器的偏差(秒)
- tc – NTP 算法 PLL (phase locked loop,锁相环路)或 FLL (frequency locked
loop,锁频回路) 时间常量 - mintc – NTP 算法 PLL/FLL 最小时间常亮或“最快响应
- offset – 由结合算法得出的系统时钟偏移量(毫秒)
- frequency – 系统时钟频率
- sys_jitter – 由结合算法得出的系统时钟平均偏差(毫秒)
- clk_jitter – 硬件时钟平均偏差(毫秒)
- clk_wander – 硬件时钟偏移(PPM – 百分之一)
配置方法:/etc/sysconfig/ntpd文件中添加 SYNC_HWCLOCK=yes ,然后重启NTP服务。
- 你的 NTP 服务器时间不可与上层差异太多。本地时钟与远端的NTP服务器时钟相差大于1000s时,ntpd会停止工作。在启动NTP时加了参数“-g”就可以忽略1000S的问题。举例来说,测试 NTP 服务器约在 2024/7/28 下午, 如果我的服务器时间原本是错误的 2023/7/28,足足差了一年,那么上层服务器恐怕就不会将正确的时间传给我! 这时就会造成困扰了!
- 服务器防火墙在 UDP port 123 有没有开啊?要特别注意!
- 等待的时间够不够长? NTP 等过最久的时间大约是一小时!你有等这么久过否?
- 上述的 ntpstat 以及 ntpq -p 的输出结果中,你的 NTP 服务器真的要能够连结上层 NTP 才行喔! 否则你的客户端将无法对你的 NTP 服务器进行同步更新的!重要重要!
- 如果remote状态最左边的符号为空(或者是由 * 号转变为空),说明此服务器被丢弃了,可能是时钟抖动太大造成的,可以网络抓取NTP协议包(eth0替换为自己的网卡,a.pcap为保存文件) ,用 Wireshark 打开:
这个问题就会导致ntpd刚开始可以同步上显示 * 号,过一会发现主时钟抖动太大就丢弃了不在跟踪,所以此时 * 号就变为空了,这都是本人亲历的现象,特意分享出来方便大家以后遇到类似的问题知道怎么解决。
解除防火墙限制,NTP 服务的端口是 123,使用的是 udp 协议,所以 NTP 服务器的防火墙必须对外开放 udp 123 这个端口。
如果防火墙使用 iptables,执行以下命令:
如果防火墙使用 firewalld,执行以下命令:
在 Linux 的环境当中可利用 NTP 的客户端程序,亦即是 ntpdate 这支程序就能够进行时间的同步化。 不过你要知道的是,因为 NTP 服务器本来就会与上层时间服务器进行时间的同步化, 所以在预设的情况下,NTP 服务器不可以使用 ntpdate !也就是说 ntpdate 与 ntpd 不能同时启用的。 所以你不要在 NTP server 上头执行这个指令呦!我们就来看看如何处理吧!
命令是 NTP 的客户端软件,它可以用于请求时间同步。
语法:
ntp_server 可以从文章末尾的 NTP服务器 中选择
示例:
如果需要自动定时同步时间,可以利用 Crontab 工具。本质就是用 crontab 定时执行一次手动时间同步命令 ntp。
示例:执行如下命令,就可以在每天凌晨 3 点同步系统时间:
以下 NTP 服务器搜集自网络:
可参考:公共 NTP 网络时间服务器
cn.ntp.org.cn # 中国
edu.ntp.org.cn # 中国教育网
ntp.aliyun.com # 阿里云
ntp.tencent.com # 腾讯云
ntp.sjtu.edu.cn # 上海交通大学
s1a.time.edu.cn #北京邮电大学
s1b.time.edu.cn # 清华大学
s1c.time.edu.cn # 北京大学
s1d.time.edu.cn# 东南大学
s1e.time.edu.cn # 清华大学
s2a.time.edu.cn # 清华大学
s2b.time.edu.cn # 清华大学
s2c.time.edu.cn # 北京邮电大学
s2d.time.edu.cn # 西南地区网络中心
s2e.time.edu.cn # 西北地区网络中心
s2f.time.edu.cn # 东北地区网络中心
s2g.time.edu.cn # 华东南地区网络中心
s2h.time.edu.cn # 四川大学网络管理中心
s2j.time.edu.cn # 大连理工大学网络中心
s2k.time.edu.cn # CERNET桂林主节点
文章参考
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/6833.html