NTP时间同步
#
1. 时区及GMT
地球共分为24个时区,按一圈360度计算,每个时区的跨度是15度。国际上约定以0度经线穿过的城市格林威治的时间作为标准时间(Greenwich Mean Time, GMT时间),因此,在格林威治以东的时区,时间递增,而以西的时区时间递减。
图1:地球的子午线、经纬度与时区题
以北京为例,北京所在地约为东经120度左右,又因为北京在格林威治的东方,因此北京本地时间(local time)会比GMT时间快8小时(GMT + 8)。
2. UTC
GMT时间是以太阳通过格林威治的那一刻来作为计时的标准。但是地球自转的轨道以及公转的轨道并非正圆,加上地球的自转速度有逐年递减的问题,所以这个GMT时间与我们目前计时的时间有些误差。
在计算时间的时候,最准确的计算应该是使用原子震荡周期所计算的物理时钟了(也被称为原子钟),这也被定义为标准时间(International Atomic Time)。而我们常常看见的UTC(Coordinated Universal Time)就是利用这种Atomic Clock为基准所定义出来的正确时间。例如1999年在美国启用的原子钟NIST F-1,他所产生的时间误差每两千年才差一秒钟。这个UTC标准时间虽然与GMT时间放在同一个时区为基准,不过由于计时的方式不同,UTC时间与GMT时间有差不多16分钟的误差。UTC已经被认定为是国际标准,所以我们都应该遵守标准使用UTC。
假如现在中国当地的时间是晚上8点的话,我们可以有下面两种表示方式:
- 20:00 CST
- 12:00 UTC
这里的CST是Chinese Standard Time,也就是我们通常所说的北京时间了。因为中国处在UTC+8时区,也可以计时为12:00 UTC。
因此,不管通过任何渠道,我们想要同步系统的时间的话,通常提供方只会给出UTC+0的时间值而不会提供时区,因为它不知道你在哪里。所以当我们设置系统时间的时候,设置好时区是首先要做的工作。
3. Real Time Clock(RTC)和System Clock
在计算机中,我们使用的时间标准是UTC。计算机拥有两个时钟:硬件时钟(RTC)、系统时钟(System Clock)。
硬件时钟是嵌在主板上的特殊的电路, 就是我们在BIOS上看到的时钟,它的存在是为了我们关机之后还可以计算时间。
系统时钟是操作系统的kernel所用来计算时间的时钟. 它是从1970年1月1日00:00:00到目前为止的秒数总和。在Linux下,系统时间在开机的时候会和硬件时间同步,即将硬件时间写入系统时间,之后就各自独立运行了。
既然两个时钟独自运行,那么时间久了必然就会产生误差了,因此需要对硬件时钟和系统时钟进行校准操作。
下面列出了在Linux上对时钟的一些操作:
1)查看系统时钟(System Clock)
# date
2019年10月10日 星期四 16:21:32 CST
# 修改系统时间
# date -s "dd/mm/yyyy hh:mm:ss"
2)查看硬件时钟(RTC)
# hwclock --show
2019-10-10 16:20:09.900552+0800
# 把硬件时间设置成系统时间
# hwclock --hctosys
# 把系统时间设置成硬件时间
# hwclock –systohc
# 如果想设置指定的硬件时间,我们可以在BIOS里设定.也可以直接用hwclock命令
# hwclock --set --date="mm/dd/yy hh:mm:ss"
如果硬件时间和系统时间都不准确,那我们就需要一个可以提供我们准确时间的服务器,然后通过一种协议来同步我们的系统时间,这个协议就是NTP。注意接下去我们所要说的同步就都是指系统时间和网络时间服务器之间的同步。
4. NTP通信协议
NTP(Network Time Protocol)是通过网络来同步时间的一种TCP/IP协议。通常客户端向服务器请求当前的时间,并根据返回结果来设置系统时钟。
那如果Client到Server的网络通讯时间过长怎么办?例如:本地机器到国外的NTP Server主机进行时间同步请求,国外NTP Server收到请求后,就发送当时的正确时间回来,不过,本地机器接收到时间时可能已经延迟10秒钟了!这样一来,本地机器校正的时间是10秒钟前的标准时间,网络延迟导致了时间同步延迟的问题。
为了解决这些延迟的问题,NTP进程会自动计算时间传送过程的误差,以更准确的校准自己的时间,同时以master/slave的架构来提供网络校时。所谓的master/slave就有点类似DNS的系统。举例来说,国内的标准时间服务器去国际标准时间服务器校时,各个省市再到国内的标准时间服务器校时,最后我们再到各省市的标准时间服务器校时。这样分层的结构有效缓解了网络压力,解决负载均衡问题。当架设一部NTP时间服务器,如果这部NTP向上要求同步化的那部主机为stratum-1,那么你的NTP就是stratum-2。举例来说,如果我们的NTP是向0.europe.pool.ntp.org这部stratum-2的主机要求时间同步化,那我们的主机即为stratum-3,如果还有其他的NTP主机向我们要求时间同步,那么该部主机则会是stratum-4。这样的sratum最多可达15个阶层。如此一来,国家单位的时间服务器负载才不会太大,而我们的Client也可以很快速的达到校时的目的。
一般来说,我们在进行NTP主机的设定时,都会先选择多部上层的时间Server来做为我们这一部NTP Server的校正之用,选择多部的原因是可以避免某个时间服务器突然挂掉时,其他主机仍然可以提供NTP主机校时服务。
5. NTP时间同步
NTP程序既是server也是client,安装完NTP后,本机既可以通过网络来校准时间,也可以作为其他机器的时间服务器。NTP的守护进程 ntpd 会计算你的系统时钟的时间偏移量并且持续的进行调整,所以不会出现时间差距较大的更正,比如说,不会导致不连续的日志。
关于NTP服务器的安装,根据不同版本安装方法也不同。RedHat系统可以使用yum安装,Ubuntu系列可以使用apt-get安装。
# Centos/RedHat
# yum install ntp
# Ubuntu
# apt-get install ntp
配置/etc/ntp.conf
该/etc/ntp.conf文件是NTP服务器的主要设定文件。
# vim /etc/ntp.conf
# 1.先处理权限方面的问题,包括放行上层服务器以及开放局域网用户来源:
restrict default kod nomodify notrap nopeer noquery <==拒绝IPv4的用户
restrict -6 default kod nomodify notrap nopeer noquery <==拒绝IPv6的用户
restrict 220.130.158.71 <==放行tock.stdtime.gov.tw进入本NTP伺服器
restrict 59.124.196.83 <==放行tick.stdtime.gov. tw进入本NTP伺服器
restrict 127.0.0.1 <==底下两个是预设值,放行本机来源
restrict -6 ::1
restrict 192.168.100.0 mask 255.255.255.0 nomodify <==放行局域网来源
# 2.设定主机来源,请先将原本的[0|1|2].centos.pool.ntp.org的设定注解掉:
server 220.130.158.71 prefer <==以这部主机为最优先
server 59.124.196.83
server 59.124.196.84
# 3.预设时间差异分析档案与暂不用到的keys 等,不需要更动它:
driftfile /var/lib/ntp/drift
#fudge 127.127.22.1 flag3 1
#broadcast 192.168.123.255
各个关键字参数的作用为:
1)利用 restrict 来管理权限控制
在 ntp.conf 文件中可以利用restrict来控管权限,这个参数的设定方式为:
restrict [IP] mask [netmask_IP] [parameter]
其中 parameter 的参数主要有底下这些:
ignore:拒绝所有类型的 NTP 联机;
nomodify:客户端不能使用 ntpc 与 ntpq 这两支程序来修改服务器的时间参数, 但客户端仍可透过这部主机来进行网络校时的;
noquery:客户端不能够使用 ntpq, ntpc 等指令来查询时间服务器,等于不提供 NTP 的网络校时;
notrap:不提供 trap 这个远程事件登录 (remote event logging) 的功能。
notrust:拒绝没有认证的客户端。
如果你没有在 parameter 的地方加上任何参数的话,这表示该IP或网段不受任何限制。一般来说,我们可以先关闭 NTP 的权限,然后再一个一个的启用允许登入的网段。
2)配置上层server
利用 server 关键字设定上层 NTP 服务器,上层 NTP 服务器的设定方式为:
server [IP or hostname] [prefer]
在 server 后端可以接 IP 或主机名,perfer 表示优先使用的服务器。
3)driftfile记录时间差异
指定了用来保存系统时钟频率偏差的文件。 ntpd程序使用它来自动地补偿时钟的自然漂移, 从而使时钟即使在切断了外来时源的情况下, 仍能保持相当的准确度。另外,driftfile 选项也保存上一次响应所使用的 NTP 服务器的信息。 这个文件包含了 NTP 的内部信息, 它不应被任何其他进程修改。
fudge可以指定本地NTP Server的层级,如fudge 127.0.0.1 stratum 9
broadcast网段子网掩码指定NTP进行时间广播的网段,如broadcast 192.168.1.255
logfile可以指定NTP Server日志文件。
可以根据自己网络防火墙需求和上层时间服务器地址来更改/etc/ntp.conf文件,更改好配置文件后,下面准备来启动NTP 服务。
启动NTP**服务**
对于Ubuntu/Centos系统,使用systemctl来管理ntp服务,不过service名略微不同。
对于Centos系统
# systemctl start ntpd
# systemctl status ntpd
对于Ubuntu系统
# systemctl start ntp
# systemctl status ntp
查看ntp启动端口
# netstat -tlunp | grep ntp #主要udp协议,占用123端口
那要如何确认NTP服务器有顺利的更新时间呢?可以使用底下几个指令来查看。
# ntpstat
synchronised to NTP server (84.16.73.33) at stratum 2
time correct to within 154 ms
polling server every 1024 s
ntpstat这个指令可以列出我们的NTP服务器是否有跟上层连线。由上述的输出结果可以知道,时间有校正约154毫秒,且每隔1024 秒会主动去更新时间。
# ntpq -p
这个ntpq -p可以列出目前我们的NTP与相关的上层NTP的状态,上面几个栏位的意义为:
remote:是NTP主机的IP或主机名称;
如果有『*』代表目前正在使用的上层NTP;
如果是『+』代表也有连上线,而且可作为下一个提供时间更新的候选者;
refid:参考的上一层NTP主机的位址;
st:就是stratum阶层;
when:几秒钟前曾经做过时间同步化更新的动作;
poll:下一次更新在几秒钟之后;
reach:已经向上层NTP伺服器要求更新的次数;
delay:网络传输过程当中延迟的时间,单位为毫秒;
offset:时间补偿的结果,单位毫秒;
jitter:Linux系统时间与BIOS硬体时间的差异时间,单位为毫秒;
要让你的NTP Server/Client 真的能运作,需要注意以下几点:
1)上述的ntpstat 以及ntpq -p 的输出结果中,你的NTP 服务器真的要能够连结上层NTP才行,否则用户端将无法对NTP服务器进行同步更新。(重要)
2)NTP Client时间不可与上层server差异太多,否则上层server不会将时间传回NTP Client,遇到这种情况,可以先使用date -s手动设置与上层服务器近似的系统时间。
3)检查防火墙是否打开UDP 123端口。
6. 同步硬件时间
NTP服务,默认只会同步系统时间。如果想要让NTP同时同步硬件时间,可以修改ntpd的配置文件。对于Centos系统来说为/etc/sysconfig/ntpd文件,对于Ubuntu是/etc/default/ntp文件,在配置文件中添加 SYNC_HWCLOCK=yes行,就可以让硬件时间与系统时间一起同步。
# vim /etc/sysconfig/ntpd #Centos系统
# vim /etc/default/ntp #Ubuntu系统
OPTIONS="-g"
SYNC_HWCLOCK=yes
# 重启ntp服务
# systemctl daemon-reload
# systemctl restart ntp
7. Ubuntu 16.04**及更高版本的时间同步**
在Ubuntu 16.04及更高版本中,老旧的ntpdate及ntpd已被弃用,现在默认安装timedatectl。timedatectl 会在系统启动的时候会立刻同步硬件时间,并在稍后网络连接激活后通过socket连接时间服务器校准系统时间。
同样,timesyncd服务也替代了ntpd的客户端的工作。timesyncd是基于 systemd 的时间服务,它会定期向ntp.ubuntu.com时间服务器发起请求并进行时间同步。它还会在本地存储更新的时间,以便在系统重启时做时间调整。
我们可以通过 timedatectl 和 timesyncd查看当前时间状态和设置时间同步。
timedatectl status命令含义如下:
Local time: 本地时间,即所在时区的系统时间(CST中国标准时间)。
Universal time: 国际时间UTC。
RTC time: 硬件时间。
Time zone: 时区
System clock synchronized: 系统时钟是否与互联网服务器同步。
systemd-timesyncd.service active: timesyncd.service是否处于活动状态。
RTC in local TZ: 硬件时间是否在本地时区。
下面是timedatectl可以执行的命令:
查看或设置时区:
# timedatectl list-timezones
# timedatectl set-timezone <timezone>
在系统上启用NTP服务:
# timedatectl set-ntp true
# 如果要禁用它,只需使用false代替true。
如果你执行timedatectl set-ntp true后, System clock synchronized: 值仍为 no,那么 timesyncd 服务可能处于非活动状态。需要重启服务并看下是否正常。
# systemctl restart systemd-timesyncd.service
# systemctl status systemd-timesyncd
# timedatectl set-ntp true
这样,在ubuntu上使用timedatectl即可同时同步系统时钟和硬件时钟。
8. 参考链接
http://linux.vbird.org/linux_server/0440ntp.php
http://manpages.ubuntu.com/manpages/xenial/man1/timedatectl.1.html
http://manpages.ubuntu.com/manpages/xenial/man8/hwclock.8.html
https://blog.csdn.net/iloli/article/details/6431757
还没有评论,来说两句吧...