Linux NTP时间同步全解析(CentOS7环境)

Posted 毛奇志

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux NTP时间同步全解析(CentOS7环境)相关的知识,希望对你有一定的参考价值。

文章目录

一、前言

手动设置centos时间的两种方法:
1、将系统时间同步为硬件时间
2、将系统时间同步为命令入参

ntp设置centos时间的两种方法:
1、nptd (数十次同步之后缓慢生效,内置定时任务,可保长久)
2、nptdate + crontab (立即生效,需要加上crontab定时任务,方可长久)

二、不使用NTP服务器

手动设置centos时间的两种方法:
1、将系统时间同步为硬件时间
2、将系统时间同步为命令入参

首先,我们可以通过date命令查看当前时间

[root@ansible ~]# date
Mon Oct  1 00:00:01 CST 2018

这里,我们可以看到当前的时间,时区为CST时间,我们可以通过timedatectl查看当前的时区

[root@ansible ~]# timedatectl
      Local time: Wed 2018-10-24 11:19:42 CST
      Universal time: Wed 2018-10-24 03:19:42 UTC
        RTC time: Wed 2018-10-24 03:19:43
        Timezone: Asia/Shanghai (CST, +0800)
      NTP enabled: yes
      NTP synchronized: yes
      RTC in local TZ: no
      DST active: n/a

可以通过hwclock查看当前硬件时间

[root@ansible ~]# hwclock
Wed 24 Oct 2018 10:16:33 AM CST  -0.864798 seconds

方式1:通过hwclock -w 将操作系统时间同步到硬件时间

[root@ansible ~]# hwclock -w
[root@ansible ~]# hwclock
Mon 01 Oct 2018 12:01:25 AM CST  -0.956970 seconds

方式2:通过date-s手动设置系统时间

[root@ansible ~]# date -s "20181001 00:00:00"
Mon Oct  1 00:00:00 CST 2018
# 手动设置时区
timedatectl set-timezone Asia/Shanghai

三、使用NTP服务器

3.1 理论知识(NTP客户端两种方案)

写在前面:
在NTP改造的过程中,会涉及到NTP客户端设备的NTP配置的修改。不同的操作系统有不同的配置方法,在实际NTP取时的行为过程中也有些许差异,本文将重点阐述Linux centos 操作系统NTP服务的配置方法、不同配置间的差异以及其他值得我们注意的相关技术细节。

知识准备:

在NTP服务端

首先,我们知道专业的NTP设备,通过卫星同步的方式获取准确的时间。目前NTP设备可以选择同步北斗或者GPS卫星的时间,两个时间没有差异。而数据中心内的其他设备,在设备数量不大,且网络质量较好的情况下,可以直接向专业的NTP设备取时,打造扁平化的NTP架构,减少NTP层级,确保我们设备时间的准确性。

在NTP设备部署时,要注意设备天线部署的位置、天线的防雷、馈线的长度等等,这些一般由专业的厂家直接完成,博主不在这里阐述。

NTP设备获取到的时间为UTC时间,所以NTP客户端到NTP设备上取得的也是UTC时间。有关时区的设置需要在NTP客户端本地独立完成。中国所处的时区比UTC时间快8小时,也就是UTC+8,时区为CST。

在NTP客户端

针对本文重点要讲的Linux centos操作系统,要通过NTP获取时间一共有两种方式。分别是ntpdate和ntpd

ntpdate—采用这种方式,操作系统会直接发起向NTP设备的时间同步请求,操作系统的时间会直接调整到从NTP服务器获取到的准确时间。获取准确时间后,操作系统将依赖操作系统本身的运算机制计算本地时间,而不会再去进行同步。所以,有些操作系统会配合crontab,定时进行时间的同步工作。

ntpd—采用这种方式,操作系统会去尝试与NTP设备进行时间同步,当发现两者的时间偏差较大的时候,会通过多次同步过程来完成同步,而不是直接调整到位。这个过程可能会持续10几分钟,甚至更多的时间,这取决于时间偏差有多少,直到操作系统时间准确。之后操作系统会以一定的间隔向NTP设备同步时间,保持操作系统时间的同步。

我们知道有些程序—尤其是数据库在运行时依赖时间的准确性,而采用ntpdate的方式,直接将操作系统时间同步,可能会导致操作系统时间发生跃变,因此我们选择采用ntpd的方式,来同步时间。

在NTP客户端层面,除了操作系统时间以外,还有硬件时间的概念。硬件时间一般是硬件设备在出厂时设备制造地在硬件底层便设置好的,我们可以设置硬件时间与操作系统时间进行同步,确保硬件时间是我们当地的时间。

小结
NTP服务端向北斗卫星或者GPS卫星来校准时间
NTP客户端就是需要通过向NTP服务端发送请求来校准自己的时间,这里的NTP客户端就是centos机器。有
NTP客户端两种方式:ntpd服务(内置定时任务不断向NTP服务端校准) 和 ntpdate + crontab

3.2 采用ntpd的方式进行同步

3.2.1 采用ntpd的方式进行同步

首先要安装ntp服务,可以与互联网通信的话,可以通过yum进行安装

通过yum进行安装
yum -y install ntp

查看当前ntp状态

[root@ansible ~]# ntpstat
timeout

NTP设置主要涉及到两个配置文件,分别为在/etc/ntp.conf和/etc/sysconfig/ntpd

在/etc/ntp.conf设置NTP服务器

[root@ansible ~]# vi /etc/ntp.conf
server cn.pool.ntp.org prefer

上述用到的cn.pool.ntp.org为互联网上的一个提供ntp服务的网址

重启NTPD服务

[root@ansible ~]# service ntpd restart
Redirecting to /bin/systemctl restart  ntpd.service

查看当前NTP状态

[root@ansible ~]# ntpstat
unsynchronised
  time server re-starting
   polling server every 8 s

查看NTP同步情况

[root@ansible ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
192.168.126.98  .INIT.          16 u    -   64    0    0.000    0.000   0.000
dns1.synet.edu. 202.118.1.46     2 u   27   64    1   44.996  2024174   0.000

这里有几个重要参数,when代表了多少秒前进行了时间的同步;poll代表了时间同步的间隔;delay代表从客户端到NTP服务端之间的延时;offset代表了当前时间的差距。

可见当前操作系统时间与NTP服务器有较大的差距

过了一会

[root@ansible ~]# ntpstat
unsynchronised
   polling server every 64 s
[root@ansible ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
192.168.126.98  .STEP.          16 u    -   64    0    0.000    0.000   0.000
203.107.6.88    100.107.25.114   2 u   45   64    1   24.507    6.837   0.000

等待了十几分钟以后

[root@ansible ~]# ntpstat
synchronised to NTP server (203.107.6.88) at stratum 3
   time correct to within 43 ms
   polling server every 64 s
[root@ansible ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
192.168.126.98  .STEP.          16 u    -  512    0    0.000    0.000   0.000
*203.107.6.88    100.107.25.114   2 u   24   64  377   24.974   17.522   2.376

过了一会,同步成功

[root@ansible ~]# ntpstat
synchronised to NTP server (203.107.6.88) at stratum 3
   time correct to within 42 ms
   polling server every 128 s
[root@ansible ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
192.168.126.98  .STEP.          16 u    - 1024    0    0.000    0.000   0.000
*203.107.6.88    10.165.84.13     2 u  124  128  377   20.336   -5.768   3.414

3.2.2 其他ntpd参数设置

1、-g参数

查看当前ntpd的配置,系统默认使用了-g参数

[root@ansible ~]# cat /etc/sysconfig/ntpd
# Command line options for ntpd
   OPTIONS="-g"

这里解释一下-g参数,通过增加-g 可忽略本地与远端NTP服务器时钟相差大于1000s时,ntpd停止工作的问题,如果不设置-g参数,当偏差大于1000s时,ntp服务会停止,测试过程如下:

在这里我们尝试不使用 无 -g参数,查看使用效果

[root@ansible ~]# cat /etc/sysconfig/ntpd
# Command line options for ntpd
# OPTIONS="-g"

重启ntpd服务

[root@ansible ~]# service ntpd restart
Redirecting to /bin/systemctl restart  ntpd.service

查看当前ntp状态

[root@ansible ~]# ntpstat
unsynchronised
  time server re-starting
   polling server every 8 s
[root@ansible ~]# ^C
[root@ansible ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
192.168.126.98  .INIT.          16 u    -   64    0    0.000    0.000   0.000
dns1.synet.edu. 202.118.1.46     2 u   27   64    1   44.996  2024174   0.000

过一会在看

[root@ansible ~]# ntpstat
Unable to talk to NTP daemon. Is it running?
[root@ansible ~]# ntpq -p
ntpq: read: Connection refused

可见NTP服务停止。

2、-x参数

设置-x参数 操作系统在进行NTP同步时只做微调,当偏差大于600s时步进,但也不是一次到位的。

不使用-x参数 则小于128ms时微调,大于128ms步进,同样,也不是一步到位的。

centos系统默认是不带-x参数的,配置方法如下:

[root@linux_tcp_2 ~]# cat /etc/sysconfig/ntpd
# Command line options for ntpd
OPTIONS="-g -x"

-x的参数带来的差异不好模拟,没有做相关实验。

3、SYNC_HWCLOCK参数

可用该参数保持硬件时间与操作系统时间的自动同步,配制方法如下:

[root@linux_tcp_2 ~]# cat /etc/sysconfig/ntpd
# Command line options for ntpd
OPTIONS="-g"
SYNC_HWCLOCK=yes

该参数设置带来的差异,在虚拟机环境没有模拟出来。

3.3 ntpdate的使用

我们也可以通过ntpdate的方式,手动进行时间的同步,在前文已经讲到,使用这种方式同步时间,操作系统的时间会一次到位,但可能会影响应用程序的运行,需要谨慎操作,使用时需要重启NTP服务,使用效果如下:

[root@ansible ~]# date -s "20181001 00:00:00"
Mon Oct  1 00:00:00 CST 2018
[root@ansible ~]#
[root@ansible ~]#
[root@ansible ~]# date
Mon Oct  1 00:00:01 CST 2018
[root@ansible ~]# ntpdate cn.pool.ntp.org
24 Oct 13:05:00 ntpdate[3059]: step time server 34.198.99.183 offset 2034288.744837 sec
[root@ansible ~]# date
Wed Oct 24 13:05:04 CST 2018

可见,操作系统时间直接同步到了准确的时间

注意:使用 ntpdate cn.pool.ntp.org 的时候,如果报错 in is used ,需要停止 systemctl stop ntpd 服务,因为 ntpdate xxx 这条命令只有在 nptd 服务停止的时候才能使用。
注意:使用 ntpdate 域名 的时候,如果域名解析不了,name or service is unknown ,可以在 windows 上 ping 域名,得到ip,再到 centos 上使用 ntpdate ip 效果也是一样的。

最后,安装的使用,yum -y install ntp 确实是 ntp 服务,但是启动、停止、查看状态却是

systemctl restart ntpd
systemctl start ntpd
systemctl stop ntpd
systemctl status ntpd
systemctl restart ntpdate
systemctl start ntpdate
systemctl stop ntpdate
systemctl status ntpdate

四、尾声

至此,我将目前所掌握的NTP配制方法和相关参数带来的差异在前文中进行了讲述,并做了相关的实验。除了配制方法以外,我们应该能够熟练地使用ntpstat命令和ntpq -p命令,查看当前ntp同步的状态。希望以上内容能够对大家有所帮助。除了上文讲到的参数以外,在操作系统中,应该还有许多其他NTP参数可以进行设置,以后工作中有需要再去研究吧~

参考资料:《Linux centos NTP的配置方法》—那些你应该知道的知识(五)
参考资料:内网时间同步,ntp与ntpdate区别,与ntp服务器搭建
参考资料:常见报错_NTP同步常见报错之no server suitable for synchrnization found
参考资料:解决 CentOS 7中同步集群时间报 no server suitable for synchronization found

以上是关于Linux NTP时间同步全解析(CentOS7环境)的主要内容,如果未能解决你的问题,请参考以下文章

Linux杂记-配置ntp时间同步服务

【ntpdate】CentOS7.x上使用ntpdate同步ntp服务器

使用NTP进行CentOS7时间同步

Linux配置NTP时间同步

CentOS7-ntp时间同步服务器

linux 的常用命令---------第十四阶段(ntp时间同步管理器与DNS域名解析服务)