zoukankan      html  css  js  c++  java
  • ntp服务的细节全解析

    在linux里设置NTP服务并不难,但是NTP本身确是一个很复杂的协议. 你都了解细节么?

    1. 时间和时区

    date命令可显示时间与市区

    [root@T_PV1_DB ~]# date

    Tue Feb  7 16:32:16 CST 2017

    [root@T_PV1_DB ~]# cat /etc/sysconfig/clock

    ZONE="Asia/Shanghai"

    CST=true

    在地球环绕太阳旋转的24个小时中,世界各地日出日落的时间是不一样的.所以我们才有划分时区(timezone) 的必要,也就是把全球划分成24个不同的时区. 所以我们可以把时间的定义理解为一个时间的值加上所在地的时区(注意这个所在地可以精确到城市)

    格林威治时间(GMT), 它也就是0时区时间. 但是我们在计算机中经常看到的是UTC. 它是Coordinated Universal Time的简写. 虽然可以认为UTC和GMT的值相等(误差相当之小),但是UTC已经被认定为是国际标准,所以我们都应该遵守标准只使用UTC

    那么假如现在中国当地的时间是晚上8点的话,我们可以有下面两种表示方式
    20:00 CST
    12:00 UTC

    这里的CST是Chinese Standard Time,也就是我们通常所说的北京时间了. 因为中国处在UTC+8时区

    如果时区设置错了,你看到的日志时间也不正确了。

    补充:

    CST同时可以代表如下 4 个不同的时区:

    Central Standard Time (USA) UT-6:00

    Central Standard Time (Australia) UT+9:30

    China Standard Time UT+8:00

    Cuba Standard Time UT-4:00

    可见,CST可以同时表示美国,澳大利亚,中国,古巴四个国家的标准时间。

    2、ntp的配置

    1. #cat  /etc/ntp.conf  

    2. restrict default kod nomodify notrap nopeer noquery 

    3. restrict -6 default kod nomodify notrap nopeer noquery 

    4. restrict 11.107.13.100                         //允许该NTP服务器进入

    5. restrict 11.80.81.1                            //没有任何何參數的話,這表示『该IP或网段不受任何限制』

    6. restrict 202.112.1.199 

    7. restrict 127.0.0.1  

    8. restrict -6 ::1 

    9. restrict 192.168.0.0 mask 255.255.0.0 nomodify  //该网段可以进行校时

    10. restrict 0.0.0.0 mask 0.0.0.0 notrust           //拒绝没有认证的用户端

    11. server time-nw.nist.gov prefer                  //prefer 该服务器优先

    12. server 0.rhel.pool.ntp.org  iburst        //设定时间服务器

    13. server 1.rhel.pool.ntp.org  iburst

    14. server 2.rhel.pool.ntp.org  iburst

    15. fudge   127.127.1.0 stratum 6  

    16. driftfile /var/lib/ntp/drift 

    17. keys /etc/ntp/keys 

    18. broadcastdelay 0.008

    上边只是简单设置,没有考虑安全方面如认证等等。

    权限管理使用 restrict 公式如下:
    restrict IP mask [参数] / restrict 192.168.0.0 mask 255.255.0.0 nomodify

    其中参数主要有底下这些:

        * ignore:拒绝所有类型的NTP的连线;
        * nomodfiy:用户端不能使用NTPC与ntpq这两支程式来修改伺服器的时间参数,但使用者端仍可透过这部主机来进行网路校时的;
        * noquery:用户端不能够使用ntpq,NTPC等指令来查询发表伺服器,等于不提供的NTP的网路校时幂;
        * notrap:不提供陷阱这个远端事件邮箱(远程事件日志)的功能。
        * notrust:拒绝没有认证的用户端。

    配置文件中的driftfile是什么?
    我们每一个system clock的频率都有小小的误差,这个就是为什么机器运行一段时间后会不精确. NTP会自动来监测我们时钟的误差值并予以调整.但问题是这是一个冗长的过程,所以它会把记录下来的误差先写入driftfile.这样即使你重新开机以后之前的计算结果也就不会丢失了。

     

    最后,别忘了启动NTP服务器

    /etc/init.d/ntp start

    [root@localhost ~]# chkconfig ntpd on #在运行级别2、3、4、5上设置为自动运行

    [root@localhost ~]# chkconfig --list ntpd

    ntpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

    查看ntp服务器有无和上层ntp连通

    [root@localhost ~]# ntpstat
    synchronised to NTP server (192.168.7.49) at stratum 6
       time correct to within 440 ms
       polling server every 128 s
    [root@localhost ~]#

    查看ntp服务器与上层ntp的状态

    [root@localhost ~]# watch ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
     192.168.7.49    192.168.7.50     5 u   13   64    3    5.853  1137178   2.696

    3、ntpd的配置

    配置/etc/sysconfig/ntpd文件

    ntp服务,默认只会同步系统时间。如果想要让ntp同时同步硬件时间,可以设置/etc/sysconfig/ntpd文件,在/etc/sysconfig/ntpd文件中,添加 SYNC_HWCLOCK=yes 这样,就可以让硬件时间与系统时间一起同步。

    #允许BIOS与系统时间同步,也可以通过hwclock -w 命令

    SYNC_HWCLOCK=yes

    # Drop root to id 'ntp:ntp' by default.

    OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid -g"

    有时会在messages日志里看到NTP进程正在做DELETING动作,不过NTP进程并不会真正删除虚拟网络接口,但这个动作会造成网络短暂不通。红帽官方有个对应的解决办法是:

    就是在这个文件里增加-L参数。

    还有-x和-g参数:

    ntpd服务的方式,又有两种策略,一种是平滑、缓慢的渐进式调整(adjusts the clock in small steps所谓的微调);一种是步进式调整(跳跃式调整)。两种策略的区别就在于,微调方式在启动NTP服务时加了个“-x”的参数,而默认的是不加“-x”参数。

     

    假如使用了-x选项,那么ntpd只做微调,不跳跃调整时间,但是要注意,-x参数的负作用:当时钟差大的时候,同步时间将花费很长的时间。-x也有一个阈值,就是600s,当系统时钟与标准时间差距大于600s时,ntpd会使用较大“步进值”的方式来调整时间,将时钟“步进”调整到正确时间。

     

    假如不使用-x选项,那么ntpd在时钟差距小于128ms时,使用微调方式调整时间,当时差大于128ms时,使用“跳跃”式调整。

     

    这两种方式都会在本地时钟与远端的NTP服务器时钟相差大于1000s时,ntpd会停止工作。在启动NTP时加了参数“-g”就可以忽略1000S的问题。

    4、时间同步

    利用crontab可以让LINUX NTP定时更新时间
    注:让linux运行ntpdate更新时间时,linux不能开启NTP服务,否则会提示端口被占用:如下
    [root@ESXI ~]# ntpdate 1.rhel.pool.ntp.org                                 
    20 May 09:34:14 ntpdate[6747]: the NTP socket is in use, exiting

    如果想定时进行时间校准,可以使用crond服务来定时执行。
    编辑 /etc/crontab 文件
    加入下面一行:

    30 8 * * * root /usr/sbin/ntpdate 192.168.0.1; /sbin/hwclock -w    #192.168.0.1是NTP服务器的IP地址
    然后重启crond服务
    service crond restart 
    这样,每天 8:30 Linux 系统就会自动的进行网络时间校准。

    如果是WINDOWS ,则需要打开windows time服务和RPC的二个服务
    如果在打开windows time 服务,时报 错误1058,进行下面操作 
    1.运行 cmd 进入命令行,然后键入
    w32tm /register  进行注册
    正确的响应为:W32Time 成功注册。

    2.如果上一步正确,用 net start "windows time" 或 net start w32time 启动服务。



    5、linux的硬件时间

    Linux硬件时间的设置

        硬件时间的设置,可以用hwclock或者clock命令。其中,clock和hwclock用法相近,只用一个就 行,只不过clock命令除了支持x86硬件体系外,还支持Alpha硬件体系。

    //查看硬件时间 可以是用 hwclock ,hwclock --show 或者 hwclock -r

    [root@localhost ~]# hwclock --show
    2008年12月12日 星期五 06时52分07秒  -0.376932 seconds

    //设置硬件时间

    [root@localhost ~]# hwclock --set --date="1/25/09 00:00" <== 月/日/年时:分:秒
    [root@localhost ~]# hwclock
    2009年01月25日 星期日 00时00分06秒  -0.870868 seconds

    几个参数和命令:

    ntpq -p显示结果中的offset

    本地时间+offset=远程时间, 因此如果offset为负数, 则本地时钟比远程快. offset值0-500,接近0是正常的。
      
    运行ntpq -c asso, 如果显示sys.peer则已经处于同步状态了.

    wKiom1iZjY2CK08jAAAh2Z8h7-k471.jpg

    使用以下命令检查ntp的版本: # ntpq -c version 

    错误问题处理

    用于收集安装,配置和应用中出现的问题

    错误1:ntpdate -u ip -> no server suitable for synchronization found

    判断:在ntp客户端用ntpdate –d serverIP查看,发现有“Server dropped: strata too high”的错误,并且显示“stratum 16”。而正常情况下stratum这个值得范围是“0~15”。

    原因:NTP server还没有和其自身或者它的server同步上。在ntp server上重新启动ntp服务后,ntp server自身或者与其server的同步的需要一个时间段,这个过程可能是5分钟,在这个时间之内在客户端运行ntpdate命令时会产生no server suitable for synchronization found的错误。

    处理:等待几分钟后,重试一般解决。

    其它造成无法成功更新的原因:
    1、客户端的日期必须要设置正确,不能超出正常时间24小时,不然会因为安全原因被拒绝更新。其次客户端的时区必须要设置好,以确保不会更新成其它时区的时间。
    2、fudge 127.127.1.0 stratum 10 如果是LINUX做为NTP服务器,stratum(层级)的值不能太大,如果要向上级NTP更新可以设成2
    3、LINUX的NTP服务器必须记得将从上级NTP更新的时间从系统时间写到硬件里去 hwclock --systohc 
         NTP一般只会同步system clock. 但是如果我们也要同步RTC(hwclock)的话那么只需要把下面的选项打开就可以了
          代码:
          # vi /etc/sysconfig/ntpd
          SYNC_HWCLOCK=yes
    4、Linux如果开启了NTP服务,则不能手动运行ntpdate更新时间(会报端口被占用),它只能根据/etc/ntp.conf 里server 字段后的服务器地址按一定时间间隔自动向上级NTP服务器更新时间。可以运行命令 ntpstat 查看每次更新间隔如:
    [root@ESXI ~]# ntpstat
    synchronised to NTP server (210.72.145.44) at stratum 2    #本NTP服务器层次为2,已向210.72.145.44 NTP同步过
       time correct to within 93 ms                                               #时间校正到相差93ms之内
       polling server every 1024 s                                                 #每1024秒会向上级NTP轮询更新一次时间

    补充:

    ntpd、ntpdate的区别

    下面是网上关于ntpd与ntpdate区别的相关资料。如下所示所示:

    使用之前得弄清楚一个问题,ntpd与ntpdate在更新时间时有什么区别。ntpd不仅仅是时间同步服务器,它还可以做客户端与标准时间服务器进行同步时间,而且是平滑同步,并非ntpdate立即同步,在生产环境中慎用ntpdate,也正如此两者不可同时运行。

    时钟的跃变,对于某些程序会导致很严重的问题。许多应用程序依赖连续的时钟——毕竟,这是一项常见的假定,即,取得的时间是线性的,一些操作,例如数据库事务,通常会地依赖这样的事实:时间不会往回跳跃。不幸的是,ntpdate调整时间的方式就是我们所说的”跃变“:在获得一个时间之后,ntpdate使用settimeofday(2)设置系统时间,这有几个非常明显的问题:

    第一,这样做不安全。ntpdate的设置依赖于ntp服务器的安全性,攻击者可以利用一些软件设计上的缺陷,拿下ntp服务器并令与其同步的服务器执行某些消耗性的任务。由于ntpdate采用的方式是跳变,跟随它的服务器无法知道是否发生了异常(时间不一样的时候,唯一的办法是以服务器为准)。

    第二,这样做不精确。一旦ntp服务器宕机,跟随它的服务器也就会无法同步时间。与此不同,ntpd不仅能够校准计算机的时间,而且能够校准计算机的时钟。

    第三,这样做不够优雅。由于是跳变,而不是使时间变快或变慢,依赖时序的程序会出错(例如,如果ntpdate发现你的时间快了,则可能会经历两个相同的时刻,对某些应用而言,这是致命的)。因而,唯一一个可以令时间发生跳变的点,是计算机刚刚启动,但还没有启动很多服务的那个时候。其余的时候,理想的做法是使用ntpd来校准时钟,而不是调整计算机时钟上的时间。

    NTPD 在和时间服务器的同步过程中,会把 BIOS 计时器的振荡频率偏差——或者说 Local Clock 的自然漂移(drift)——记录下来。这样即使网络有问题,本机仍然能维持一个相当精确的走时。

    ntpq –p 参数详解

    ntpq -p

    remote              refid                    st      t when  poll  reach     delay     offset      jitter

    ==================================================================

    *10.247.160.31 10.240.241.5     4      u 53       64   377      0.240     0.374      0.240

    remote:响应这个请求的NTP服务器的名称。

    refid:NTP服务器使用的上一级ntp服务器。

    st :remote远程服务器的级别.由于NTP是层型结构,有顶端的服务器,多层的Relay Server再到客户端.所以服务器从高到低级别可以设定为1-16.为了减缓负荷和网络堵塞,原则上应该避免直接连接到级别为1的服务器的.

    when: 上一次成功请求之后到现在的秒数。

    poll : 本地机和远程服务器多少时间进行一次同步(单位为秒).在一开始运行NTP的时候这个poll值会比较小,那样和服务器同步的频率也就增加了,可以尽快调整到正确的时间范围,之后poll值会逐渐增大,同步的频率也就会相应减小

    reach:这是一个八进制值,用来测试能否和服务器连接.每成功连接一次它的值就会增加

    delay:从本地机发送同步要求到ntp服务器的round trip time

    offset:主机通过NTP时钟同步与所同步时间源的时间偏移量,单位为毫秒(ms)。offset越接近于0,主机和ntp服务器的时间越接近

    jitter:这是一个用来做统计的值.它统计了在特定个连续的连接数里offset的分布情况.简单地说这个数值的绝对值越小,主机的时间就越精确

    转自:ntp服务的细节全解析

  • 相关阅读:
    select_related与prefetch_related
    settings源码
    Django路由系统
    Django
    Django-下载安装-配置-创建Django项目-三板斧简单使用
    前端相关知识
    xadmin后台管理
    redis数据库
    ❥git❥-----协同开发,冲突解决 合并分支(项目中使用git)
    git的基本使用
  • 原文地址:https://www.cnblogs.com/276815076/p/6397994.html
Copyright © 2011-2022 走看看