Linux: 时间同步
- TAGS: Linux
时间同步
计时方式
古代计时方式
在远古时期,人类用来确定时间的方式是一些自然界“相对”亘古不变的周期。 如地球的公转是为一年,月球的公转是为一月,地球的自转是为一天等,最早的 计时可以追溯到公元前大约2000年,古埃及人利用光线留下的影子用作计时的工 具。影子拉得越长,计时越精确。古埃及人修建高耸入云的大型方尖碑,来追踪 太阳的移动,随后人们又利用了沙漏、日晷、钟摆等工具,巧妙地利用一些相对 固定而准确的周期来计时
商朝人开发并使用了一种泄水型水钟-–—漏壶。后来又有用蜡烛和线香计时的 北宋元祐元年(1086年),天文学家苏颂将浑仪、浑象和报时装置结合,建造一 个划时代的计时工具-–—"水运仪象台"
14世纪时,西方国家广泛使用机械钟。在十六世纪,奥斯曼帝国的科学家达兹· 艾-丁(Taqi al-Din)发明出了机械闹钟1583年,伽利略提出了著名的等时性理 论,即不论摆动幅度的大小,完成一次摆动的时间是相同的。1656年,荷兰科学 家克里斯蒂安·惠更斯(Christiaan Huygens)应用他的理论,设计出了世界第 一只钟摆 1868年,百达翡丽(Patek Philippe)发明了手表
现代计时方式
石英晶体受到电池的电力影响时,会产生规律的振动。每秒的振动次数是32768 次,可以设计电路来计算振动次数,当计数到32768次时,即计时1秒。1967年, 瑞士人发布了世界上首款石英表
当原子从一个相对高的“能量态”迁至低的“能量态”时,会释放出电磁波,产 生共振频率。依据此原理,拉比构想出了一种全新的计时仪器-–—原子钟 (Atomic clock)
因为原子的共振频率是固定的。如:铯原子(Caesium133)的固有频率是 9192631770赫兹,约合92亿赫兹,对铯原子钟计数9192631770次,即可测量出一 秒钟。很多国家(包括我国和美国NIST)的标准局,就是用铯原子钟来作为时间 精度标准的。GPS系统也是用铯原子钟来计时
2008年诞生的锶(Strontium87)原子钟,固有频率为429228004229873,约合 430万亿赫兹,将精度提高到了10的17次方
2013年镱元素(ytterbium)制成的原子钟问世,镱原子钟的固有频率约合518万 亿赫兹,精度高达10的18次方。宇宙的年龄为138亿年。如果这台镱原子钟从宇 宙诞生之初就开始计时,直到今天也不会发生1秒的误差
范例:一次性的同步
[root@Centos7 ~]#date -s '-1 year' Sun May 26 11:08:30 CST 2019 [root@Centos7 ~]#date Sun May 26 11:08:32 CST 2019 [root@Centos7 ~]#ping ntp.aliyun.com PING ntp.aliyun.com (203.107.6.88) 56(84) bytes of data. 64 bytes from 203.107.6.88 (203.107.6.88): icmp_seq=1 ttl=128 time=29.4 ms 64 bytes from 203.107.6.88 (203.107.6.88): icmp_seq=2 ttl=128 time=42.3 ms [root@Centos7 ~]#ntpdate ntp.aliyun.com 26 May 11:09:12 ntpdate[2236]: step time server 203.107.6.88 offset 31622401.067788 sec [root@Centos7 ~]#date Tue May 26 11:09:18 CST 2020
时间同步服务
加密和安全当前都离不开时间的同步,否则各种网络服务可能不能正常运行
时间同步服务
多主机协作工作时,各个主机的时间同步很重要,时间不一致会造成很多重要应 用的故障,如:加密协议,日志,集群等,利用NTP(Network Time Protocol) 协议使网络中的各个计算机时间达到同步。目前NTP协议属于运维基础架构中必 备的基本服务之一
虽然主机的cpu频率是固定的,时间计算准确,但随着服务占用cpu时间片越来越 多时间也就不准确了,需要定期同步时间。利用互联网公用的原子钟时间服务做 同步。
时间同步软件实现:
- ntp
- chrony (centos7+推荐使用)
ntp :
将系统时钟和世界协调时UTC同步,精度在局域网内可达0.1ms,在互联网上绝大 多数的地方精度可以达到1-50ms
项目官网:http://www.ntp.org
chrony :
实现NTP协议的的自由软件。可使系统时钟与NTP服务器,参考时钟(例如GPS接 收器)以及使用手表和键盘的手动输入进行同步。还可以作为NTPv4(RFC 5905) 服务器和对等体运行,为网络中的计算机提供时间服务。设计用于在各种条件下 良好运行,包括间歇性和高度拥挤的网络连接,温度变化(计算机时钟对温度敏 感),以及不能连续运行或在虚拟机上运行的系统。
通过Internet同步的两台机器之间的典型精度在几毫秒之内,在LAN上,精度通 常为几十微秒。利用硬件时间戳或硬件参考时钟,可实现亚微秒的精度
NTP
NTP简介
NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时 间同步的一种协议。它的用途是把计算机的时钟同步到世界协调时UTC,其精度 在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms。
NTP服务器就是利用NTP协议提供时间同步服务
相关的命令和配置文件
- /etc/ntp.conf: linux各版本虽然目录不同,但文件名相同。可以用which ntp.conf 或者locate ntp.conf来查找。这是NTP唯一的一个设置文件。
/usr/share/zoneinfo/
: 这个里面规定了这个主要时区的时间设置文件。/etc/sysconfig/clock:这个文件是linux的主要时区设置文件,每次开机后 linux会自动读取这个文件来设置系统所默认的显示时间,可以看看它里面到 底设置了什么:
cat /etc/sysconfig/clock # The ZONE parameter is only evaluated by system-config-date. # The timezone of the system is defined by the contents of /etc/localtime. ZONE="Asia/Shanghai" UTC=true ARC=false
- /etc/localtime: 本地端时间配置文件。
- /bin/date: 这个是时间的修改命令,除了输出时间,还可以修改时间。
- /sbin/hwclock:因为linux系统上面BIOS时间与linux系统时间是分开的,所以 使用date这个指令调整了时间之后,还需要使用hwclock才能将修改过的时间 写入BIOS中。
- /usr/sbin/ntpd:这是NTP的daemon文件,需要启动它才能提供NTP服务,这个 命令会读取/etc/ntp.conf里面的设置。
- /usr/sbin/ntpdate: 这是client用来连接NTP Server的主要执行文件,如果 您不想启用NTP,只想启用NTP Client功能的话,可以只应用此命令。
- /usr/sbin/ntptrace: 可以用来追踪某台时间服务器的时间对应关系。
NTP服务器安装
系统自带ntp
rpm -qa ntp ntp-4.2.6p5-5.el6.centos.x86_64 如果没有就安装 yum -y install ntp
配置NTP服务
[root@o ~]# vim /etc/ntp.conf # restrict default kod nomodify notrap nopeer noquery restrict default nomodify # nomodify客户端可以同步 # 允许内网其他机器同步时间 restrict 172.16.1.0 mask 255.255.255.0 nomodify notrap # 定义使用的上游 ntp服务器,将原来的注释 server ntp1.aliyun.com server time.nist.gov # 允许上层时间服务器主动修改本机时间 restrict ntp1.aliyun.com nomodify notrap noquery # 外部时间服务器不可用时,以本地时间作为时间服务 server 127.127.1.0 fudge 127.127.1.0 stratum 10 # 计算本ntp server 与上层ntpserver的频率误差 driftfile /var/lib/ntp/drift # Key file containing the keys and key identifiers used when operating # with symmetric key cryptography. keys /etc/ntp/keys #日志文件 logfile /var/log/ntp.log
配置说明
restrict [address] mask [netmask_ip] [parameter] 其中parameter的参数主要有: ignore : 拒绝所有类型的ntp连接 nomodify : 客户端不能使用ntpc与ntpq两支程式来修改服务器的时间参数 noquery : 客户端不能使用ntpq、ntpc等指令来查询服务器时间,等于不提供ntp的网络校时 notrap : 不提供trap这个远程时间登录的功能 notrust : 拒绝没有认证的客户端 nopeer : 不与其他同一层的ntp服务器进行时间同步
启动NTP服务器
# 如果计划任务有时间同步,先注释,两种用法会冲突。 [root@o ~]# crontab -e # time sync #*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1 [root@o ~]# systemctl status ntpd #/etc/init.d/ntpd start #/usr/sbin/ntpd -u ntp:ntp -g #查看ntp服务器与上层ntp服务器的状态:ntpq [root@o ~]# ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *ntp1.aliyun.com 10.137.38.86 2 u 22 64 1 525.885 -42.367 0.000 # 其中: # remote - 本机和上层ntp的ip或主机名,“+”表示优先,“*”表示次优先 # refid - 参考上一层ntp主机地址 # st - stratum阶层 # when - 多少秒前曾经同步过时间 # poll - 下次更新在多少秒后 # reach - 已经向上层ntp服务器要求更新的次数 # delay - 网络延迟 # offset - 时间补偿 # jitter - 系统时间与bios时间差 #如果所有远程服务器的jitter值是4000并且delay和reach的值是0,那么说明时间同步是有问题的。 #可能的原因是防火墙阻断了与server之间的通讯,即123端口是否正常开放; # 查看ntp服务器有无和上层连通 [root@o ~]# ntpstat synchronised to NTP server (110.75.186.247) at stratum 3 time correct to within 4257 ms polling server every 64 s 查看ntp服务器与上层间的联系:ntptrace ntptrace -n 127.0.0.1 127.0.0.1: stratum 3, offset -0.001095, synch distance 0.532610 116.193.83.174: timed out, nothing received # 同步 [root@o ~]# ntpdate 10.0.0.9 7 Dec 18:43:07 ntpdate[26950]: the NTP socket is in use, exiting ntpdate time.windows.com
客户机时间同步
客户机要等几分钟再与新启动的ntp服务器进行时间同步,否则会提示no server suitable for synchronization found错误。
[root@zyops ~]# ntpdate 10.0.0.9 7 Dec 18:40:16 ntpdate[1453]: step time server 10.0.0.9 offset 40.880807 sec # 将命令放入计划任务即可。
Chrony
Chrony介绍
chrony 的优势:
- 更快的同步只需要数分钟而非数小时时间,从而最大程度减少了时间和频率误 差,对于并非全天24小时运行的虚拟计算机而言非常有用
- 能够更好地响应时钟频率的快速变化,对于具备不稳定时钟的虚拟机或导致时 钟频率发生变化的节能技术而言非常有用
- 在初始同步后,它不会停止时钟,以防对需要系统时间保持单调的应用程序造成影响
- 在应对临时非对称延迟时(例如,在大规模下载造成链接饱和时)提供了更好的稳定性
- 无需对服务器进行定期轮询,因此具备间歇性网络连接的系统仍然可以快速同步时钟
chrony官网:https://chrony.tuxfamily.org
chrony官方文档:https://chrony.tuxfamily.org/documentation.html
chrony与ntp都是时间同步软件
两个软件不能够同时开启,会出现时间冲突。建议配置ntp较为简单,使用方便。
Chrony 文件组成
包:chrony
两个主要程序:chronyd和chronyc
- chronyd:后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务 器同步。它确定计算机增减时间的比率,并对此进行补偿
- chronyc:命令行用户工具,用于监控性能并进行多样化的配置。它可以在 chronyd实例控制的计算机上工作,也可在一台不同的远程计算机上工作
服务unit 文件: /usr/lib/systemd/system/chronyd.service
监听端口:323/udp,123/udp
配置文件: /etc/chrony.conf
yum install -y chrony systemctl start chronyd.service systemctl enable chronyd.service
配置文件chrony.conf
chrony服务使用的配置文件为/etc/chrony.conf,即充当服务端可以当客户端其 配置内容格式和ntpd服务基本相似
$ cat /etc/chrony.conf # 使用pool.ntp.org项目中的公共服务器。以server开,理论上你想添加多少时间服务器都可以。 #当服务端,改3处 pool或server、allow、local pool ntp1.aliyun.com iburst #server ntp1.aliyun.com iburst #pool 该指令的语法与server 指令的语法相似,不同之处在于,它用于指定NTP服务器池而不是单个NTP服务器。池名称应解析为可能随时间变化的多个地址 # 指定一台主机、子网,或者网络以允许或拒绝NTP连接到扮演时钟服务器的机器,监听地址变为0.0.0.0:123 #allow 0.0.0.0/0 #allow 192.168.0.0/16 #deny 192.168/16 # 外部时间服务器不可用时,以本地时间作为时间服务 local stratum 10 #当客户端 #server ntp1.aliyun.com iburst #pool ntp1.aliyun.com iburst #----------下面配置一般不用改动------------------------ # 根据实际时间计算出服务器增减时间的比率,然后记录到一个文件中,在系统重启后为系统做出最佳时间补偿调整。 driftfile /var/lib/chrony/drift # chronyd根据需求减慢或加速时间调整, # 在某些情况下系统时钟可能漂移过快,导致时间调整用时过长。 # 该指令强制chronyd调整时期,大于某个阀值时步进调整系统时钟。 # 只有在因chronyd启动时间超过指定的限制时(可使用负值来禁用限制)没有更多时钟更新时才生效。 makestep 1.0 3 # 将启用一个内核模式,在该模式中,系统时间每11分钟会拷贝到实时时钟(RTC)。 rtcsync # Enable hardware timestamping on all interfaces that support it. # 通过使用hwtimestamp指令启用硬件时间戳 #hwtimestamp eth0 #hwtimestamp eth1 #hwtimestamp * # Increase the minimum number of selectable sources required to adjust # the system clock. #minsources 2 # 指定一台主机、子网,或者网络以允许或拒绝NTP连接到扮演时钟服务器的机器,监听地址变为0.0.0.0:123 #allow 0.0.0.0/16 #allow 192.168.0.0/16 #deny 192.168/16 # 外部时间服务器不可用时,以本地时间作为时间服务 local stratum 10 # 指定包含NTP验证密钥的文件。 #keyfile /etc/chrony.keys # 指定日志文件的目录。 logdir /var/log/chrony
参数说明
server - 可用于时钟服务器,iburst 选项当服务器可达时,发送一个八个数据包而不是通常的一个数据包。 包间隔通常为2秒,可加快初始同步速度 driftfile - 根据实际时间计算出计算机增减时间的比率,将它记录到一个文件中,会在重启后为系统时钟作出补偿 rtcsync - 启用内核模式,系统时间每11分钟会拷贝到实时时钟(RTC) allow / deny - 指定一台主机、子网,或者网络以允许或拒绝访问本服务器 cmdallow / cmddeny - 可以指定哪台主机可以通过chronyd使用控制命令 bindcmdaddress - 允许chronyd监听哪个接口来接收由chronyc执行的命令 makestep - 通常chronyd将根据需求通过减慢或加速时钟,使得系统逐步纠正所有时间偏差。在某些特定情况下,系统时钟可能会漂移过快,导致该调整过程消耗很长的时间来纠正系统时钟。该指令强制chronyd在调整期大于某个阀值时调整系统时钟 local stratum 10 - 即使server指令中时间服务器不可用,也允许将本地时间作为标准时间授时给其它客户端 stratumweight 指令设置当chronyd从可用源中选择同步源时,每个层应该添加多少距离到同步距离。默认情况下,CentOS中设置为0,让chronyd在选择源时忽略源的层级
Chronyc 命令
chronyc 可以运行在交互式和非交互式两种方式,支持以下子命令
help 命令可以查看更多chronyc的交互命令 accheck 检查是否对特定主机可访问当前服务器 activity 显示有多少NTP源在线/离线 sources [-v] 显示当前时间源的同步信息 sourcestats [-v]显示当前时间源的同步统计信息 add server 手动添加一台新的NTP服务器 clients 报告已访问本服务器的客户端列表 delete 手动移除NTP服务器或对等服务器 settime 手动设置守护进程时间 tracking 显示系统时间信息
范例:
# 查看时间同步源: chronyc sources -v # 查看时间同步源状态: chronyc sourcestats -v #设置硬件时间 # 硬件时间默认为UTC: timedatectl set-local-rtc 1 # 启用NTP时间同步: timedatectl set-ntp yes # 校准时间服务器: chronyc tracking
范例:
[root@centos8 ~]#chronyc chrony version 3.5 Copyright (C) 1997-2003, 2007, 2009-2019 Richard P. Curnow and others chrony comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. See the GNU General Public License version 2 for details. chronyc> clients Hostname NTP Drop Int IntL Last Cmd Drop Int Last =============================================================================== 10.0.0.77 4 0 1 - 118m 0 0 - - chronyc> activity 200 OK 2 sources online 0 sources offline 0 sources doing burst (return to online) 0 sources doing burst (return to offline) 0 sources with unknown address 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 =============================================================================== ^+ 203.107.6.88 2 6 377 60 +3649us[+3649us] +/- 28ms ^* 120.25.115.20 2 6 377 62 +5670us[-1041ms] +/- 27ms
公共NTP服务
- pool.ntp.org:项目是一个提供可靠易用的NTP服务的虚拟集群 cn.pool.ntp.org,0-3.cn.pool.ntp.org
阿里云公共NTP服务器
Unix/linux类:ntp.aliyun.com,ntp1-7.aliyun.com
windows类: time.pool.aliyun.com和 time.nist.gov
Mac OS X 上自带的俩个:time.apple.com 和 time.asia.apple.com
大学ntp服务
s1a.time.edu.cn 北京邮电大学
s1b.time.edu.cn 清华大学
s1c.time.edu.cn 北京大学
- 国家授时中心服务器:210.72.145.44
时间工具
- timedatectl 时间和时区管理
# 查看日期时间、时区及NTP状态: timedatectl # 查看时区列表: timedatectl list-timezones # 修改时区: timedatectl set-timezone Asia/Shanghai # 设置完时区后,强制同步下系统时钟: chronyc -a makestep # 修改日期时间: timedatectl set-time "2017-01-23 10:30:00"(可以只修改其中一个) # 开启NTP: timedatectl set-ntp true/false timedatectl set-timezone UTC # 将本地时区设置为协调世界时(UTC)
- ntpdate 时间同步命令
- system-config-date:图形化配置chrony服务的工具
时区:
配置文件:/etc/localtime
时区列表目录:/usr/share/zoneinfo/
范例
yum install -y chrony #配置 cat>/etc/chrony.conf<<EOF server ntp1.aliyun.com iburst minpoll 4 maxpoll 10 server cn.pool.ntp.org iburst minpoll 4 maxpoll 10 server s1b.time.edu.cn iburst minpoll 4 maxpoll 10 stratumweight 0 driftfile /var/lib/chrony/chrony.drift rtcsync makestep 1.0 3 bindcmdaddress 127.0.0.1 keyfile /etc/chrony/chrony.keys logdir /var/log/chrony logchange 1 EOF systemctl start chronyd.service systemctl enable chronyd.service timedatectl set-timezone Asia/Shanghai # 修改时区 chronyc -a makestep # 强制同步下系统时钟 timedatectl set-ntp yes #启用NTP时间同步