$ timedatectl status
Local time: 六 2021-01-30 23:58:51 CST
Universal time: 六 2021-01-30 15:58:51 UTC
RTC time: 六 2021-01-30 15:58:51
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
# 查看时区清单
timedatectl list-timezones | grep -E "Asia/S.*"
# 选择上海时区
timedatectl set-timezone Asia/Shanghai
# 强制同步系统时钟
chronyc -a makestep
timedatectl set-time "2019-10-31 15:50:00"
timedatectl set-local-rtc
# or
hwclock --systohc --localtime
hwclock --hctosys
timedatectl set-ntp yes/no
NTP(Network Time Protocol,网络时间同步协议)是一种用来进行计算机时间同步的协议,由特拉华大学的 David L. Mills 设计,位于 OSI 模型的应用层。自 1985 年以来,NTP 是目前仍在使用的最古老的互联网协议之一。
NTP 时钟源可以是 NTP Server 或 GPS。NTP 提供了一种高精准度的时间校正服务:LAN 环境中,时钟偏差小于 1ms;WAN 环境中,时钟偏差在 1-50ms 之间。NTP 还支持加密认证(Authentication)机制,以防止中间人攻击。
NTP 的目的是在无序的 Internet 环境中提供精确且健壮的时间同步(校正)服务,在分布式时间敏感的系统至关重要。
在 Internet 中,NTP Server 用于提供准确的时间,首先就要有准确的时钟源,并且这一时钟源应该是 UTC 的(注:世界上最准确的时间是使用原子时钟(Atomic clock)所计算的,UTC 就是其中一例)。NTP Server 获得 UTC 的时钟可以是:原子钟、天文台、卫星等,称之为独立的时间源。
为适应 Internet 的层次结构,NTP 也采用了 Stratum(层级)时间分布模型。有了准确且可靠的时钟源之后,时间就会按照 NTP Server 的 Stratum 进行传播。
Stratum 的层级高低由距离时钟源的远近决定,独立的时间源为 Stratum-0,直接连接到 Stratum-0 的设备为 Stratum-1,Stratum-1 则从 Stratum-0 获取时钟;直接连接到 Stratum-1 的设备为 Stratum-2,Stratum-2 则从 Stratum-1 获取时钟,以此类推。
NTP 规定 Stratum 的总层数限制在 15 以内,而 Stratum-1 则作为整个 NTP 系统的基础。当下层 Stratum-X 从多个上层 Stratum-Y 中获取时钟源时,则需要利用统计学的算法来选择出最佳的路径并以此校正本地时间。
国内 NTP 服务器:
cn.pool.ntp.org # 最常用的国内 NTP 服务器,参考:https://www.ntppool.org/zh/use.html
cn.ntp.org.cn # 中国
edu.ntp.org.cn # 中国教育网
ntp1.aliyun.com # 阿里云
ntp2.aliyun.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桂林主节点
Chrony 是由 RedHat 开发的,NTP 协议的另一种实现,作为 ntpd 的替代品。在 RHEL/CentOS 7.x 中作为默认安装的时间同步工具。Chrony 可以同时做为 NTP Server 或 NTP Client。
Chrony 专为间歇性互联网连接的系统而设计,也能良好应用于持久互联网连接的环境。Chrony 可以在各种复杂的环境中良好运行,包括:间歇性网络连接环境、高拥挤网络连接环境、温度变化环境(计算机时钟对温度敏感),以及不能连续运行的、或在虚拟机上运行的操作系统。
Chrony 具有两个核心组件:
Chrony 与 ntpd 的对比:
Chrony 相较于 ntpd 的优势:
安装:
yum -y install chrony
systemctl status chronyd
systemctl enable chrony
配置:/etc/chrony.conf
server hostname [option]
:指定 NTP Server。具有以下 options。
bindcmdaddress
:指定 chronyd 监听的网络接口。
allow/deny
:NTP Client 的 ACL 限制,支持精确 IP 和 CIDR。
cmdallow/cmddeny
:NTP CLI 的 ACL 限制,支持精确 IP 和 CIDR。
makestep threshold limit
:通常 chronyd 会将根据需求通过 “加速/减慢” 的方式逐步纠正系统的时间偏移。但在某些特定情况下,该调整过程会消耗很长的时间,所以 makestep 指令用于强制 chronyd 在调整期大于某个域值时,直接进行 “跳跃式” 校时。例如:makestep 1.0 3 表示头三次校时,如果时间相差 1.0s, 则进行跳跃式校时,而不是 “加速/减慢” 式校时。
local stratum 10
:表示即使 server 指令中 NTP Server 不可用了,也允许使用本地时间作为标准时间源同步到其它的客户端。
rtcsync
:指定启用内核模式,系统时间每 11 分钟间隔就会拷贝到硬件时间。
logdir
:指定日志文件路径。
driftfile file
:指定根据实际时间计算出 “增/减” 时间差的比率,并将补偿参数记录到一个文件中,会在机器重启后为系统时钟作出补偿。默认为 /var/lib/chrony/drift。
NOTE:chrony 与 ntpd 最大的区别就是:时间的修正是连续进行的,而 ntpd 需要搭配 Crontab 来自动定时同步时间,本质就是用 crontab 定时执行一次手动时间同步命令 ntp,因此会出现间断。
配置示例:
# 指定上层 NTP 服务器为阿里云提供的公网 NTP 服务器。
server ntp1.aliyun.com iburst minpoll 4 maxpoll 10
server ntp2.aliyun.com iburst minpoll 4 maxpoll 10
server ntp3.aliyun.com iburst minpoll 4 maxpoll 10
server ntp4.aliyun.com iburst minpoll 4 maxpoll 10
# 当阿里云提供的公网 NTP 服务器不可用时,采用本地时间作为同步标准。
local stratum 8
# 让 chronyd 在选择源时忽略源的层级。
stratumweight 0
# 记录系统时钟获得/丢失时间的速率至 drift 文件中。
driftfile /var/lib/chrony/drift
# 启用 RTC(实时时钟)的内核同步。
rtcsync
# 如果系统时钟的偏移量大于 10 秒,则允许在前三次更新中步进式的调整系统时钟。
makestep 10 3
# 只允许 192.168.1 网段的客户端进行时间同步。
allow 192.168.1.0/24
# 指定包含 NTP 验证密钥的文件。
keyfile /etc/chrony.keys
# 如果时钟调整大于 0.5 秒,则向系统日志发送消息。
logchange 0.5
# 指定存放日志文件的目录。
logdir /var/log/chrony
# 禁用客户端访问的日志记录
noclientlog
# Select which information is logged.
log measurements statistics tracking
$ chronyc tracking
Reference ID : A29FC801 (time.cloudflare.com) # 当前进行时间同步的参考。
Stratum : 4 # 连接参考时钟的跳数。
Ref time (UTC) : Sat Jan 30 13:36:04 2021 # 参考时间。
System time : 0.003950741 seconds fast of NTP time # 系统时间。
Last offset : +0.001695401 seconds # 最后一次时间校对偏移量。
RMS offset : 0.001266512 seconds # RMS 偏移,偏移值的长期平均值。
Frequency : 5.060 ppm slow # 系统的时钟错误的频率,单位为 ppm(百万分率)。
Residual freq : +0.000 ppm # 残余频率,表示参考源的测量值与当前使用的频率之间的差异。
Skew : 0.010 ppm # 偏斜,估计频率的误差界限。
Root delay : 0.228649795 seconds # 根延迟,网络路径延迟到计算机正在同步的层计算机的总和。
Root dispersion : 0.010007298 seconds
Update interval : 15499.7 seconds # 说明最后两次更新的时间间隔。
Leap status : Normal # 跳跃状态,枚举:正常、插入秒、删除秒、或不同步。
$ chronyc sources -v
210 Number of sources = 4
.-- 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
===============================================================================
^+ ntp16.doctor.com 2 10 127 49m +24ms[ +24ms] +/- 169ms
^* time.cloudflare.com 3 10 271 121m +26ms[ +28ms] +/- 145ms
^+ lax1.nonce.monster 2 10 377 200m -6349us[-4660us] +/- 161ms
^+ ntp1.ams1.nl.leaseweb.net 2 10 277 402 -788us[ -788us] +/- 153ms
$ chronyc sourcestats -v
210 Number of sources = 4
.- 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
==============================================================================
ntp16.doctor.com 6 3 15h +0.320 0.949 +14ms 1099us
time.cloudflare.com 64 30 69h -0.003 0.009 -6159us 1469us
lax1.nonce.monster 7 3 137m +0.126 0.186 -4871us 165us
ntp1.ams1.nl.leaseweb.net 37 19 11h +0.048 0.059 -1273us 1203us
$ chronyc activity
200 OK
4 sources online
0 sources offline
0 sources doing burst (return to online)
0 sources doing burst (return to offline)
0 sources with unknown address
$ journalctl -u chronyd
$ chronyc accheck <server>
$ chronyc add server <server>
$ chronyc delete <server>
$ chronyc settime
要将 Chrony 作为一个 NTP Server,方法很简单。
allow 192.168.1.0/24 # ACL 限制。
bindcmdaddress 0.0.0.0 # chronyd 监听接口。
local stratum 10 # 即使服务器没有上层时间源,也可使用本地时间作为时钟源。
systemctl restart chronyd
占用端口: